Bagikan melalui


Android Audio

OS Android menyediakan dukungan ekstensif untuk multimedia, mencakup audio dan video. Panduan ini berfokus pada audio di Android dan mencakup pemutaran dan perekaman audio menggunakan pemutar audio bawaan dan kelas perekam, serta API audio tingkat rendah. Ini juga mencakup bekerja dengan peristiwa Audio yang disiarkan oleh aplikasi lain, sehingga pengembang dapat membangun aplikasi yang ber perilaku baik.

Gambaran Umum

Perangkat seluler modern telah mengadopsi fungsionalitas yang sebelumnya akan membutuhkan peralatan khusus - kamera, pemutar musik, dan perekam video. Karena itu, kerangka kerja multimedia telah menjadi fitur kelas satu di API seluler.

Android menyediakan dukungan ekstensif untuk multimedia. Artikel ini memeriksa bekerja dengan audio di Android, dan membahas topik berikut

  1. Memutar Audio dengan MediaPlayer – Menggunakan kelas bawaan MediaPlayer untuk memutar audio, termasuk file audio lokal dan file audio yang dialirkan dengan AudioTrack kelas .

  2. Merekam Audio – Menggunakan kelas bawaan MediaRecorder untuk merekam audio.

  3. Bekerja dengan Pemberitahuan Audio – Menggunakan pemberitahuan audio untuk membuat aplikasi yang berkinerja baik yang merespons peristiwa dengan benar (seperti panggilan telepon masuk) dengan menangguhkan atau membatalkan output audio mereka.

  4. Bekerja dengan Audio Tingkat Rendah – Memutar audio menggunakan AudioTrack kelas dengan menulis langsung ke buffer memori. Merekam audio menggunakan AudioRecord kelas dan membaca langsung dari buffer memori.

Persyaratan

Panduan ini memerlukan Android 2.0 (API level 5) atau yang lebih tinggi. Harap dicatat bahwa men-debug audio di Android harus dilakukan pada perangkat.

Anda perlu meminta RECORD_AUDIO izin dalam AndroidManifest.XML:

Bagian izin yang diperlukan dari Manifes Android dengan RECORD_AUDIO diaktifkan

Memutar Audio dengan Kelas MediaPlayer

Cara paling sederhana untuk memutar audio di Android adalah dengan kelas MediaPlayer bawaan. MediaPlayer dapat memutar file lokal atau jarak jauh dengan meneruskan jalur file. Namun, MediaPlayer sangat sensitif terhadap status dan memanggil salah satu metodenya dalam keadaan yang salah akan menyebabkan pengecualian dilemparkan. Penting untuk berinteraksi dalam MediaPlayer urutan yang dijelaskan di bawah ini untuk menghindari kesalahan.

Menginisialisasi dan Memutar

Memutar audio dengan MediaPlayer memerlukan urutan berikut:

  1. Buat instans objek MediaPlayer baru.

  2. Konfigurasikan file untuk diputar melalui metode SetDataSource .

  3. Panggil metode Siapkan untuk menginisialisasi pemutar.

  4. Panggil metode Mulai untuk memulai pemutaran audio.

Sampel kode di bawah ini mengilustrasikan penggunaan ini:

protected MediaPlayer player;
public void StartPlayer(String  filePath)
{
  if (player == null) {
    player = new MediaPlayer();
  } else {
    player.Reset();
    player.SetDataSource(filePath);
    player.Prepare();
    player.Start();
  }
}

Menangguhkan dan Melanjutkan Pemutaran

Pemutaran dapat ditangguhkan dengan memanggil metode Jeda :

player.Pause();

Untuk melanjutkan pemutaran yang dijeda, panggil metode Mulai . Ini akan dilanjutkan dari lokasi yang dijeda di pemutaran:

player.Start();

Memanggil metode Stop pada pemutar mengakhiri pemutaran yang sedang berlangsung:

player.Stop();

Ketika pemutar tidak lagi diperlukan, sumber daya harus dirilis dengan memanggil metode Rilis :

player.Release();

Menggunakan Kelas MediaRecorder untuk Merekam Audio

