Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Android işletim sistemi, hem ses hem de 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ın yanı sıra alt düzey ses API'sini kullanarak ses yürütmeyi ve kaydetmeyi kapsar. Ayrıca geliştiricilerin düzgün davranan uygulamalar oluşturabilmesi 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 özel donanım parçalarına ihtiyaç duyulan işlevselliği benimsemiştir. Bu nedenle, multimedya çerçeveleri mobil API'lerde birinci sınıf bir özellik haline gelmiştir.
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 sınıfla akışlı ses dosyaları da dahil olmak üzere ses yürütmek için yerleşik
MediaPlayersınıfı kullanmaAudioTrack.Ses Kaydetme – Ses kaydetmek için yerleşik
MediaRecordersınıfı kullanma.Sesli Bildirimlerle Çalışma – Ses çıkışlarını askıya alarak veya iptal ederek olaylara (gelen telefon aramaları gibi) doğru yanıt veren düzgün davranmış uygulamalar oluşturmak için sesli bildirimleri kullanma.
Düşük Düzeyli Ses ile Çalışma – Doğrudan bellek arabelleklerine yazarak sınıfı kullanarak
AudioTrackses çalma. sınıfınıAudioRecordkullanarak ses kaydetme ve doğrudan bellek arabelleklerinden okuma.
Gereksinimler
Bu kılavuz Android 2.0 (API düzeyi 5) veya üzerini gerektirir. Android'de seste hata ayıklama işleminin bir cihazda yapılması gerektiğini lütfen unutmayın.
İzinlerin AndroidManifest.XML istenmesi RECORD_AUDIO gerekir:

