Android Ses
Android işletim sistemi, ses ve videoyu kapsayan multimedya için kapsamlı destek sağlar. Bu kılavuz, Android'de sese odaklanır ve yerleşik ses oynatıcı ve kaydedici sınıflarını ve alt düzey ses API'sini kullanarak ses çalma ve kaydetmeyi kapsar. Ayrıca geliştiricilerin iyi davranan uygulamalar oluşturması için diğer uygulamalar tarafından yayınlanan Ses olaylarıyla çalışmayı da kapsar.
Genel Bakış
Modern mobil cihazlar, daha önce kameralar, müzik çalarlar ve video kaydediciler gibi ayrılmış ekipman parçalarına ihtiyaç olacak işlevselliği benimsedi. Bu nedenle multimedya çerçeveleri mobil API'lerde birinci sınıf bir özellik haline geldi.
Android multimedya için kapsamlı destek sağlar. Bu makale Android'de ses ile çalışmayı inceler ve aşağıdaki konuları kapsar
MediaPlayer ile Ses Çalma : Yerel ses dosyaları ve akışı yapılan ses dosyaları dahil olmak üzere ses oynatmak için yerleşik sınıfı kullanarak
AudioTracksınıfı.Ses Kaydetme: Ses kaydetmek için yerleşik sınıfını kullanma.
Ses Bildirimleriyle Çalışma – Ses çıkışlarını askıya alma veya iptal etme ile olaylara (gelen telefon çağrıları gibi) doğru şekilde yanıt veren iyi davranışa sahip uygulamalar oluşturmak için ses bildirimlerini kullanma.
Ses Low-Level Çalışma : Doğrudan bellek arabelleklere yazarak sınıfını kullanarak ses çalma. sınıfını kullanarak ses
AudioRecordkaydetme ve doğrudan bellek arabelleklerinden okuma.
Gereksinimler
Bu kılavuz için Android 2.0 (API düzeyi 5) veya daha yüksek bir sürümü gerekir. Android'de ses hata ayıklamanın bir cihazda yapılması gerektiğini lütfen unutmayın.
AndroidManifest.XML' RECORD_AUDIO içinde RECORD_AUDIO

