2

私は、JLayer ライブラリを使用して MP3 ファイルをデコードし (オーディオ サンプルにアクセスする必要があります)、それを再生するために AudioTrack オブジェクトを使用する Android アプリケーションに取り組んでいます。私はこのようなものを持っています:

int timeMarker = 0;
int timeStep = 5000;

while (!isCancelled()) {
    outSignalBuffer = decode(fileToPlay.getPath(), timeMarker, timeStep, bufferSize);
    audioTrack.write(outSignalBuffer, 0, outSignalBuffer.length);
    //publishProgress(outSignalBuffer);
    timeMarker += timeStep;
}

このコードは、AsyncTask として作成されたカスタム プレーヤーに配置されます。一般に、サウンド ファイルが聞こえるため、デコードと書き込みの方法は問題なく機能します。問題は、サウンドが定期的に 5 秒 (timeStep = 5000 ms) ごとにジャークすることです。ご覧のとおり、audioTrack.write(...) は非同期タスクをブロックするため、Decode メソッドの結果を待機するたびに Steps が発生するたびに短い一時停止が発生します。

outSignalBuffer を正しく配信してデコーダーからメソッドを記述し、スムーズな audioTrack プレーヤーを取得するための最善の方法について何かアドバイスはありますか?

4

1 に答える 1

1

デコードおよび audioTrack.write 関数のタイミングを計って、何が非同期タスクを妨げているかを確認しましたか? audioTrack.write が問題になるとは思いません。

JLayer での私の経験では、特に CD 品質のオーディオ (ステレオ、44.1kHz のサンプリング レート) を扱っている場合、リアルタイムのデコードには遅すぎる可能性があります。

ベース SDK を上げることができる場合は、Media Codec が良い方法かもしれません: http://developer.android.com/reference/android/media/MediaCodec.html

openSL を使用してオーディオを実装することもできます。この投稿では、Android オーディオ プログラミングのいくつかの課題と解決策について説明します。

于 2014-03-10T22:48:05.363 に答える