android - 以编程方式获取AMR音频文件的持续时间

Ale*_*cus 0 audio android wav amr

有谁知道如何获得AMR文件的持续时间?真诚地,我不知道很多关于AMR编码的事情.

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Run Code Online (Sandbox Code Playgroud)

我希望在录制停止后获取文件的持续时间而不创建任何MediaPlayer并从中获取持续时间.对于常规的Wav文件,我只需这样做:

fileLength / byteRate
Run Code Online (Sandbox Code Playgroud)

但是对于AMR,我不知道byteRate,我不确定这是否可以,因为WAV是原始PCM数据(未压缩)并且AMR被压缩.

Mic*_*ael 5

也许3GP容器包含有关内容长度的信息?在3GPP文件格式规范,如果你想读它是可用的.


对于原始文件.AMR你不得不遍历所有的帧找到音频的长度,因为每个帧可以用不同的比特率编码.

这样做的过程是:

  • 跳过文件的前6个字节(AMR签名).

  • 文件的其余部分将是音频帧,每个音频帧都以一个字节的标头开头.读取该字节并查看位3..6(编解码器模式).对于AMR-NB,有效的编解码器模式为0..7,您可以使用下表将其映射到帧的大小(以字节为单位).

  • 一旦知道了当前帧的大小,就跳过它并解析下一帧.重复,直到到达文件末尾.

如果您已计算文件中的帧数,则可以将该数字乘以20以获得音频的长度(以毫秒为单位).

帧大小表:

Codec mode  Frame size
----------------------
0             13
1             14
2             16
3             18
4             20
5             21
6             27
7             32

(来源)