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

标签 android audio wav amr

如何获取 AMR 文件的持续时间?

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

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

fileLength / byteRate

但对于 AMR,我不知道字节率,而且我不确定这是否可行,因为 WAV 是原始 PCM 数据(未压缩)而 AMR 是压缩的。

最佳答案

也许 3GP 容器包含有关内容长度的信息? 3GPP file format spec如果您想阅读,可以使用。


对于原始 .amr 文件,您必须遍历所有帧才能找到音频的长度,因为每个帧都可以使用不同的比特率进行编码。

这样做的过程是:

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

  • 文件的其余部分将是音频帧,每个帧都以一个字节的 header 开头。读取该字节并查看位 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 )

关于Android - 以编程方式获取 AMR 音频文件的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447508/

相关文章:

Android 布局问题 - ListView 项目

java - 我可以使用 Firestore 检索不同集合中具有相同名称的相同子集合的文档吗?

java - 如何在 Android 中使用 Berkeley DB SQL API

android - 使用MediaPlayer从res/raw播放声音文件

objective-c - 在 Objective-C 中处理大量音频样本

java - 将输入写入和读取到 xml

javascript - 如何检查音频标签加载文件是否完整

c++ - 不确定将每个加载为 2 个字节的 double 值规范化

c++ - Mac C++程序播放任意格式.wav数据,类似win32 PlaySound

java - 使用 TARSOS DSP 从 WavFiles JAVA 中提取 MFCC 的困难