SORU
24 Aralık 2010, Cuma


Android sınıfı AudioRecord - canlı mikrofon ses hızlı işlem, ayarlanmış geri arama fonksiyonu

Mikrofon ses kaydı ve erişim oynatma neredeyse gerçek zamanlı olarak istiyorum. Bazı mikrofon ses kaydı ve hızlı erişim için Android AudioRecord sınıfını kullanmak için nasıl emin oldum.

İçin AudioRecord sınıf, resmi sitesi diyor ki 'uygulaması anketler AudioRecord nesne zaman' ve 'boyutu tampon olmak dolu belirler zaman uzunluğu kaydetmeden önce üzerinde çalışan okunmamış veri'. Daha sonra daha büyük bir arabellek yoklama daha sık kullanılmasını önerdi. Aslında hiç kod örnek göster.

Bir kitapta görmüştüm bir örnek AudioRecord sınıfı sürekli bir tampon taze canlı mikrofon ses ile doldurulur okumak için kullanır ve sonra da uygulamayı SD dosyasına bu verileri yazar. Pseudo-kod bir şey gibi görünüyor

set up AudioRecord object with buffer size and recording format info
set up a file and an output stream
myAudioRecord.startRecording();
while(isRecording)
{
    // myBuffer is being filled with fresh audio
    read audio data into myBuffer
    send contents of myBuffer to SD file
}
myAudioRecord.stop();

Nasıl bu eşitler kayıt oranı ile okuma belirsizdir - boolean "" ve başka bir yerde düzgün sıralı kapalı? isRecording kod Bu kod ya çok sık ya da çok seyrek, okuma ve yazma ne kadar süreceğine bağlı. okuma olabilir gibi görünüyor.

Site doktor da AudioRecord sınıf iç içe geçmiş bir sınıf bir arabirim olarak tanımlanan OnRecordPositionUpdateListener seçti diyor. Bu Bilgi gösteriyor ki bir şekilde belirttiğiniz süre istediğiniz için olmak haberdar ilerleme kaydedilmesi ve Adı olay işleyicisi ve bir çağrı otomatik olarak yapılan bir olay işleyicisi de belirtilen frekans. Yapı, sahte gibi bir şey olurdu sanırım

set target of period update message = myListener
set period to be about every 250 ms
other code

myListener()
{
    if(record button was recently tapped)
        handle message that another 250 ms of fresh audio is available
        ie, read it and send it somewhere
)

Beni yakalamak için izin veren bazı özel kod bulmam lazım ve en az 500 ms gecikme ile mikrofon ses işlem. Android başka bir sınıf MediaRecorder fazla, ama streaming desteklemiyor, ve mikrofon ses canlı gerçek zamanlı yakın Wi-Fi üzerinden stream etmek istiyorum. Bazı özel örnekler bulabilirim?

CEVAP
28 Ocak 2011, Cuma


Bildirimleri ile birçok diğer teknikler ve bir sürü deneme yaptıktan sonra bu kodu yerleşmiş:

private class AudioIn extends Thread { 
     private boolean stopped    = false;

     private AudioIn() { 

             start();
          }

     @Override
     public void run() { 
            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
            AudioRecord recorder = null;
            short[][]   buffers  = new short[256][160];
            int         ix       = 0;

            try { // ... initialise

                  int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);

                   recorder = new AudioRecord(AudioSource.MIC,
                                              8000,
                                              AudioFormat.CHANNEL_IN_MONO,
                                              AudioFormat.ENCODING_PCM_16BIT,
                                              N*10);

                   recorder.startRecording();

                   // ... loop

                   while(!stopped) { 
                      short[] buffer = buffers[ix   % buffers.length];

                      N = recorder.read(buffer,0,buffer.length);

                      process(buffer);
                  }
             } catch(Throwable x) { 
               log.warning(TAG,"Error reading voice audio",x);
             } finally { 
               close(recorder);
             }
         }

      private void close() { 
          stopped = true;
        }

    }

Şimdiye kadar üzerinde çalıştım yarım düzine Android telefonlarda gayet sağlam çalışıyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kyler Briskey

    Kyler Briske

    20 ŞUBAT 2011
  • Nick Pitera

    Nick Pitera

    8 NİSAN 2006
  • VvCompHelpvV

    VvCompHelpvV

    4 EYLÜL 2007