非HTCデバイスの問題をaudiorecordの
-
26-09-2019 - |
質問
私はaudiorecordのを使用してトラブルを抱えています。
splmeter のプロジェクトに由来するコードの一部を使用した例:
private static final int FREQUENCY = 8000;
private static final int CHANNEL = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private static final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private int BUFFSIZE = 50;
private AudioRecord recordInstance = null;
...
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, CHANNEL, ENCODING, 8000);
recordInstance.startRecording();
short[] tempBuffer = new short[BUFFSIZE];
int retval = 0;
while (this.isRunning) {
for (int i = 0; i < BUFFSIZE - 1; i++) {
tempBuffer[i] = 0;
}
retval = recordInstance.read(tempBuffer, 0, BUFFSIZE);
... // process the data
}
この作品HTC夢とHTCマジックで完全にすべてのログ、警告/エラーのない、しかしエミュレータ上の問題やNexus Oneのデバイスが発生します。
ネクサス1で、それは単に決して有用なデータを返しません。私は、リモート友人がテストを行うことだと私は、他の有用な情報を提供することはできません。
エミュレータ(アンドロイド1.5、2.1および2.2)で、私はAudioFlingerとバッファAudioRecordThreadで溢れてから奇妙なエラーが発生します。私も(記録はUIとは別のスレッドで行われていても)UIの応答性の大幅な減速を取得します。
が何かは、私が間違ってやっていることは明白ですか?私は、Nexus Oneのハードウェアのために何が特別な操作を行う必要がありますか?
編集
私は、部分的に問題を解決してきました... audiorecordののためのドキュメントは述べています:
public static int getMinBufferSize (int sampleRateInHz, int channelConfig, int audioFormat)
最小バッファサイズを返します。 正常に作成するために必要 audiorecordのオブジェクトの。ご了承ください このサイズは滑らかを保証するものではありません。 負荷の下で記録し、高いです 値に応じて選択されるべきです で期待される頻度 audiorecordのインスタンスがポーリングされます 新しいdata.for新しいデータ用ます。
だから私は
にバッファ長を変更しましたprivate static final int BUFFSIZE = AudioRecord.getMinBufferSize(FREQUENCY, CHANNEL, ENCODING);
そして今、エミュレータはうまく動作します。
しかし、
ハードウェアはしていません。エミュレータは、8kHzのに基づいて、そのコール(毎秒12.5ポーリングを与える)から640の値を返しますが、HTCのハードウェアは4096を返します!およそ2秒ごとにポーリングし、半秒の音声遅延を意味! さらに、Nexus Oneの上の同じ呼び出しが8192を返します!だから、フル秒の遅延!
私はそれがその時に終了したいが、ネクサス1 のまだの(私は1つから適切なデバッグ情報を取得することはできませんので、まだ、自分自身を1を持っていない)任意のオーディオを返しません、たとえHTCデバイスとすべてのエミュレータ今の仕事(いくつかは、他よりもラグであっても)。
アム私は恐ろしく間違ってここで何かをやって?
解決
私はそれを解決!
I(不当)audiorecordのクラスのコンストラクタで使用されるマジックナンバー8000は、周波数可変の重複したと仮定する。実際にあなたが使うことになることをバッファサイズことになってます。
は残念ながら、これだけではsplmeterのバッファの長さ(デフォルト320 - 私は私の最初のコードブロック50に変更)とは異なるが、Nexus Oneのための許容される最小バッファサイズは8192であるので、audiorecordのインスタンスではない必要正しく作成されています。
私は(getMinBufferSizeから)私の修正バッファ長を持っていたとき、だから、すべてがすべてのプラットフォーム/エミュレータ間で完璧に動作し、それを魔法の8000を置き換え、および44100を提案する私の周波数変数を増加させます。
あなたがそれにパッチが適用される前にsplmeterのコードベースを使用する予定あれば、考慮にこれらの三つのことを取るます。
正直に言うと、splmeterコードHTCデバイス上ではないとしても動作するはずです。私は私のdevのデバイスはHTCマジック= P
と命名されている理由だと思います