2012-03-26 3 views
0

マイクからリアルタイムで音声を再生できるアプリで作業しています。 エラーなしでAudioRecorderを設定します。しかし、読み込み操作を実行するときには、単にzeorsの束、またはshortの最大値に近い数を返します。私は本当に立ち往生しています。誰かが私を助けることができれば、とても親切です。全体短い[]充填することを保証しません一度Android:AudioRecord.read()はガベージを返します

public class AudioIn extends Thread { 
public static final int ERROR_RECORD_INIT = -1; 
public static final int ERROR_RECORD_NOTIFICATION = -2; 
public static final int ERROR_RECORD_READ = -3; 
public static final int SUCCESS = 0; 

public static final int audioFrequency = 44100; 
public static final int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
public static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
final int ShortsReadPerCycle = 1024; 


private boolean capture = true; 
private AudioRecord recorder; 
private int effectiveCaptureBufferSize; 
private short[] buffer; 

private AudioInHandler handler; 

public AudioIn() 
{ 
    int minDeviceBuffer = AudioRecord.getMinBufferSize(audioFrequency, channelConfig, audioFormat); 
    Log.d("AudioIn", "Minimum device capture buffer is: " + Integer.toString(minDeviceBuffer) + " bytes"); 

    effectiveCaptureBufferSize = minDeviceBuffer; 
    Log.d("AudioIn", "Setting capture buffer size to " + effectiveCaptureBufferSize + " bytes"); 
} 

public void close() 
{ 
    capture = false; 
} 

public int samplesPerBuffer() 
{ 
    return effectiveCaptureBufferSize/2; 
} 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO); 
    try 
    { 
     recorder = new AudioRecord(AudioSource.MIC, audioFrequency, channelConfig, audioFormat, effectiveCaptureBufferSize); 
    } 
    catch (Throwable t) 
    { 
     handler.onError(ERROR_RECORD_INIT); 
     return;   
    } 

    recorder.startRecording(); 

    while(capture) 
    { 
     buffer = new short[ShortsReadPerCycle]; 
     int shortsRead = recorder.read(buffer, 0, buffer.length); 
     if (shortsRead < 0) 
     { 
      new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        handler.onError(ERROR_RECORD_READ); 
       } 
      }.run(); 
      this.close(); 
     } 
     else 
     { 
      new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        handler.onNewData(buffer); 
       } 
      }.run();  
     } 
    } 
    Log.d("AudioIn.run()", "Stopping AudioRecord..."); 
    recorder.stop(); 
    Log.d("AudioIn.run()", "Stopped AudioRecord, now releasing..."); 
    recorder.release(); 
    Log.d("AudioIn.run()", "AudioRecord released"); 
    recorder = null; 
} 

public void setHandler(AudioInHandler handler) { 
    this.handler = handler; 
} 
} 

答えて

3

呼び出すと、読み取り()audiorecordの上:これは私のコードです。返された "shortsRead"をチェックして実際の短い読み込みを確認し、short []が満たされるまでread()を呼び出す必要があります。下記のサンプルコード。このようにして

private void readFully(short[] data, int off, int length) { 
     int read; 
     while (length > 0) { 
      read = mRec.read(data, off, length); 
      length -= read; 
      off += read; 
     } 
} 
あなたの記録ループで

while (!released) { 
    // fill the pktBuf 
    short[] pktBuf = new short[pktSize]; 
    readFully(pktBuf, 0, pktSize); 
    // Do something 
} 

、毎回読んでコールが()行われ、私たちは、「読み」と「読み」で、残りの長さを減少によって相殺インクリメント、残っている長さが0になるまで読んでください。録音されたオーディオデータで短い[]が得られます。

同様に、AudioTrackにデータを書き込んでいるときは、「writeFully()」と同じことをして、AudioTrackにshort []を書き込む必要があります。

希望します。

関連する問題