JavaDemo——pcm转wav

本文详细介绍了如何将PCM格式的音频文件转换为WAV格式。通过Java代码示例,解释了WAV文件的结构,包括RIFF、WAVE、fmt和data标记的使用,以及如何设置采样率、通道数和比特率等参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wav格式只是在pcm的前面加了一个头信息;

 

Demo:

/**
 * 2019年2月18日上午10:48:56
 */
package pcmToWav;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/**
 * @author XWF
 *
 */
public class PcmToWav {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		File pcmfile = new File("test.pcm");//8000Hz,单声道,16位pcm
		File wavfile = new File("test.wav");
		
		FileInputStream fis = new FileInputStream(pcmfile);
		
		byte channels = 1;
		int sampleRate = 8000;
		int byteRate = 16*sampleRate*channels/8;
		int datalen = (int)fis.getChannel().size();
		System.out.println(datalen);
		
		ByteBuffer bb = ByteBuffer.allocate(44);
		bb.order(ByteOrder.LITTLE_ENDIAN);
		bb.put(new byte[] {'R','I','F','F'});//RIFF标记
		bb.putInt(datalen+44-8);//原始数据长度(不包含RIFF和本字段共8个字节)
		bb.put(new byte[] {'W','A','V','E'});//WAVE标记
		
		bb.put(new byte[] {'f','m','t',' '});//fmt标记
		bb.putInt(16);//“fmt”字段的长度,存储该子块的字节数(不含前面的Subchunk1ID和Subchunk1Size这8个字节)
		bb.putShort((short)1);//存储音频文件的编码格式,PCM其存储值为1
		bb.putShort((short)1);//通道数,单通道(Mono)值为1,双通道(Stereo)值为2
		//采样率
		bb.putInt(sampleRate);
		//音频数据传送速率,采样率*通道数*采样深度/8。(每秒存储的bit数,其值=SampleRate * NumChannels * BitsPerSample/8)
		bb.putInt(byteRate);
		//块对齐/帧大小,NumChannels * BitsPerSample/8
		bb.putShort((short)(1*16/8));
		//pcm数据位数,一般为8,16,32等
		bb.putShort((short)16);
		
		bb.put(new byte[] {'d','a','t','a'});//data标记
		bb.putInt(datalen);//data数据长度
		byte[] header = bb.array();
		for(int i=0;i<header.length;i++) {
			System.out.printf("%02x ",header[i]);
		}
		System.out.println();
		
		ByteBuffer wavbuff = ByteBuffer.allocate(44+datalen);
		wavbuff.put(header);
		byte[] temp = new byte[datalen];
		fis.read(temp);
		wavbuff.put(temp);
		
		byte[] wavbytes = wavbuff.array();
		FileOutputStream fos = new FileOutputStream(wavfile);
		fos.write(wavbytes);
		fos.flush();
		fos.close();
		fis.close();
		System.out.println("finished.");
	}

}

 

结果:

 

参考:

 https://blog.youkuaiyun.com/u012173922/article/details/78849076

https://blog.youkuaiyun.com/u010011236/article/details/53026127

https://blog.youkuaiyun.com/pi9nc/article/details/12570841

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值