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

  1. 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ı kullanma AudioTrack .

  2. Ses Kaydetme – Ses kaydetmek için yerleşik MediaRecorder sınıfı kullanma.

  3. 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.

  4. 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:

RECORD_AUDIO etkin android bildiriminin gerekli izinler bölümü

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:

  1. Yeni bir MediaPlayer nesnesi örneği oluşturma.

  2. Dosyayı SetDataSource yöntemiyle yürütülecek şekilde yapılandırın.

  3. Oynatıcıyı başlatmak için Prepare yöntemini çağırın.

  4. 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:

  1. Yeni bir MediaRecorder nesnesi örneği oluşturma.

  2. SetAudioSource yöntemi aracılığıyla ses girişini yakalamak için hangi donanım cihazının kullanılacağını belirtin.

  3. SetOutputFormat yöntemini kullanarak çıkış dosyası ses biçimini ayarlayın. Desteklenen ses türlerinin listesi için bkz . Android Desteklenen Medya Biçimleri.

  4. Ses kodlama türünü ayarlamak için SetAudioEncoder yöntemini çağırın.

  5. Ses verilerinin yazıldığını çıkış dosyasının adını belirtmek için SetOutputFile yöntemini çağırın.

  6. Kaydediciyi başlatmak için Prepare yöntemini çağırın.

  7. 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:

  1. Sistem hizmetine bir tanıtıcı AudioManager alın.

  2. Geri çağırma sınıfının bir örneğini oluşturun.

  3. üzerinde yöntemini AudioManager çağırarak RequestAudioFocus 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).

  4. İstek verilirse, playMusic yöntemi hemen çağrılır ve ses oynatılır.

  5. İ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:

  1. Şifrelenmiş ses dosyalarından çalarken.

  2. Kısa kliplerin ardılı oynatıldığında.

  3. 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:

  1. Akış türü : Ses, zil sesi, müzik, sistem veya alarm.

  2. Frekans – Hz cinsinden ifade edilen örnekleme hızı.

  3. Kanal Yapılandırması – Mono veya stereo.

  4. Ses biçimi – 8 bit veya 16 bit kodlama.

  5. Arabellek boyutu – bayt cinsinden.

  6. 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:

  1. Mikrofon gibi donanım ses giriş kaynağı.

  2. Akış türü : Ses, zil sesi, müzik, sistem veya alarm.

  3. Frekans – Hz cinsinden ifade edilen örnekleme hızı.

  4. Kanal Yapılandırması – Mono veya stereo.

  5. Ses biçimi – 8 bit veya 16 bit kodlama.

  6. 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.