本文介绍: PCM是一种数字音频编码方式,即脉冲编码调制(Pulse Code Modulation)。PCM是一种将模拟信号转换成数字信号技术,主要用于数字音频存储传输。PCM在音频领域应用非常广泛,例如CD、DVD、数字广播数字电视等。PCM编码过程中,通过抽样量化编码三个步骤模拟信号转换数字信号。首先将模拟信号按照一定的时间间隔进行抽样,得到一系列数字量化值。然后将这些量化值按照预定的量化步长进行量化,将连续的模拟信号量化为离散的数字信号最后将这些数字信号进行编码和压缩,以减小数据量

pcmwav

pcm

PCM是一种数字音频编码方式,即脉冲编码调制(Pulse Code Modulation)。PCM是一种将模拟信号转换成数字信号的技术,主要用于数字音频的存储和传输。PCM在音频领域应用非常广泛,例如CD、DVD、数字广播、数字电视等。

PCM编码过程中,通过抽样、量化和编码三个步骤将模拟信号转换为数字信号。首先将模拟信号按照一定的时间间隔进行抽样,得到一系列数字量化值。然后将这些量化值按照预定的量化步长进行量化,将连续的模拟信号量化为离散的数字信号。最后将这些数字信号进行编码和压缩,以减小数据量

PCM具有保真度容错性好、抗干扰能力强等优点,适合于音乐语音等高保真度数字音频的处理和传输。缺点是数据量较大,需要较高的存储和传输带宽

wav 

WAV是一种音频文件格式全称为Waveform Audio File Format,中文名为波形音频文件格式。它是Windows操作系统默认的音频文件格式,通常用于存储质量的音频数据比如音乐录音等。

WAV文件的特点是无损压缩,即不会失去任何音频质量。它可以支持多种音频编码方式比如PCM编码和ADPCM编码等。由于WAV文件不进行任何压缩,所以它的文件大小相对较大,这也是WAV文件一个缺点。

除了音频数据外,WAV文件可以包含数据比如歌曲的歌手、专辑名称、发行日期信息。这些元数据可以帮助用户更好管理查找自己音乐文件

pcmwav区别

PCM和WAV都是数字音频的编码格式,但是它们之间有一些区别

  1. PCM是一种音频信号的编码方式,它将模拟音频信号转换成数字音频信号。而WAV是一种容器格式,它可以不同的编码格式的音频数据储存起来,比如PCM、MP3等。

  2. PCM是无损的编码格式,它将原始音频信号转换数值型数据储存。而WAV可以支持无损和有损的编码格式。

  3. PCM文件只储存音频数据,没有元数据。而WAV文件可以包含音频数据、元数据、文本等。

  4. WAV是微软公司开发的一种标准文件格式,所以WAV文件通常在Windows系统使用较为广泛。而PCM是编码方式,不属于某一种文件格式

  5. 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;
    }
}

原文地址:https://blog.csdn.net/weixin_44808225/article/details/134663900

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_38006.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注