pcm和wav
pcm
PCM是一种数字音频编码方式,即脉冲编码调制(Pulse Code Modulation)。PCM是一种将模拟信号转换成数字信号的技术,主要用于数字音频的存储和传输。PCM在音频领域的应用非常广泛,例如CD、DVD、数字广播、数字电视等。
PCM编码过程中,通过抽样、量化和编码三个步骤将模拟信号转换为数字信号。首先将模拟信号按照一定的时间间隔进行抽样,得到一系列数字量化值。然后将这些量化值按照预定的量化步长进行量化,将连续的模拟信号量化为离散的数字信号。最后将这些数字信号进行编码和压缩,以减小数据量。
PCM具有高保真度、容错性好、抗干扰能力强等优点,适合于音乐和语音等高保真度数字音频的处理和传输。缺点是数据量较大,需要较高的存储和传输带宽。
wav
WAV是一种音频文件格式,全称为Waveform Audio File Format,中文名为波形音频文件格式。它是Windows操作系统中默认的音频文件格式,通常用于存储高质量的音频数据,比如音乐、录音等。
WAV文件的特点是无损压缩,即不会失去任何音频质量。它可以支持多种音频编码方式,比如PCM编码和ADPCM编码等。由于WAV文件不进行任何压缩,所以它的文件大小相对较大,这也是WAV文件的一个缺点。
除了音频数据外,WAV文件还可以包含元数据,比如歌曲的歌手、专辑名称、发行日期等信息。这些元数据可以帮助用户更好地管理和查找自己的音乐文件。
pcm和wav的区别
PCM和WAV都是数字音频的编码格式,但是它们之间有一些区别:
PCM是一种音频信号的编码方式,它将模拟音频信号转换成数字音频信号。而WAV是一种容器格式,它可以将不同的编码格式的音频数据储存起来,比如PCM、MP3等。
PCM是无损的编码格式,它将原始音频信号转换为数值型数据储存。而WAV可以支持无损和有损的编码格式。
PCM文件只储存音频数据,没有元数据。而WAV文件可以包含音频数据、元数据、文本等。
WAV是微软公司开发的一种标准文件格式,所以WAV文件通常在Windows系统上使用较为广泛。而PCM是编码方式,不属于某一种文件格式。
WAV文件可以包含多种采样率和位深度的音频数据,而PCM只能够描述一种采样率和位深度的音频数据。
总之,PCM是一种音频信号的编码方式,而WAV是一种文件格式,可以储存不同编码格式的音频数据。在使用中,可以根据具体情况选择使用PCM还是WAV。
java编写添加音频头的代码
工具类
import lombok.extern.slf4j.Slf4j;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.File;
import java.io.IOException;@Slf4j
public class WavUtil {public static WavHead getWavHead(String file){WavHead oneHead = new WavHead();AudioInputStream audioInputStream = null;try {audioInputStream = AudioSystem.getAudioInputStream(new File(file));AudioFormat audioFormat = audioInputStream.getFormat();oneHead.setChannel(audioFormat.getChannels());oneHead.setSampleRate((int)(audioFormat.getSampleRate()));} catch (UnsupportedAudioFileException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return oneHead;}//file 是文件的路径,将文件装换成byte[]public static byte[] readWavFromFile(String file) {byte[] b = null;try {AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(file));AudioFormat audioFormat = audioInputStream.getFormat();Integer sampleRate = (int)(audioFormat.getSampleRate());long frameLength = audioInputStream.getFrameLength();int frameSize = audioFormat.getFrameSize();int channel = audioFormat.getChannels();int pcmlen = (int)frameLength*frameSize;log.info("sampleRate="+ sampleRate +" frameLength="+frameLength + " channel="+channel+" pcmlen="+pcmlen);int readlen = 0;if ((sampleRate==16000 || sampleRate==8000) && channel==1) {b = new byte[pcmlen];int byteLen = audioInputStream.read(b);System.out.println("pcmlen=" + pcmlen + " readlen=" + readlen);audioInputStream.close();}} catch (UnsupportedAudioFileException | IOException e) {e.printStackTrace();}return b;}public static byte[] createWavHeader(int fileSize) {int HEADER_SIZE = 44;byte[] header = new byte[HEADER_SIZE];// RIFF头header[0] = 'R';header[1] = 'I';header[2] = 'F';header[3] = 'F';setInt(header, 4, fileSize + HEADER_SIZE - 8);// FORMAT头header[8] = 'W';header[9] = 'A';header[10] = 'V';header[11] = 'E';header[12] = 'f';header[13] = 'm';header[14] = 't';header[15] = ' ';setInt(header, 16, 16);setShort(header, 20, (short) 1);setShort(header, 22, (short) 1);setInt(header, 24, 16000);setInt(header, 28, 16000 * 2);setShort(header, 32, (short) 2);setShort(header, 34, (short) 16);// DATA头header[36] = 'd';header[37] = 'a';header[38] = 't';header[39] = 'a';setInt(header, 40, fileSize);return header;}private static void setInt(byte[] bytes, int offset, int value) {bytes[offset] = (byte) (value & 0xFF);bytes[offset + 1] = (byte) ((value >> 8) & 0xFF);bytes[offset + 2] = (byte) ((value >> 16) & 0xFF);bytes[offset + 3] = (byte) ((value >> 24) & 0xFF);}private static void setShort(byte[] bytes, int offset, short value) {bytes[offset] = (byte) (value & 0xFF);bytes[offset + 1] = (byte) ((value >> 8) & 0xFF);}
}
pojo类
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class WavHead
{private int sampleRate;private int channel;public WavHead(){sampleRate = 0;channel = 0;}
}