私のアプリは、電話のマイクからオーディオを録音しており、リアルタイムで処理しています。物理的なデバイスでうまく動作していますが、エミュレータでは「面白い」動作をします。それは何かを記録しますが、私はそれが何を録音しているのかよく分かりません。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
誰かが似たような経験をしていますか? 録音ループで何か問題がありますか?
あなたのdev環境のサンプルレートはどのくらいですか? – CyberJacob