2

AMR ファイルの期間を取得するにはどうすればよいですか?

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

MediaPlayer を作成せずに録音を停止した後、ファイルの長さを取得し、そこから長さを取得したいと考えています。通常の Wav ファイルの場合は、次のようにします。

fileLength / byteRate

しかし、AMR については byteRate を知りませんでした。WAV は生の PCM データ (圧縮されていない) であり、AMR は圧縮されているため、これで問題ないかどうかはわかりません。

4

2 に答える 2

6

3GP コンテナにコンテンツの長さに関する情報が含まれているのではないでしょうか? 3GPP ファイル形式仕様は、読み​​たい場合に利用できます。


生の .amr ファイルの場合、各フレームは異なるビットレートでエンコードできるため、オーディオの長さを見つけるためにすべてのフレームをトラバースする必要があります。

これを行うプロセスは次のようになります。

  • ファイルの最初の 6 バイト (AMR 署名) をスキップします。

  • ファイルの残りの部分はオーディオ フレームで、それぞれ 1 バイトのヘッダーで始まります。そのバイトを読み取り、ビット 3..6 (コーデック モード) を調べます。AMR-NB の場合、有効なコーデック モードは 0..7 で、以下の表を使用してバイト単位でフレームのサイズにマッピングできます。

  • 現在のフレームのサイズがわかったら、スキップして次のフレームを解析します。ファイルの最後に到達するまで繰り返します。

ファイル内のフレーム数を数えた場合、その数に 20 を掛けて、オーディオの長さをミリ秒単位で取得できます。

フレームサイズ表:

コーデック モード フレーム サイズ
----------------------
0 13
1 14
2 16
3 18
4 20
5 21
6 27
7 32

ソース

于 2013-07-04T09:11:33.670 に答える