2017-01-05 6 views
2

AndroidのMediaCodec APIを使用して、AACに生のオーディオをエンコードしています。問題:AACストリームを1秒単位でサーバーに送信する必要があります。だから私はストリームを分割する必要があります。現在、AACフレームは1024サンプルであるため、各チャンクにはAACフレームがround(SAMPLE_RATE/1024)個あります。しかし、「プライミングサンプル」のために、この単純なAACストリームの切断は機能しません。 詳細はこちらをご覧ください。サーバーにチャンクを送信した後、クライアントはWebブラウザのChromeで受信し、Web Audio APIを使用すると受信したすべてのチャンクが再生されます。大容量のオーディオバッファが最初に割り当てられ、受信されたチャンクがデコードされ、オーディオバッファにコピーされ、オーディオバッファが再生される。 これはAACでは機能しません(Ogg/Vorbisでも動作します)。 AACでは、生成されたサウンドにアーティファクトがあります。各秒の終わりには、次の秒の開始点はゼロになり、徐々に波形は通常のサイズになるまで増加します。これは10,20ミリ秒間続きます。 この問題は、"priming samples"が見つからないことが原因と考えられます。たぶん、Web Audio APIは、各AACチャンクの先頭に「プライミングサンプル」があると予想しています。見つからず、実際のオーディオを変更します。AACストリームの分割、サンプルのプライミング/パディングの問題(gapless再生)

質問:私は元のAACストリームを分割し、1秒の「良い」AACチャンクを送信するにはどうすればよいですか? 私が理解しているところでは、前の2つのフレーム(前のチャンクの最後の2つのフレーム)を各チャンクの先頭に含める必要があります。ただし、この数は変更する必要があり、多くのドキュメントはありません。いくつかの専門家の助言が評価されます。

答えて

1

私は次の方法を使用しています。私はAACの専門家ではないので、何か不足しているかもしれませんが、実験的には動作しています。 Chromeデコーダは、各チャンクの先頭にプライミングサンプルがあると仮定して、チャンクをサーバーに送信する前に、最初のチャンクの最後の4つのAACフレームを最初に追加します(最初のチャンク私はこれをしない)。クライアント側では、チャンクを取得してデコードし、最初の4 * 1024個のサンプル(1024個= 1個のAACフレーム内のサンプル)を削除します。 これは機能しています。