Java 如何读取和修改amr音频文件数据?

Java 如何读取和修改amr音频文件数据?,java,audio,amr,file-structure,audioformat,Java,Audio,Amr,File Structure,Audioformat,如何从AMR-NB文件中提取采样率、比特率等信息。 严格地说,我想要的是采样率或任何其他可能改变音高或节奏的数据 对WAV文件来说很容易,但在这里我受到AMR-NB格式(J2me设备)的限制 我在谷歌上搜索了很多东西,但什么都找不到 AMR-NB是否固定在8Khz?或者根据AMR文件格式的不同而有所不同?:AMR文件有一个6字节的头,后面是一组音频帧,每个帧有一个1字节的头。每个音频帧的长度为20 ms,具有相同的长度,采样率在每个帧的标题中给出。因此,要读取第一帧的采样率,需要读取文件中的第7

如何从AMR-NB文件中提取采样率、比特率等信息。 严格地说,我想要的是采样率或任何其他可能改变音高或节奏的数据

对WAV文件来说很容易,但在这里我受到AMR-NB格式(J2me设备)的限制

我在谷歌上搜索了很多东西,但什么都找不到


AMR-NB是否固定在8Khz?或者根据AMR文件格式的不同而有所不同?

:AMR文件有一个6字节的头,后面是一组音频帧,每个帧有一个1字节的头。每个音频帧的长度为20 ms,具有相同的长度,采样率在每个帧的标题中给出。因此,要读取第一帧的采样率,需要读取文件中的第7个字节。取第7个字节并将其右移3位,然后屏蔽掉新值的下4位。在java中,这是“((value>>3)&0x0F)”,其中value是帧的1字节头。然后对照下表检查该数字,以确定该帧的比特率。然后,由于每个帧的长度为20ms,您需要将比特率(它们给出的比特率为kb/s,因此将该数字乘以1000以获得每秒的比特数)乘以20,再除以((8比特/字节)*1000ms/秒)=8000以获得下一个帧头要跳过的字节数。如果要修改帧的内容,只需按顺序将帧重新复制到新文件,但用旧文件替换新帧。一个临时文件很适合这样做。我从下面的源页面复制了比特率表以供参考

0-AMR 4.75-编码速度为4.75kbit/s

1-AMR 5.15-编码速度为5.15kbit/s

2-AMR 5.9-编码速度为5.9kbit/s

3-AMR 6.7-编码速度为6.7kbit/s

4-AMR 7.4-编码速度为7.4kbit/s

5-AMR 7.95-编码速度为7.95kbit/s

6-AMR 10.2-编码速度为10.2kbit/s

7-AMR 12.2-以12.2kbit/s的速度编码