本文转自:http://ticktick.blog.51cto.com/823160/1752947
无论是文字、图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 YUV、Bitmap,而对于音频来说,最简单常见的格式就是 wav 格式了。
wav 格式,与 bitmap 一样,都是微软开发的一种文件格式规范,它们都有一个相似之处,就是整个文件分为两部分,第一部分是“文件头”,记录重要的参数信息,对于音频而言,就包括:采样率、通道数、位宽等等,对于图像而言,就包括:图像的宽高、色彩位数等等;第二部分是“数据块”,即一帧一帧的二进制数据,对于音频而言,就是原始的 PCM 数据;对于图像而言,就是 RGB 数据。
/*
* COPYRIGHT NOTICE
* Copyright (C) 2016, Jhuster <lujun.hust@gmail.com>
* https://github.com/Jhuster/AudioDemo
*
* @license under the Apache License, Version 2.0
*
* @file WavFileHeader.java
*
* @version 1.0
* @author Jhuster
* @date 2016/03/19
*/
package com.jhuster.audiodemo.api;
public class WavFileHeader {
public String mChunkID = "RIFF";
public int mChunkSize = 0;
public String mFormat = "WAVE";
public String mSubChunk1ID = "fmt ";
public int mSubChunk1Size = 16;
public short mAudioFormat = 1;
public short mNumChannel = 1;
public int mSampleRate = 8000;
public int mByteRate = 0;
public short mBlockAlign = 0;
public short mBitsPerSample = 8;
public String mSubChunk2ID = "data";
public int mSubChunk2Size = 0;
public WavFileHeader() {
}
public WavFileHeader(int sampleRateInHz, int bitsPerSample, int channels) {
mSampleRate = sampleRateInHz;
mBitsPerSample = (short)bitsPerSample;
mNumChannel = (short)channels;
mByteRate = mSampleRate*mNumChannel*mBitsPerSample/8;
mBlockAlign = (short)(mNumChannel*mBitsPerSample/8);
}
}
private static byte[] intToByteArray(int data) {
return ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(data).array();
}
private static byte[] shortToByteArray(short data) {
return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(data).array();
}
private static short byteArrayToShort(byte[] b) {
return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getShort();
}
private static int byteArrayToInt(byte[] b) {
return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getInt();
}