下面这个方法就是如何读取一个WAV文件的头部:
private static final String RIFF_HEADER = "RIFF"
private static final String WAVE_HEADER = "WAVE"
private static final String FMT_HEADER = "fmt "
private static final String DATA_HEADER = "data"
private static final int HEADER_SIZE = 44
private static final String CHARSET = "ASCII"
/* ... */
public static WavInfo readHeader(InputStream wavStream) throws IOException,
DecoderException {
ByteBuffer buffer = ByteBuffer.allocate(HEADER_SIZE)
buffer.order(ByteOrder.LITTLE_ENDIAN)
wavStream.read(buffer.array(), buffer.arrayOffset(), buffer.capacity())
buffer.rewind()
buffer.position(buffer.position() + 20)
int format = buffer.getShort()
checkFormat(format == 1, "Unsupported encoding: " + format)// 1 means
// Linear
// PCM
int channels = buffer.getShort()
checkFormat(channels == 1 || channels == 2, "Unsupported channels: "
+ channels)
int rate = buffer.getInt()
checkFormat(rate <= 48000 &&rate >= 11025, "Unsupported rate: " + rate)
buffer.position(buffer.position() + 6)
int bits = buffer.getShort()
checkFormat(bits == 16, "Unsupported bits: " + bits)
int dataSize = 0
while (buffer.getInt() != 0x61746164) { // "data" marker
Log.d(TAG, "Skipping non-data chunk")
int size = buffer.getInt()
wavStream.skip(size)
buffer.rewind()
wavStream.read(buffer.array(), buffer.arrayOffset(), 8)
buffer.rewind()
}
dataSize = buffer.getInt()
checkFormat(dataSize >0, "wrong datasize: " + dataSize)
return new WavInfo(new FormatSpec(rate, channels == 2), dataSize)
}
上面的代码中,缺少的部分应该是显而易见的。正如你所看到的,仅仅支持16位,但在你可以修改代码以支持8位(AudioTrack不支持任何其他分辨率的)。
下面这个方法,则是用来读取文件剩余的部分 – 音频数据。
public static byte[] readWavPcm(WavInfo info, InputStream stream)
throws IOException {
byte[] data = new byte[info.getDataSize()]
stream.read(data, 0, data.length)
return data
}
我们读取的WavInfo结构体,包含采样率,分辨率和声道数已经足够让我们去播放我们读取的音频了。
如果我们不需要将全部音频数据一次性放入内存中,我们可以使用一个InputStream,一点一点地读取。
方法如下:1:在百度中搜索foobar2000软件。
2:然后任意选择一个中文版的进行下载(中文版比较好 *** 作)。3:下载完直接点击“下一步”进行安装,安装完成后打开该软件。4:点击菜单中的“文件”—“添加文件”。
5:将要删除标题的wav文件添加进去。6:选中该文件,鼠标右键—标签—从freedb获取标签。7:等查询完成后,在d出的窗口中选择相应的中文名称的一行。8:选择后,点击标题下面的名称。
9:然后删除,最后点击窗口下面的“更新文件”即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)