MediaPlayer Sınıfıyla Ses Çalma
Android'de ses çalmanın en basit yolu yerleşik MediaPlayer sınıfıdır.
MediaPlayer dosya yolunu geçirerek yerel veya uzak dosyaları yürütebilir. Ancak, MediaPlayer durum açısından çok hassastır ve yöntemlerinden birini yanlış durumda çağırmak bir özel durum oluşturmasına neden olur. Hatalardan kaçınmak için aşağıda açıklanan sırayla etkileşim MediaPlayer kurmak önemlidir.
Başlatma ve Yürütme
ile MediaPlayer ses yürütme aşağıdaki sırayı gerektirir:
Yeni bir MediaPlayer nesnesi örneği oluşturma.
Dosyayı SetDataSource yöntemiyle yürütülecek şekilde yapılandırın.
Oynatıcıyı başlatmak için Prepare yöntemini çağırın.
Ses çalmayı başlatmak için Start yöntemini çağırın.
Aşağıdaki kod örneğinde bu kullanım gösterilmektedir:
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 Ettirme
Pause yöntemi çağrılarak kayıttan yürütme askıya alınabilir:
player.Pause();
Duraklatılmış kayıttan yürütmeyi sürdürmek için Start yöntemini çağırın. Bu, kayıttan yürütmedeki duraklatılmış konumdan devam eder:
player.Start();
Yürütücüde Stop yönteminin çağrılması devam eden kayıttan yürütmeyi sonlandırır:
player.Stop();
Oynatıcıya artık gerek kalmadığında, kaynakların Release yöntemi çağrılarak serbest bırakılması gerekir:
player.Release();
Ses Kaydetmek için MediaRecorder Sınıfını Kullanma
MediaPlayer Android'de ses kaydı için kaydın kaydı MediaRecorder sınıfıdır. MediaPlayergibi, durum duyarlıdır ve kayda başlayabildiği noktaya ulaşmak için çeşitli durumlardan geçer. Ses RECORD_AUDIO kaydetmek için izin ayarlanmalıdır. Uygulama izinlerini ayarlama yönergeleri için bkz . AndroidManifest.xml ile çalışma.
Başlatma ve Kaydetme
ile MediaRecorder ses kaydı 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 cihazının kullanılacağını belirtin.
SetOutputFormat yöntemini kullanarak çıkış dosyası ses biçimini ayarlayın. Desteklenen ses türlerinin listesi için bkz . Android Desteklenen Medya Biçimleri.
Ses kodlama türünü ayarlamak için SetAudioEncoder yöntemini çağırın.
Ses verilerinin yazıldığını çıkış dosyasının adını belirtmek için SetOutputFile yöntemini çağırın.
Kaydediciyi başlatmak için Prepare yöntemini çağırın.
Kaydı başlatmak için Start yöntemini çağırın.
Aşağıdaki kod örneği bu diziyi gösterir:
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 yöntemini çağırın StopMediaRecorder:
recorder.Stop();
Temizleme
MediaRecorder durdurulduktan sonra sıfırlama yöntemini çağırarak boşta durumuna geri koyun:
recorder.Reset();
MediaRecorder artık gerekli olmadığında, kaynakları Release yöntemi çağrılarak serbest bırakılmalıdır:
recorder.Release();
Ses Bildirimlerini Yönetme
AudioManager Sınıfı
AudioManager sınıfı, uygulamaların ses olayları gerçekleştiğinde bunu bilmesini sağlayan ses bildirimlerine erişim sağlar. Bu hizmet ses düzeyi ve zil modu denetimi gibi diğer ses özelliklerine de erişim sağlar. , AudioManager bir uygulamanın ses kayıttan yürütmeyi denetlemek için ses bildirimlerini işlemesine izin verir.
Ses Odağını Yönetme
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 masaüstü bilgisayardaki uygulamalara benzer: Çalışan uygulamalardan birini fareyle tıklayarak seçtikten sonra, klavye girişi yalnızca o uygulamaya gider.
Ses odağı benzer bir fikirdir ve birden fazla uygulamanın aynı anda ses çalmasını veya kaydetmesini önler. Bu, isteğe bağlı olduğu için klavye odağından daha karmaşıktır; uygulama şu anda ses odağına sahip olmadığı ve ne olursa olsun çalmadığı gerçeğini yoksayabilir ve istenebilecek farklı ses odağı türleri olduğundan. Örneğin, istek sahibinin yalnızca çok kısa bir süre için ses çalması bekleniyorsa, geçici odak isteyebilir.
Ses odağı hemen verilebilir veya başlangıçta reddedilip daha sonra verilebilir. Örneğin, bir uygulama telefon araması sırasında ses odağı isterse reddedilir, ancak telefon araması tamamlandıktan sonra odak verilebilir. Bu durumda, ses odağı kaldırılırsa uygun şekilde yanıt vermek için bir dinleyici kaydedilir. Ses odağı istemek, 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ğını Yönetme.
Ses Odağı için Geri Çağırmayı Kaydetme
'den IOnAudioChangeListener geri çağırmanın FocusChangeListener kaydedilmesi, ses odağını edinmenin ve yayınlamanın önemli bir parçasıdır. Bunun nedeni, ses odağı verme işleminin daha sonraki bir zamana kadar ertelenebilir. Örneğin, bir uygulama devam eden bir telefon araması varken müzik çalma isteğinde bulunabilir. Telefon araması bitene kadar ses odağı verilmeyecektir.
Bu nedenle, geri çağırma nesnesi yöntemine GetAudioFocusAudioManagerparametre olarak geçirilir ve geri çağırmayı kaydeden bu çağrıdır. Ses odağı başlangıçta reddedildiyse ancak daha sonra verildiyse, geri aramada çağrılarak OnAudioFocusChange uygulamaya bilgi verilir. Aynı yöntem, uygulamaya ses odağının alındığını söylemek için kullanılır.
Uygulama ses kaynaklarını kullanmayı bitirdiğinde yöntemini çağırır AbandonFocusAudioManagerve yeniden geri çağırmayı geçirir. Bu, geri çağırmanın kaydını silip ses kaynaklarını serbest bırakır, böylece diğer uygulamalar ses odağı elde edebilir.
Ses Odağı İsteme
Cihazın ses kaynaklarını istemek 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
AudioManagerçağırarakRequestAudioFocuscihazın ses kaynaklarını isteyin. Parametreler geri çağırma nesnesi, akış türü (müzik, sesli arama, çaldırma vb.) ve istenen erişim hakkı türüdür (örneğin, ses kaynakları kısa bir süre veya belirsiz bir süre için istenebilir).İstek verilirse,
playMusicyöntemi hemen çağrılır ve ses oynatılır.İstek reddedilirse başka işlem yapılmaz. Bu durumda ses yalnızca istek daha sonra verildiğinde yürütülecektir.
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ğını Serbest Bırakma
parçanın kayıttan yürütülmesi tamamlandığında, AbandonFocus üzerindeki AudioManager yöntemi çağrılır. Bu, başka bir uygulamanın cihazın ses kaynaklarını kazanmasını sağlar. Diğer uygulamalar, kendi dinleyicilerini kaydettiyse bu ses odağı değişikliğine ilişkin bir bildirim alır.
Düşük DüzeyLi Ses API'si
Alt düzey ses API'leri, dosya URI'lerini kullanmak yerine doğrudan bellek arabellekleriyle etkileşime geçtiklerinden ses çalma ve kaydetme üzerinde daha fazla denetim sağlar. Bu yaklaşımın tercih edildiği bazı senaryolar vardır. Bu tür senaryolar şunlardır:
Şifrelenmiş ses dosyalarından çalarken.
Kısa kliplerin ardılı oynatıldığında.
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 alt düzey eşdeğeridirMediaPlayer.
Başlatma ve Yürütme
Ses yürütmek için yeni bir örneğinin AudioTrack örneği oluşturulmalıdır. Oluşturucuya geçirilen bağımsız değişken listesi, arabellekte bulunan ses örneğinin nasıl yürütülacağını belirtir. Bağımsız değişkenler şunlardır:
Akış türü : Ses, zil sesi, müzik, sistem veya alarm.
Frekans – Hz cinsinden ifade edilen örnekleme hızı.
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.
yapımdan sonra, yürütmeye başlamak üzere ayarlamak için Play yöntemi AudioTrack çağrılır. Ses arabelleğine yazma 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
Kayıttan yürütmeyi duraklatmak için Pause yöntemini çağırın:
audioTrack.Pause();
Stop yöntemini çağırmak kayıttan yürütmeyi kalıcı olarak sonlandırır:
audioTrack.Stop();
Temizleme
AudioTrack artık gerekli olmadığında, kaynakları Release çağrılarak serbest bırakılmalıdır:
audioTrack.Release();
AudioRecord Sınıfı
AudioRecord sınıfı, kayıt tarafındaki ile AudioTrack eşdeğerdir. gibi AudioTrack, dosyalar ve URI'ler yerine bellek arabelleklerini doğrudan kullanır. Bildirimde iznin RECORD_AUDIO ayarlanmasını gerektirir.
Başlatma ve Kaydetme
İlk adım yeni bir AudioRecord nesnesi oluşturmaktır. Oluşturucuya geçirilen bağımsız değişken listesi, kayıt için gereken tüm bilgileri sağlar. içinde AudioTrackbağımsız değişkenlerin büyük ölçüde sabit listesi olduğu değerinin aksine, içindeki AudioRecord eşdeğer bağımsız değişkenler tamsayılardır. Bu modüller şunlardır:
Mikrofon gibi donanım ses giriş kaynağı.
Akış türü : Ses, zil sesi, müzik, sistem veya alarm.
Frekans – Hz cinsinden ifade edilen örnekleme hızı.
Kanal Yapılandırması – Mono veya stereo.
Ses biçimi – 8 bit veya 16 bit kodlama.
Arabellek boyutu bayt sayısı
AudioRecord oluşturulduğunda StartRecording yöntemi çağrılır. Artık kayda başlamaya hazırdır. giriş AudioRecord için ses arabelleği sürekli olarak 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;
}
}
}
Kaydı Durdurma
Stop yöntemini çağırmak kaydı sonlandırır:
audRecorder.Stop();
Temizleme
Nesne artık AudioRecord gerekli olmadığında, Release yöntemini çağırmak kendisiyle ilişkili tüm kaynakları serbest bırakır:
audRecorder.Release();
Özet
Android işletim sistemi ses çalma, kaydetme ve yönetmeye yönelik güçlü bir çerçeve sağlar. Bu makalede, üst düzey MediaPlayer ve sınıflar kullanılarak ses çalma ve MediaRecorder kaydetme ele alınmıştır. Ardından, cihazın ses kaynaklarını farklı uygulamalar arasında paylaşmak için ses bildirimlerinin nasıl kullanılacağını inceledi. Son olarak, doğrudan bellek arabellekleriyle arabirim oluşturan alt düzey API'leri kullanarak ses kayıttan yürütme ve kaydetme işlemleriyle ilgilendi.