2013-07-03 64 views
0

有没有人知道如何获得AMR文件的持续时间?真诚地,我不知道AMR编码的许多事情。android - 以编程方式获得AMR音频文件的持续时间

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

我想在录制停止后获取文件的持续时间没有创建任何MediaPlayer并从中获取持续时间。对于一个普通的Wav文件,我只是这样做:

fileLength/byteRate 

但AMR我不知道byteRate,我不知道这会是好的,虽然因为WAV是原始的PCM数据(未压缩)和AMR是压缩。

回答

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

+0

谢谢您的回答,它帮助了我很多。我想我甚至可以附加2 amr文件,只需从文件中的第7个开始获取所有字节并将它们附加到第二个文件的末尾即可。只是附加帧...我徘徊,如果我必须修改附加文件头中的东西,但我猜不是... –

+1

文件头应该只是一个签名,将内容标识为AMR-NB数据,所以连接应该按照方式工作你描述了它。虽然我没有自己测试过。 – Michael

相关问题