您的位置:首页 > 移动开发 > Android开发

Android获取WAV音频时长

2018-03-06 20:12 806 查看

1.简介

    wav(Waveform Audio File Format)是微软公司开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范。WAV是最接近无损的音乐格式,所以文件大小相对也比较大。    项目中需要获取wav音频文件的音频时长,因为之前获取gif文件的帧间隔是通过解析gif文件格式获取的,所以这次自然而然就想到通过解析wav文件格式获取音频时长。

2.wav文件格式解析

    学习自:http://soundfile.sapp.org/doc/WaveFormat/。


图1如图1所示,wav文件一般由3个区块组成,包括RIFF块、fmt块、data块。


图2

2.1 RIFF区块

1.RIFF区块以“RIFF”为标识,见图2第一个红色框标识。2.如图1所示RIFF包括ChunkID、ChunkSize、Format,具体的偏移地址、字节数及端序(大端或小端)见图1。

2.2 fmt区块

1.fmt区块以“fmt”为标识,见图2第二个红色框标识。2.fmt区块包括ID、Size(该区块数据的长度)、AudioFormat(音频格式)、NumChannels(声道数)、SampleRate(采样率)、ByteRate(每秒数据字节数)、BlockAlign、BitsPerSample(采样位数)等,具体的偏移地址、字节数及端序(大端或小端)见图1。

2.3 data区块

1.data区块以“data”为标识,见图2第三个红色框标识。2.data区块包括ID、Size(音频数据的长度)、data(音频数据)。

3.计算时长

    data区块里面的size表示所有音频数据的长度,fmt区块里面的ByteRate表示每秒数据字节数。所以音频时长可以通过(size/ByteRate)得到。

4.代码

/**
* 获取wav音频时长 ms
* @param wavdata wav音频文件字节数组
* @return
*/
public static long g
4000
etWavLength(byte[] wavdata) {
long start = SystemClock.uptimeMillis();
if (wavdata != null && wavdata.length > 44) {
int byteRate = bytes2ToInt(wavdata, 28, 31);
int waveSize = bytes2ToInt(wavdata, 40 , 43);
TestLog.d(TAG, TestLog.isDebug() ? "getWavLength:waveSize=" + waveSize + ",byteRate=" + byteRate : "");
TestLog.d(TAG, TestLog.isDebug() ? "getWavLength:len=" + waveSize * 1000 / byteRate : "");
return waveSize * 1000 / byteRate;
}
TestLog.d(TAG, TestLog.isDebug() ? "getWavLength:time=" + (SystemClock.uptimeMillis() - start) : "");
return 0;
}
        说明:用到的(28,31)、(40,43)是(偏移地址,偏移地址+字节数)。具体可在图1中查到。

6.参考

    1.http://soundfile.sapp.org/doc/WaveFormat/    2.https://www.jianshu.com/p/947528f3dff8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android WAV 音频时长