将PCM格式存储成WAV格式文件转载

原创
小哥 3年前 (2022-10-18) 阅读数 52 #大杂烩

将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文件

请给我们更多的指导请给我更多的指导请告诉我更多

在下一篇文章中,我将带来下一篇文章,我将在下一篇文章中带来下一篇文章  如何解析WAV格式文件

转载于:https://www.cnblogs.com/LiuYanYGZ/p/11240355.html

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门