有人知道如何获取AMR文件的持续时间吗?真诚地,我不知道很多关于AMR编码的事情。
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
我希望在录制停止后获取文件的持续时间而不创建任何MediaPlayer并从中获取持续时间。对于常规的Wav文件,我只是这样做:
fileLength / byteRate
但是对于AMR,我不知道byteRate,我不确定这是否可以,因为WAV是原始PCM数据(未压缩)并且AMR被压缩。
答案 0 :(得分:5)
也许3GP容器包含有关内容长度的信息?如果您想阅读,3GPP file format spec可用。
对于原始.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
(Source)