Corollary untuk MediaPlayer merekam audio di Android adalah kelas MediaRecorder . MediaPlayerSeperti , ini peka terhadap status dan transisi melalui beberapa status untuk sampai ke titik di mana ia dapat mulai merekam. Untuk merekam audio, RECORD_AUDIO izin harus diatur. Untuk petunjuk tentang cara mengatur izin aplikasi, lihat Bekerja dengan AndroidManifest.xml.

Inisialisasi dan Perekaman

Merekam audio dengan MediaRecorder memerlukan langkah-langkah berikut:

  1. Membuat instans objek MediaRecorder baru.

  2. Tentukan perangkat keras mana yang akan digunakan untuk mengambil input audio melalui metode SetAudioSource .

  3. Atur format audio file output menggunakan metode SetOutputFormat . Untuk daftar jenis audio yang didukung, lihat Format Media yang Didukung Android.

  4. Panggil metode SetAudioEncoder untuk mengatur jenis pengodean audio.

  5. Panggil metode SetOutputFile untuk menentukan nama file output tempat data audio ditulis.

  6. Panggil metode Siapkan untuk menginisialisasi perekam.

  7. Panggil metode Mulai untuk mulai merekam.

Sampel kode berikut mengilustrasikan urutan ini:

protected MediaRecorder recorder;
void RecordAudio (String filePath)
{
  try {
    if (File.Exists (filePath)) {
      File.Delete (filePath);
    }
    if (recorder == null) {
      recorder = new MediaRecorder (); // Initial state.
    } else {
      recorder.Reset ();
      recorder.SetAudioSource (AudioSource.Mic);
      recorder.SetOutputFormat (OutputFormat.ThreeGpp);
      recorder.SetAudioEncoder (AudioEncoder.AmrNb);
      // Initialized state.
      recorder.SetOutputFile (filePath);
      // DataSourceConfigured state.
      recorder.Prepare (); // Prepared state
      recorder.Start (); // Recording state.
    }
  } catch (Exception ex) {
    Console.Out.WriteLine( ex.StackTrace);
  }
}

Menghentikan perekaman

Untuk menghentikan perekaman, panggil Stop metode pada MediaRecorder:

recorder.Stop();

Membersihkan

MediaRecorder Setelah dihentikan, panggil metode Reset untuk memasukkannya kembali ke status diamnya:

recorder.Reset();

MediaRecorder Ketika tidak lagi diperlukan, sumber dayanya harus dirilis dengan memanggil metode Rilis:

recorder.Release();

Mengelola Pemberitahuan Audio

Kelas AudioManager

Kelas AudioManager menyediakan akses ke pemberitahuan audio yang memberi tahu aplikasi saat peristiwa audio terjadi. Layanan ini juga menyediakan akses ke fitur audio lainnya, seperti kontrol mode volume dan dering. memungkinkan AudioManager aplikasi untuk menangani pemberitahuan audio untuk mengontrol pemutaran audio.

Mengelola Fokus Audio

Sumber daya audio perangkat (pemutar dan perekam bawaan) dibagikan oleh semua aplikasi yang sedang berjalan.

Secara konseptual, ini mirip dengan aplikasi di komputer desktop di mana hanya satu aplikasi yang memiliki fokus keyboard: setelah memilih salah satu aplikasi yang sedang berjalan dengan mengklik mouse, input keyboard hanya masuk ke aplikasi tersebut.

Fokus audio adalah ide serupa dan mencegah lebih dari satu aplikasi memutar atau merekam audio secara bersamaan. Ini lebih rumit daripada fokus keyboard karena bersifat sukarela - aplikasi dapat mengabaikan fakta bahwa saat ini tidak memiliki fokus audio dan bermain terlepas dari itu - dan karena ada berbagai jenis fokus audio yang dapat diminta. Misalnya, jika pemohon hanya diharapkan untuk memutar audio untuk waktu yang sangat singkat, pemohon mungkin meminta fokus sementara.

Fokus audio dapat segera diberikan, atau awalnya ditolak dan diberikan nanti. Misalnya, jika aplikasi meminta fokus audio selama panggilan telepon, aplikasi akan ditolak, tetapi fokus mungkin diberikan setelah panggilan telepon selesai. Dalam hal ini, pendengar terdaftar untuk merespons jika fokus audio diambil. Meminta fokus audio digunakan untuk menentukan apakah tidak masalah untuk memutar atau merekam audio.

Untuk informasi selengkapnya tentang fokus audio, lihat Mengelola Fokus Audio.

