2016-07-13 17 views
13

私のアプリは、電話のマイクからオーディオを録音しており、リアルタイムで処理しています。物理的なデバイスでうまく動作していますが、エミュレータでは「面白い」動作をします。それは何かを記録しますが、私はそれが何を録音しているのかよく分かりません。Androidエミュレータが96khzでオーディオを録音するように見える

エミュレータでは、実際のデバイスの約2倍の速度でオーディオサンプルが読み込まれているようです。私は視覚的進行ウィジェット(水平方向に動く記録ヘッド)を持っています。これはエミュレータで約2倍の速さで動きます。ここで

は、記録ループです:

int FREQUENCY = 44100; 
int BLOCKSIZE = 110; 

int bufferSize = AudioRecord.getMinBufferSize(FREQUENCY, 
     AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT) * 10; 

AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.CAMCORDER, 
     FREQUENCY, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
     bufferSize); 

short[] signal = new short[BLOCKSIZE * 2]; // Times two for stereo 

audioRecord.startRecording(); 

while (!isCancelled()) { 
    int bufferReadResult = audioRecord.read(signal, 0, BLOCKSIZE * 2); 
    if (bufferReadResult != BLOCKSIZE * 2) 
     throw new RuntimeException("Recorded less than BLOCKSIZE x 2 samples:" 
       + bufferReadResult); 

    // process the `signal` array here 
} 

audioRecord.stop(); 
audioRecord.release(); 

オーディオソースは「CAMCORDER」に設定し、それはステレオで記録されています。アイデアは、携帯電話に複数のマイクが付いている場合、アプリは両方からのデータを処理し、SNRが良い方を使用します。しかし、私はAudioSource.MICからモノを録音するのと同じ問題があります。 whileループのオーディオデータを読み込みます。私はaudioRecord.read()がブロッキングコールであると仮定しており、同じデータを2回読み取らせません。

記録されたデータは問題なく見えます - レコードバッファには2チャンネルの16ビットPCMサンプルが含まれています。ループは実際のデバイスの2倍のスピードで動作しているようです。これは、エミュレータが指定された44100Hzよりも高いサンプリングレートを使用している可能性があります。私がaudioRecord.getSampleRate()でサンプルレートを照会すると、正しい値が返されます。録音中

はまた、いくつかの興味深いオーディオ関連メッセージはlogcatにあります

07-13 12:22:02.282 1187 1531 D AudioFlinger: mixer(0xf44c0000) throttle end: throttle time(154) 
(...) 
07-13 12:22:02.373 1187 1817 E audio_hw_generic: Error opening input stream format 1, channel_mask 0010, sample_rate 16000 
07-13 12:22:02.373 1187 3036 I AudioFlinger: AudioFlinger's thread 0xf3bc0000 ready to run 
07-13 12:22:02.403 1187 3036 W AudioFlinger: RecordThread: buffer overflow 
(...) 
07-13 12:22:24.792 1187 3036 W AudioFlinger: RecordThread: buffer overflow 
07-13 12:22:30.677 1187 3036 W AudioFlinger: RecordThread: buffer overflow 
07-13 12:22:37.722 1187 3036 W AudioFlinger: RecordThread: buffer overflow 

私は、最新のAndroidメーカーとAndroid SDKを使用している、と私はAPIレベルを実行しているエミュレータイメージを試してみました21- 24。私の開発環境はUbuntuです16.04

誰かが似たような経験をしていますか? 録音ループで何か問題がありますか?

+0

あなたのdev環境のサンプルレートはどのくらいですか? – CyberJacob

答えて

10

AudioFormat.CHANNEL_IN_STEREOが原因であると思われます。デバイス上のマイクは、通常、モノラルオーディオソースです。何らかの理由でエミュレータがステレオをサポートしている場合は、エミュレータで2倍のデータを受信します(両方のチャネル用)。これを確認するには、guarantied to work on all devicesAudioFormat.CHANNEL_IN_MONOに切り替え、エミュレータで同じ量のデータを受信したかどうかを確認してください。

+0

「CHANNEL_IN_MONO」に切り替えられ、同じ問題が発生しました。私は、アプリケーションコードに何も問題はないと思うし、問題はエミュレータまたはおそらく私のOSです。 Playストアから無関係な「サウンドレコーダー」アプリをインストールし、ゴミを記録しました。その後、私はGenymotionでアプリケーションを実行しようとしました。 –

関連する問題