Android获取WAV音频时长

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)得到。

扫描二维码关注公众号,回复: 1426028 查看本文章

4.代码


/**
	 * 获取wav音频时长 ms
	 * @param wavdata wav音频文件字节数组
 	 * @return
	 */
	public static long getWavLength(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

猜你喜欢

转载自blog.csdn.net/tugele/article/details/79463087