Mendaftarkan Callback untuk Fokus Audio

Mendaftarkan FocusChangeListener panggilan balik dari IOnAudioChangeListener adalah bagian penting untuk mendapatkan dan melepaskan fokus audio. Ini karena pemberian fokus audio dapat ditangguhkan sampai nanti. Misalnya, aplikasi dapat meminta untuk memutar musik saat ada panggilan telepon yang sedang berlangsung. Fokus audio tidak akan diberikan sampai panggilan telepon selesai.

Untuk alasan ini, objek panggilan balik diteruskan sebagai parameter ke dalam GetAudioFocus metode AudioManager, dan panggilan inilah yang mendaftarkan panggilan balik. Jika fokus audio awalnya ditolak tetapi kemudian diberikan, aplikasi diinformasikan dengan memanggil OnAudioFocusChange panggilan balik. Metode yang sama digunakan untuk memberi tahu aplikasi bahwa fokus audio sedang diambil.

Ketika aplikasi telah selesai menggunakan sumber daya audio, aplikasi memanggil AbandonFocus metode AudioManager, dan kembali meneruskan panggilan balik. Tindakan ini membatalkan panggilan balik dan merilis sumber daya audio, sehingga aplikasi lain dapat memperoleh fokus audio.

Meminta Fokus Audio

Langkah-langkah yang diperlukan untuk meminta sumber daya audio perangkat adalah sebagai berikut:

  1. Dapatkan handel ke AudioManager layanan sistem.

  2. Buat instans kelas panggilan balik.

  3. Minta sumber daya audio perangkat dengan memanggil RequestAudioFocus metode pada AudioManager . Parameternya adalah objek panggilan balik, jenis aliran (musik, panggilan suara, dering, dll.) dan jenis hak akses yang diminta (sumber daya audio dapat diminta sesaat atau untuk periode yang tidak terbatas, misalnya).

  4. Jika permintaan diberikan, playMusic metode segera dipanggil, dan audio mulai diputar kembali.

  5. Jika permintaan ditolak, tidak ada tindakan lebih lanjut yang diambil. Dalam hal ini, audio hanya akan diputar jika permintaan diberikan di lain waktu.

Sampel kode di bawah ini menunjukkan langkah-langkah berikut:

Boolean RequestAudioResources(INotificationReceiver parent)
{
  AudioManager audioMan = (AudioManager) GetSystemService(Context.AudioService);
  AudioManager.IOnAudioFocusChangeListener listener  = new MyAudioListener(this);
  var ret = audioMan.RequestAudioFocus (listener, Stream.Music, AudioFocus.Gain );
  if (ret == AudioFocusRequest.Granted) {
    playMusic();
    return (true);
  } else if (ret == AudioFocusRequest.Failed) {
    return (false);
  }
  return (false);
}

Merilis Fokus Audio

Ketika pemutaran trek selesai, AbandonFocus metode dipanggil AudioManager . Ini memungkinkan aplikasi lain untuk mendapatkan sumber daya audio perangkat. Aplikasi lain akan menerima pemberitahuan tentang perubahan fokus audio ini jika mereka telah mendaftarkan pendengar mereka sendiri.

API Audio Tingkat Rendah

API audio tingkat rendah memberikan kontrol yang lebih besar atas pemutaran dan perekaman audio karena berinteraksi langsung dengan buffer memori alih-alih menggunakan URI file. Ada beberapa skenario di mana pendekatan ini lebih disukai. Skenario tersebut meliputi:

  1. Saat memutar dari file audio terenkripsi.

  2. Saat memutar berturut-turut klip pendek.

  3. Streaming audio.

Kelas AudioTrack

Kelas AudioTrack menggunakan API audio tingkat rendah untuk perekaman, dan setara dengan MediaPlayer kelas tingkat rendah.

Menginisialisasi dan Memutar

Untuk memutar audio, instans AudioTrack baru harus dibuat. Daftar argumen yang diteruskan ke konstruktor menentukan cara memutar sampel audio yang terkandung dalam buffer. Argumennya adalah:

  1. Jenis streaming – Suara, nada dering, musik, sistem, atau alarm.

  2. Frekuensi – Tingkat pengambilan sampel yang dinyatakan dalam Hz.

  3. Konfigurasi Saluran – Mono atau stereo.

  4. Format audio – Pengodean 8 bit atau 16 bit.

  5. Ukuran buffer – dalam byte.

  6. Mode buffer – streaming atau statis.

