2012-11-21 18 views
8

AudioRecord sınıfını kullanarak bazı sorunlar yaşıyorum. Kayıtlı verileri bir tamponda saklamak istiyorum, ancak bunu başarmanın doğru yolu olduğundan emin değilim. Çok sayıda örnekle karşılaştım, ancak çoğu bir çok farklı yaklaşımı temsil ediyor. Basit bir veya basit açıklama arıyorum. kısa .read kullanmak gerekiyordu yaşıyorum (:AudioRecord - veri arabelleğe nasıl alınır?

int audioSource = AudioSource.MIC; 
int sampleRateInHz = 8000; 
int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 

short[] buffer = new short[bufferSizeInBytes]; 

AudioRecord audioRecorder = new AudioRecord(audioSource, 
              sampleRateInHz, 
              channelConfig, 
              audioFormat, 
              bufferSizeInBytes); 

Ben

public void Recording() { 
    audioRecorder.startRecording(); 
    ... 
    audioRecorder.stop(); 
    audioRecorder.release(); 
} 

Ben bunu biliyorum bir kayıt fonksiyonu oluşturmak için çalışıyorum: '' Burada

Projem için benim ses ayarları [] audioData, int ofsetInShorts, int sizeInShorts) işlevi. Ve işte sorunum başlıyor. AudioData arabelleğinin nasıl çalıştığından emin değilim - fonksiyonun kaydedilmiş örnekleri audioData'ya koyduğunu farzediyorum. Tamamen verilerle doluysa ne olur? En erken pozisyondan yeniden yazmaya başlar mı? Eğer varsa, toplanan tüm örnekleri başka bir yere kopyalamam gerektiğine inanıyorum. Başka bir soru ortaya çıkarır - .read (...) işlev arabelleğinin dolu olup olmadığını nasıl kontrol edebilirim? Zaman ve arabellek içeriğini kopyalamam gerekiyor mu yoksa buna ulaşmak için başka bir yol var mı? Ayrıca tüm kayıt işlemi için bir iş parçacığı oluşturmam gerekiyor mu?

sorularınıza bir konu :)

cevap

3

Cevap içinde bu kadar çok soru soran ::

recorder.read (...) mutlaka hiçbir veriyi okumuyor için üzgünüm. Muhtemelen bu döngüleri, okunacak çağrılar arasında kısa bir süre (ör., 50 ms) duraklatmak için yeniden yazmalısınız. Tampon, veriye sahip olana kadar arabelleği de sıralamamalıdır. Ayrıca, arabellek dolu olmayabilir, muhtemelen bayt sayısının bir sayısını koruyan bir veri yapısı kullanmanız gerekir. ByteBuffer iyi bir aday olarak akla geliyor. Okuma döngüsünde baytları ona ayırabilir ve yeterince dolduğunda, iletimi sıraya alıp başka bir tane başlatabilirsiniz.

devre dışı bırakmak için bir iş parçacığı oluşturmanız gerekir. Aşağıdaki kodda gösterildiği gibi.

Kayıt hatalarının düzgün bir şekilde denetlenmesini sağlayan değiştirilmiş bir sürümü. Tabii

private void startRecording() { 

    recorder.startRecording(); 
    isRecording = true; 
    recordingThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      bData = ByteBuffer.allocate(BufferElements); 
      bbarray = new byte[bData.remaining()]; 
      bData.get(bbarray); 
      while (isRecording) { 

       int result = recorder.read(bbarray, 0, BufferElements); 
       System.out.println("READ DATA"); 
       if (result > 0) { 
        qArray.add(bData); 

        --your stuffs-- 
        bData = ByteBuffer.allocate(BufferElements); 
       } else if (result == AudioRecord.ERROR_INVALID_OPERATION) { 
        Log.e("Recording", "Invalid operation error"); 
        break; 
       } else if (result == AudioRecord.ERROR_BAD_VALUE) { 
        Log.e("Recording", "Bad value error"); 
        break; 
       } else if (result == AudioRecord.ERROR) { 
        Log.e("Recording", "Unknown error"); 
        break; 
       } 
       try { 
        Thread.sleep(10); 
       } catch (InterruptedException e) { 
        break; 
       } 
      } 
     } 
    }, "AudioRecorder Thread"); 
    recordingThread.start(); 
} 

, bir yere recorder.startRecording() aramak gerekir yoksa herhangi bir veri almazsınız: Bu bir Queue<ByteBuffer> yerine Queue<byte[]> a kullanır.

Örnek çalışma örneği için at this example.

+0

** qArray ** burada nedir? – OnePunchMan

+0

arraylist olabilir. Ben şimdi hatırlamadım. Bu örneğe başvurmak daha iyidir http://stackoverflow.com/questions/8499042/android-audiorecord-example/13487250#13487250 –

İlgili konular