MediaPlayer Sınıfı ile Ses Çalma
Android'de ses çalmanın en basit yolu yerleşik MediaPlayer sınıfıdır.
MediaPlayer yerel veya uzak dosyaları dosya yolunu geçerek oynatabilirsiniz. Ancak, durumlara çok duyarlıdır ve yöntemlerinden birinin yanlış durumda MediaPlayer çağrılarak bir özel durumun atılmış olması gerekir. Hatalardan kaçınmak için aşağıdaki MediaPlayer sırayla etkileşim kurmak önemlidir.
Başlatma ve Çalma
ile ses çalma MediaPlayer aşağıdaki sırayı gerektirir:
Yeni bir MediaPlayer nesnesi örneği oluşturma.
Dosyayı SetDataSource yöntemiyle oynatacak şekilde yapılandırma.
Oynatıcıyı başlatmak için Prepare yöntemini çağırma.
Sesi çalmayı başlatmak için Start yöntemini çağırma.
Aşağıdaki kod örneğinde bu kullanım gösterilmiştir:
protected MediaPlayer player;
public void StartPlayer(String filePath)
{
if (player == null) {
player = new MediaPlayer();
} else {
player.Reset();
player.SetDataSource(filePath);
player.Prepare();
player.Start();
}
}
Kayıttan Yürütmeyi Askıya Alma ve Devam Etme
Pause yöntemi çağrılarak kayıttan yürütme askıya alınabilir:
player.Pause();
Duraklatılmış kayıttan yürütmeyi devam ettirin, Start yöntemini arayın. Bu, kayıttan yürütmede duraklatılmış konumdan devam eder:
player.Start();
Oynatıcıda Stop yönteminin çağrılarak devam eden bir kayıttan yürütme sona erer:
player.Stop();
Oynatıcı artık gerekli olmadığı zaman, Release yöntemi çağrılarak kaynakların serbest bırakılası gerekir:
player.Release();
MediaRecorder Sınıfını Kullanarak Ses Kaydetme
Android'de ses MediaPlayer kaydı için kaydı MediaPlayer gibi, durum açısından duyarlıdır ve kaydı başlatan noktaya kadar çeşitli MediaPlayer eyaletler arasında geçişler sağlar. Ses kaydı için izin RECORD_AUDIO ayar gerekir. Uygulama izinlerini ayarlama yönergeleri için bkz. AndroidManifest.xml.
Başlatma ve Kayıt
ile ses kaydı MediaRecorder aşağıdaki adımları gerektirir:
Yeni bir MediaRecorder nesnesi örneği oluşturma.
SetAudioSource yöntemi aracılığıyla ses girişini yakalamak için hangi donanım aygıtının kullan kullanır olduğunu belirtin.
SetOutputFormat yöntemini kullanarak çıkış dosyası ses biçimini ayarlayın. Desteklenen ses türlerinin listesi için bkz. Android Tarafından Desteklenen Medya Biçimleri.
Ses kodlama türünü ayarlamak için SetAudioEncoder yöntemini çağırma.
Ses verilerinin yazıldığı çıkış dosyasının adını belirtmek için SetOutputFile yöntemini çağırma.
Kaydediciyi başlatmak için Prepare yöntemini çağırma.
Kaydı başlatmak için Start yöntemini çağırma.
Aşağıdaki kod örneği bu sırayı göstermektedir:
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);
}
}
Kaydı durdurma
Kaydı durdurmak için üzerinde Stop yöntemini MediaRecorder arayın:
recorder.Stop();
Temizleme
durdurulduktan MediaRecorder sonra Reset yöntemini MediaRecorder çağırarak boşta durumuna geri alın:
recorder.Reset();
artık MediaRecorder gerekli olmadığı zaman, kaynaklarının Release yöntemi çağrılarak serbest MediaRecorder gerekir:
recorder.Release();
Ses Bildirimlerini Yönetme
AudioManager Sınıfı
AudioManager sınıfı, uygulamalara ses olayları oluştuğunda haber veren ses bildirimlerine erişim sağlar. Bu hizmet ses ve ses modu denetimi gibi diğer ses özelliklerine de erişim sağlar. , AudioManager bir uygulamanın ses kayıttan yürütmeyi denetlemesi için ses bildirimlerini işlemeye olanak sağlar.
Ses Odağında Yönetimi
Cihazın ses kaynakları (yerleşik oynatıcı ve kaydedici) çalışan tüm uygulamalar tarafından paylaşılır.
Kavramsal olarak, bu, yalnızca bir uygulamanın klavye odağına sahip olduğu bir masaüstü bilgisayarda yer alan uygulamalara benzer: çalışan uygulamalardan birini fareyle tıklarsanız klavye girişi yalnızca o uygulamaya gider.
Ses odağı benzer bir fikirdir ve aynı anda birden fazla uygulamanın ses çalmasını veya kaydetmesini önler. Uygulama, isteğe bağlı olduğu için klavye odağından daha karmaşıktır. Uygulama, şu anda ne olursa olsun ses odağı ve oynatması olmadığını ve istenebilir farklı ses odağı türleri olduğundan bunu yoksayabilir. Örneğin, istekte olanın yalnızca çok kısa bir süre ses çalması bekleniyorsa, geçici bir odak isteğine sahip olabilir.
Ses odağı hemen verilmelidir veya başlangıçta reddedilir ve daha sonra bu izinler izni ve ardından erişim izni veilir. Örneğin, bir uygulama telefon çağrısı sırasında sesli odak isteğite bulundursa reddedilir, ancak telefon görüşmesi bittiğinde odak iyi bir şekilde edilebilir. Bu durumda, ses odağının alınması durumunda uygun şekilde yanıt vermek için dinleyici kaydedilir. Ses odağı isteği, ses çalmanın veya kaydetmenin uygun olup olmadığını belirlemek için kullanılır.
Ses odağı hakkında daha fazla bilgi için bkz. Ses Odağında Yönetimi.
Ses Odağı için Geri Çağırmayı Kaydetme
'den FocusChangeListener geri çağırmayı IOnAudioChangeListener kaydetmek, ses odağında yer alma ve serbest bırakmanın önemli bir kısmıdır. Bunun nedeni, ses odağı verilmesinin daha sonraya kadar ertelenmiş olmasıdır. Örneğin, bir uygulama devam eden bir telefon çağrısı varken müzik çalma isteğinde olabilir. Telefon görüşmesi bitene kadar ses odağı verilmez.
Bu nedenle, geri çağırma nesnesi yöntemine bir parametre olarak geçirildi ve geri GetAudioFocusAudioManager çağırmayı kaydeden bu çağrıdır. Ses odağı başlangıçta reddedilirse ancak daha sonra verilirse, uygulama geri çağırma OnAudioFocusChange çağrısıyla bilgi sahibi olur. Aynı yöntem, uygulamaya ses odağının alınarak alın olduğunu söylemek için de kullanılır.
Uygulama ses kaynaklarını kullanmayı bitirdikten sonra yöntemini çağırarak geri AbandonFocusAudioManager çağırmayı tekrar geçer. Bu, geri çağırma kaydını silen ve ses kaynaklarını serbest bırakarak diğer uygulamaların ses odağında yer almalarını sağlar.
Ses Odağı İsteği
Cihazın ses kaynaklarını talep etmek için gereken adımlar aşağıdaki gibidir:
Sistem hizmetine bir tanıtıcı
AudioManageralın.Geri çağırma sınıfının bir örneğini oluşturun.
üzerinde yöntemini çağırarak cihazın ses
RequestAudioFocuskaynaklarını talepAudioManageredin. Parametreler geri çağırma nesnesi, akış türü (müzik, sesli arama, halka vb.) ve istenen erişim hakkının türü (örneğin, ses kaynakları kısa bir süre için veya süresiz bir süre için talep edilebilir).İstek verilmelidir, yöntemi
playMusichemen çağrılır ve ses kayıt geri oynatmaya başlar.İstek reddedilirse başka bir işlem alınmaz. Bu durumda, ses yalnızca istek daha sonra verilmişse oynatılır.
Aşağıdaki kod örneği şu adımları gösterir:
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);
}
Ses Odağında Serbest Bırakma
İzlemenin kayıttan yürütülmesi tamamlandığında, AbandonFocus üzerinde yöntemi AudioManager çağrılır. Bu, başka bir uygulamanın cihazın ses kaynaklarını elde etmesine olanak tanır. Diğer uygulamalar, kendi dinleyicilerini kaydettiklerinde bu ses odağının bir bildirimini alır.
Düşük düzey ses API 'SI
Düşük düzey ses API 'Leri, ses yürütme ve kayıt üzerinde daha fazla denetim sağlar çünkü dosya URI 'Leri kullanmak yerine doğrudan bellek arabelleklerinde etkileşime geçer. Bu yaklaşımın tercih ettiği bazı senaryolar vardır. Bu tür senaryolar şunlardır:
Şifrelenmiş ses dosyalarından oynatılırken.
Art arda bir kısa klip oynarken.
Ses akışı.
AudioTrack sınıfı
Audiotrack sınıfı, kayıt için alt düzey ses API 'lerini kullanır ve sınıfının alt düzey eşdeğeridir .
Başlatma ve yürütme
Ses çalmak için, örneğinin yeni bir örneği oluşturulmalıdır AudioTrack . Oluşturucuya geçirilen bağımsız değişken listesi, arabellekte bulunan ses örneğinin nasıl çalınmasını belirtir. Bağımsız değişkenler şunlardır:
Stream türü – Voice, zil sesi, müzik, sistem veya alarm.
Sıklık: Hz olarak ifade edilen örnekleme oranı.
Kanal yapılandırması – mono veya stereo.
Ses biçimi – 8 bit veya 16 bit kodlama.
Arabellek boyutu: bayt cinsinden.
Arabellek modu – akış veya statik.
Oluşturulduktan sonra Play yöntemi çağrılır ve yürütülmeye başlamak üzere ayarlanır. Ses arabelleğini öğesine yazmak AudioTrack kayıttan yürütmeyi başlatır:
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);
}
Kayıttan yürütmeyi duraklatma ve durdurma
Yürütmeyi duraklatmak için Pause metodunu çağırın:
audioTrack.Pause();
Stop metodunu çağırmak, kayıttan yürütmeyi kalıcı olarak sonlandırır:
audioTrack.Stop();
Temizleme
AudioTrackArtık gerekli olmadığında, kaynakları çağıran AudioTracktarafından yayımlanmalıdır:
audioTrack.Release();
AudioRecord sınıfı
Audiorecord sınıfı, kayıt tarafında ' ın eşdeğeridir. Benzer şekilde AudioTrack , dosya ve URI 'ler yerine doğrudan bellek arabellekleri kullanır. Bu, RECORD_AUDIO iznin bildirimde ayarlanmasını gerektirir.
Başlatma ve kaydetme
İlk adım yeni bir Audiorecord nesnesi oluşturmak için kullanılır. Oluşturucuya geçirilen bağımsız değişken listesi, kayıt için gereken tüm bilgileri sağlar. AudioTrackBağımsız değişkenlerin büyük ölçüde numaralandırmalar olduğu aksine, içindeki denk bağımsız değişkenler AudioRecord tamsayılardır. Bu modüller şunlardır:
Mikrofon gibi donanım ses giriş kaynağı.
Stream türü – Voice, zil sesi, müzik, sistem veya alarm.
Sıklık: Hz olarak ifade edilen örnekleme oranı.
Kanal yapılandırması – mono veya stereo.
Ses biçimi – 8 bit veya 16 bit kodlama.
Arabellek boyutu (bayt)
Oluşturulduktan sonra AudioRecord , AudioRecord yöntemi çağrılır. Şimdi kayda başlamaya hazırdır. , AudioRecord Giriş için ses arabelleğini sürekli okur ve bu girişi bir ses dosyasına yazar.
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;
}
}
}
Kayıt durduruluyor
Stop metodunu çağırmak kaydı sonlandırır:
audRecorder.Stop();
Temizleme
AudioRecordNesneye artık ihtiyaç duyulmadığında, AudioRecord yöntemini çağırmak onunla ilişkili tüm kaynakları serbest bırakır:
audRecorder.Release();
Özet
Android işletim sistemi, ses çalmak, kaydetmek ve yönetmek için güçlü bir çerçeve sağlar. Bu makalede, üst düzey ve sınıflar kullanılarak ses yürütme ve kaydetme ele alınmıştır MediaPlayerMediaRecorder . Daha sonra, farklı uygulamalar arasında cihazın ses kaynaklarını paylaşmak için ses bildirimlerini nasıl kullanacağınızı araştırmalıdır. Son olarak, düşük düzey API 'Ler kullanılarak ses kayıttan yürütme ve kaydetme ile dağıtılır ve bu arabirim doğrudan bellek arabelleklerine sahip olur.