Android Ses
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
MediaPlayer
sınıfı kullanmaAudioTrack
.Ses Kaydetme – Ses kaydetmek için yerleşik
MediaRecorder
sı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
AudioTrack
ses çalma. sınıfınıAudioRecord
kullanarak 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. MediaPlayer
gibi, 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 Stop
MediaRecorder
:
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 GetAudioFocus
AudioManager
parametre 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 AbandonFocus
AudioManager
ve 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ı
AudioManager
alın.Geri çağırma sınıfının bir örneğini oluşturun.
üzerinde yöntemini
AudioManager
çağırarakRequestAudioFocus
cihazı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,
playMusic
yö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 AudioTrack
bağı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.