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等。
WAV是微软公司开发的一种标准文件格式,所以WAV文件通常在Windows系统上使用较为广泛。而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;
}
}
原文地址:https://blog.csdn.net/weixin_44808225/article/details/134663900
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_38006.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!