将PCM格式存储成WAV格式文件转载
原创将PCM最受欢迎的中最受欢迎的最受欢迎的WAV格式文件
WAV比PCM多44字节(文件头位置更多)字节(头位置更多)
摘自:https://blog.csdn.net/u012173922/article/details/78849076
2017年12月20日 08:11:00 进行互动。进行互动。进行互动。互动。 阅读数 2815
版权所有:这是博主的原创文章,未经博主许可不得转载。 https://blog.csdn.net/u012173922/article/details/78849076
存储在数据库中:存储在数据库中:存储在数据库中
把PCM格式中的数据以存储格式存储为数据WAV格式化数据的思想是:先写报头,然后写数据块。
WAV格式可以分为两个部分。格式可以分为两个部分。该格式可以分为两个部分。格式可以分为两个部分。
1.:一个快速且功能丰富:一个快速且功能丰富:一个快速、功能丰富
2.数据块,原始数据块,原始数据块,原始PCM数据。
想要了解WAV对于您可以单击此处的格式,您可以单击此处 点击打开链接点击打开链接
下面是WAV文件结构图文档结构图
我们需要简单地解释一下这个图表的结构。
它可以分为三个部分。它可以分为三个部分。它们可以分为三个部分。它可以分为三个部分。
第一部分RIFF : ChunkID 存储了“RIFF字段,表示这是“”字段,表示它是RIFF“格式化文件。”格式化文件。“格式化文件。”格式化的文件。
ChunkSize 记录整个wav文件中的字节数。文件中的字节数。文件的字节数。
Format 存储了“WAVE字段,表示这是一个字段,表示它是一个字段,表示这是一个字段,表示这是一个wav文件。
第二部分fmt: 这部分的内容主要是记录采样率、通道数、量化精度等关键参数。
Subchunk1 ID 存储了“fmt”字段
Subchunk1 Size 存储“fmt“字段长度”字段长度“字段长度”字段长度
AudioFormat 存储 量化精度
Num Channels 存储声音通道数存储通道数
SampleRate 存储采样率存储采样率
ByteRate 客户端库和服务器库。客户端库和服务器库。 SampleRate NumChannels BitsPerSample/8
BlockAlign == NumChannels * BitsPerSample/8
BitsPerSample 8 bits = 8, 16 bits = 16, etc.
第三部分data : 用这种语言写的。语言是书面的。
Subchunk2 ID 存储“data”字段
Subchunk2Size 记录存储的二进制原始音频数据的长度
data 用这种语言写的。用语言写的。
:异步,非常快,由:异步,非常快,和按:异步,非常快,按wav用这种语言写的。用语言写的。
byte[] header = new byte[44];
//RIFF WAVE Chunk
// RIFF标签占用4个字节,标签占用4个字节,标记占用4个字节
header[0] = R;
header[1] = I;
header[2] = F;
header[3] = F;
//用这种语言写的。用语言写的。long:部分通过:异步,部分通过
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
//WAVE标签占用4个字节,标签占用4个字节,标记占用4个字节
header[8] = W;
header[9] = A;
header[10] = V;
header[11] = E;
//FMT Chunk
header[12] = f;
// fmt :异步,非常快。:异步且非常快。:异步,非常快。
header[13] = m;
header[14] = t;
header[15] = ;//过渡字节
//数据大小
header[16] = 16; // 4 bytes: size of fmt chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
//编码方式 10H为PCM编码格式
header[20] = 1; // format = 1
header[21] = 0;
//通道数
header[22] = (byte) channels;
header[23] = 0;
//:多线程,稳定,久经考验。
header[24] = (byte) (longSampleRate & 0xff);
header[25] = (byte) ((longSampleRate >> 8) & 0xff);
header[26] = (byte) ((longSampleRate >> 16) & 0xff);
header[27] = (byte) ((longSampleRate >> 24) & 0xff);
//音频数据传输速率音频数据传输速率,采样率*通道数*采样深度/8
header[28] = (byte) (byteRate & 0xff);
header[29] = (byte) ((byteRate >> 8) & 0xff);
header[30] = (byte) ((byteRate >> 16) & 0xff);
header[31] = (byte) ((byteRate >> 24) & 0xff);
// 确定系统一次将处理多少字节的数据、确定缓冲区、通道数量*采样位数
header[32] = (byte) (1 * 16 / 8);
header[33] = 0;
//驱动工具库的工具库驱动驱动的工具库
header[34] = 16;
header[35] = 0;
//Data chunk
header[36] = d;//data标记符
header[37] = a;
header[38] = t;
header[39] = a;
//数据长度
header[40] = (byte) (totalAudioLen & 0xff);
header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
out.write(header, 0, 44);
在解决了最大的难点后,很好地完成了以下工作。
世界上最受欢迎最受欢迎的
private void writeWav() {
fileTarget = new File(file, "audiotest.pcm");
fileWav = new File(file, "audiotest.wav");
if (!fileTarget.exists()) {
Log.e("tag", "微型相框。微框。微型相框。微帧。");
return;
}
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
try {
dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(fileTarget)));
dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileWav)));
int len = dataInputStream.available();
long totalAudioLen = 0;
long totalDataLen = totalAudioLen + 36;
long longSampleRate = 44100;
int channels = 1;
long byteRate = 16 * longSampleRate * channels / 8;
//写wav头部
writeWavHeader(dataOutputStream, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate);
byte[] bytes = new byte[bufferSize];
int lenthg = -1;
while ((lenthg = dataInputStream.read(bytes)) != -1) {
dataOutputStream.write(bytes, 0, lenthg);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dataInputStream.close();
dataOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private byte[] writeWavHeader(DataOutputStream dataOutputStream, long totalAudioLen, long totalDataLen, long longSampleRate,
int channels, long byteRate) throws IOException {
byte[] header = new byte[44];
//RIFF WAVE Chunk
// RIFF标签占用4个字节,标签占用4个字节,标记占用4个字节
header[0] = R;
header[1] = I;
header[2] = F;
header[3] = F;
//用这种语言写的。用语言写的。long:部分通过:异步,部分通过
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
//WAVE标签占用4个字节,标签占用4个字节,标记占用4个字节
header[8] = W;
header[9] = A;
header[10] = V;
header[11] = E;
//FMT Chunk
header[12] = f;
// fmt :异步,非常快。:异步且非常快。:异步,非常快。
header[13] = m;
header[14] = t;
header[15] = ;//过渡字节
//数据大小
header[16] = 16; // 4 bytes: size of fmt chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
//编码方式 10H为PCM编码格式
header[20] = 1; // format = 1
header[21] = 0;
//通道数
header[22] = (byte) channels;
header[23] = 0;
//:多线程,稳定,久经考验。
header[24] = (byte) (longSampleRate & 0xff);
header[25] = (byte) ((longSampleRate >> 8) & 0xff);
header[26] = (byte) ((longSampleRate >> 16) & 0xff);
header[27] = (byte) ((longSampleRate >> 24) & 0xff);
//音频数据传输速率音频数据传输速率,采样率*通道数*采样深度/8
header[28] = (byte) (byteRate & 0xff);
header[29] = (byte) ((byteRate >> 8) & 0xff);
header[30] = (byte) ((byteRate >> 16) & 0xff);
header[31] = (byte) ((byteRate >> 24) & 0xff);
// 确定系统一次将处理多少字节的数据、确定缓冲区、通道数量*采样位数
header[32] = (byte) (1 * 16 / 8);
header[33] = 0;
//驱动工具库的工具库驱动驱动的工具库
header[34] = 16;
header[35] = 0;
//Data chunk
header[36] = d;//data标记符
header[37] = a;
header[38] = t;
header[39] = a;
//数据长度
header[40] = (byte) (totalAudioLen & 0xff);
header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
dataOutputStream.write(header, 0, 44);
return header;
}
站在巨人的肩膀上站在巨人的肩膀上
请给我们更多的指导请给我更多的指导请告诉我更多
在下一篇文章中,我将带来下一篇文章,我将在下一篇文章中带来下一篇文章 如何解析WAV格式文件
转载于:https://www.cnblogs.com/LiuYanYGZ/p/11240355.html
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除