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
Memutar Audio dengan MediaPlayer – Menggunakan kelas bawaan
MediaPlayer
untuk memutar audio, termasuk file audio lokal dan file audio yang dialirkan denganAudioTrack
kelas .Merekam Audio – Menggunakan kelas bawaan
MediaRecorder
untuk merekam audio.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.
Bekerja dengan Audio Tingkat Rendah – Memutar audio menggunakan
AudioTrack
kelas dengan menulis langsung ke buffer memori. Merekam audio menggunakanAudioRecord
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:
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:
Buat instans objek MediaPlayer baru.
Konfigurasikan file untuk diputar melalui metode SetDataSource .
Panggil metode Siapkan untuk menginisialisasi pemutar.
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 . MediaPlayer
Seperti , 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:
Membuat instans objek MediaRecorder baru.
Tentukan perangkat keras mana yang akan digunakan untuk mengambil input audio melalui metode SetAudioSource .
Atur format audio file output menggunakan metode SetOutputFormat . Untuk daftar jenis audio yang didukung, lihat Format Media yang Didukung Android.
Panggil metode SetAudioEncoder untuk mengatur jenis pengodean audio.
Panggil metode SetOutputFile untuk menentukan nama file output tempat data audio ditulis.
Panggil metode Siapkan untuk menginisialisasi perekam.
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:
Dapatkan handel ke
AudioManager
layanan sistem.Buat instans kelas panggilan balik.
Minta sumber daya audio perangkat dengan memanggil
RequestAudioFocus
metode padaAudioManager
. 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).Jika permintaan diberikan,
playMusic
metode segera dipanggil, dan audio mulai diputar kembali.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:
Saat memutar dari file audio terenkripsi.
Saat memutar berturut-turut klip pendek.
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:
Jenis streaming – Suara, nada dering, musik, sistem, atau alarm.
Frekuensi – Tingkat pengambilan sampel yang dinyatakan dalam Hz.
Konfigurasi Saluran – Mono atau stereo.
Format audio – Pengodean 8 bit atau 16 bit.
Ukuran buffer – dalam byte.
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 AudioTrack
mana argumen sebagian besar enumerasi, argumen yang setara di AudioRecord
adalah bilangan bulat. Ini termasuk:
Sumber input audio perangkat keras seperti mikrofon.
Jenis streaming – Suara, nada dering, musik, sistem, atau alarm.
Frekuensi – Tingkat pengambilan sampel yang dinyatakan dalam Hz.
Konfigurasi Saluran – Mono atau stereo.
Format audio – Pengodean 8 bit atau 16 bit.
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.