Setelah konstruksi, metode AudioTrack Play dipanggil, untuk mengaturnya untuk mulai bermain. Menulis buffer audio ke AudioTrack mulai pemutaran:

void PlayAudioTrack(byte[] audioBuffer)
{
  AudioTrack audioTrack = new AudioTrack(
    // Stream type
    Stream.Music,
    // Frequency
    11025,
    // Mono or stereo
    ChannelOut.Mono,
    // Audio encoding
    Android.Media.Encoding.Pcm16bit,
    // Length of the audio clip.
    audioBuffer.Length,
    // Mode. Stream or static.
    AudioTrackMode.Stream);

    audioTrack.Play();
    audioTrack.Write(audioBuffer, 0, audioBuffer.Length);
}

Menjeda dan Menghentikan Pemutaran

Panggil metode Jeda untuk menjeda pemutaran:

audioTrack.Pause();

Memanggil metode Stop akan mengakhiri pemutaran secara permanen:

audioTrack.Stop();

Pembersihan

AudioTrack Ketika tidak lagi diperlukan, sumber dayanya harus dirilis dengan memanggil Rilis:

audioTrack.Release();

Kelas AudioRecord

Kelas AudioRecord setara AudioTrack dengan di sisi rekaman. Seperti AudioTrack, ia menggunakan buffer memori secara langsung, sebagai pengganti file dan URI. Ini mengharuskan RECORD_AUDIO izin diatur dalam manifes.

Inisialisasi dan Perekaman

Langkah pertama adalah membuat objek AudioRecord baru. Daftar argumen yang diteruskan ke konstruktor menyediakan semua informasi yang diperlukan untuk perekaman. Tidak seperti di , di AudioTrackmana argumen sebagian besar enumerasi, argumen yang setara di AudioRecord adalah bilangan bulat. Ini termasuk:

  1. Sumber input audio perangkat keras seperti mikrofon.

  2. Jenis streaming – Suara, nada dering, musik, sistem, atau alarm.

  3. Frekuensi – Tingkat pengambilan sampel yang dinyatakan dalam Hz.

  4. Konfigurasi Saluran – Mono atau stereo.

  5. Format audio – Pengodean 8 bit atau 16 bit.

  6. Byte ukuran buffer

AudioRecord Setelah dibangun, metode StartRecording-nya dipanggil. Sekarang siap untuk mulai merekam. terus AudioRecord membaca buffer audio untuk input, dan menulis input ini ke file audio.

void RecordAudio()
{
  byte[] audioBuffer = new byte[100000];
  var audRecorder = new AudioRecord(
    // Hardware source of recording.
    AudioSource.Mic,
    // Frequency
    11025,
    // Mono or stereo
    ChannelIn.Mono,
    // Audio encoding
    Android.Media.Encoding.Pcm16bit,
    // Length of the audio clip.
    audioBuffer.Length
  );
  audRecorder.StartRecording();
  while (true) {
    try
    {
      // Keep reading the buffer while there is audio input.
      audRecorder.Read(audioBuffer, 0, audioBuffer.Length);
      // Write out the audio file.
    } catch (Exception ex) {
      Console.Out.WriteLine(ex.Message);
      break;
    }
  }
}

Menghentikan Perekaman

Memanggil metode Hentikan mengakhiri perekaman:

audRecorder.Stop();

Pembersihan

AudioRecord Ketika objek tidak lagi diperlukan, memanggil metode Rilis-nya merilis semua sumber daya yang terkait dengannya:

audRecorder.Release();

Ringkasan

OS Android menyediakan kerangka kerja yang kuat untuk memutar, merekam, dan mengelola audio. Artikel ini membahas cara memutar dan merekam audio menggunakan kelas dan MediaRecorder tingkat MediaPlayer tinggi. Selanjutnya, ia menjelajahi cara menggunakan pemberitahuan audio untuk berbagi sumber daya audio perangkat di antara aplikasi yang berbeda. Akhirnya, ia berurusan dengan cara memutar dan merekam audio menggunakan API tingkat rendah, yang antarmukanya langsung dengan buffer memori.