PCM

PCM编码是直接存储声波采样被量化后所产生的非压缩数据,故被视为单纯的无损耗编码格式,其优点是可获得高质量的音频信号。
PCM是模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。

要将这样的信号转为 PCM 时,需要将声音量化,我们一般从如下几个维度描述一段声音:

1.声道数  2.采样位数  3.采样频率  4.时长

采样频率:即取样频率,指每秒钟取得声音样本的次数。采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。在16位声卡中有22KHz、44KHz等几级,其中,22KHz相当于普通FM广播的音质,44KHz已相当于CD音质了,目前的常用采样频率都不超过48KHz。
采样位数:即采样值或取样值(就是将采样样本幅度量化)。它是用来衡量声音波动变化的一个参数,也可以说是声卡的分辨率。它的数值越大,分辨率也就越高,所发出声音的能力越强。
声道数:很好理解,有单声道和立体声之分,单声道的声音只能使用一个喇叭发声(有的也处理成两个喇叭输出同一个声道的声音),立体声的PCM 可以使两个喇叭都发声(一般左右声道有分工) ,更能感受到空间效果。
时长: 采样时长

WAV

WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几。
WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种。
Wav File符合 RIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。数据块的记录方式是little-endian字节顺序,标志符并不是字符串而是单独的符号。
基于PCM编码的WAV格式是最基本的WAV格式,被声卡直接支持,能直接存储采样的声音数据,所存储的数据能直接通过声卡播放,还原的波形曲线与原始声音波形十分接近,播放的声音质量是一流的,在Windows平台下被支持得最好,常常被用作在其它编码的文件之间转换的中间文件。PCM的缺点是文件体积过大,不适合长时间记录。正因为如此,又出现了多种在PCM编码的基础上经改进发展起来的编码格式,如:DPCM,ADPCM编码等。

WAV和PCM的关系

前面也介绍到了,PCM 数据本身只是一个裸码流,它是由声道、采样位数、采样频率、时长共同决定的,因此我们至少要知道其中的三个才能将 PCM 所代表的数据提取出来。因此,纯PCM数据是无法播放的,因此还需要一段描述数据。计算机系统中的一个比较常见的做法是将PCM码流和描述信息封装在一起,形成一个音频文件。这样就可以直接播放了。一种常见的方式是使用wav格式定义的规范将PCM码流和描述信息封装起来。查看 PCM 和对应wav文件的 hex(16进制)文件,可以发现,wav文件只是在PCM文件的开头多了44字节,来表征其声道数、采样频率和采样位数等信息。这个其实和bmp非常类似。

经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.
44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);
22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;
每个采样数据记录的是振幅, 采样精度取决于储存空间的大小:
1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;
2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;
4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了.
如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍。

WAV格式头实现

import java.io.ByteArrayOutputStream;
import java.io.IOException;/*** WavHeader辅助类,用于生成头部信息*/
public class WavHeader {public final char fileID[] = {'R', 'I', 'F', 'F'};public int fileLength = 0;public char wavTag[] = {'W', 'A', 'V', 'E'};public char FmtHdrID[] = {'f', 'm', 't', ' '};public int FmtHdrLeth = 16;public short FormatTag = 1;public short Channels = 1;public int SamplesPerSec = 44100;public int AvgBytesPerSec = 88200;public short BlockAlign = 2;public short BitsPerSample = 16;public char DataHdrID[] = {'d','a','t','a'};public int DataHdrLeth = 0;public byte[] getHeader() throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();WriteChar(bos, fileID);WriteInt(bos, fileLength);WriteChar(bos, wavTag);WriteChar(bos, FmtHdrID);WriteInt(bos,FmtHdrLeth);WriteShort(bos,FormatTag);WriteShort(bos,Channels);WriteInt(bos,SamplesPerSec);WriteInt(bos,AvgBytesPerSec);WriteShort(bos,BlockAlign);WriteShort(bos,BitsPerSample);WriteChar(bos,DataHdrID);WriteInt(bos,DataHdrLeth);bos.flush();byte[] r = bos.toByteArray();bos.close();return r;}private void WriteShort(ByteArrayOutputStream bos, int s) throws IOException {byte[] mybyte = new byte[2];mybyte[1] =(byte)( (s << 16) >> 24 );mybyte[0] =(byte)( (s << 24) >> 24 );bos.write(mybyte);}private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {byte[] buf = new byte[4];buf[3] =(byte)( n >> 24 );buf[2] =(byte)( (n << 8) >> 24 );buf[1] =(byte)( (n << 16) >> 24 );buf[0] =(byte)( (n << 24) >> 24 );bos.write(buf);}private void WriteChar(ByteArrayOutputStream bos, char[] id) {for (int i=0; i<id.length; i++) {char c = id[i];bos.write(c);}}
}

参考链接:
https://www.jianshu.com/p/638fa13082eb
https://www.cnblogs.com/ranson7zop/p/7657874.html
https://www.cnblogs.com/wanggang123/p/5589488.html
https://blog.csdn.net/zhuweigangzwg/article/details/51499123

pcm格式封装wav相关推荐

  1. UNITY实战进阶-科大讯飞TTS(离线语音合成) unity播放PCM格式的wav(不依赖第三方库)-7

    准备工作 1.注册科大讯飞开发者账户 2.创建一个应用,获取APPID 3.下载离线sdk(你是什么平台的就下什么平台的) 4.开打压缩包 5.我们需要的文件         bin\msc.dll ...

  2. Android 音视频开发(一):PCM 格式音频的播放与采集

    什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...

  3. PCM音频文件(.wav)压缩成ADPCM(.wav)

    PCM音频文件压缩成adpcm格式的文件有多中方法(如使用ms ACM.sox等),本文主要介绍使用公开的算法(如下所示,如果需要可到网上搜一下: ========================== ...

  4. PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式

    本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...

  5. g711音频封装wav文件头格式

    g711音频封装wav文件头格式 之前的客户需求,平台音频不支持g711格式,只支持wav/mp3,wav格式封装比较简单,只需要在原始音频数据上封装一层wav头就可以,在此记录一下该模块接口.参考开 ...

  6. 音频格式简介和PCM转换成WAV

    1 音频格式简介 AudioRecord录制的音频文件格式为PCM,MediaPlayer无法播放PCM格式文件,AudioTrack可以播放PCM格式文件. PCM(Puls Code Modula ...

  7. 使用FFmpeg转换mp3或wav文件为pcm格式文件

    使用FFmpeg转换mp3或wav文件为pcm格式文件 由于项目开发中需要验证pcm格式音频的播放,可以使用FFmpeg进行转换 安装时这里推荐一个便捷方式,sudo apt install smpl ...

  8. 构建PCM格式WAV声音文件

    WAV声音文件是Windows系统早期就开始使用的一种声音文件格式,可以包含多种音频格式.其中PCM格式属于未压缩音频数据流,数据格式比较简单. 下面就生成PCM格式音频文件进行说明. PCM格式音频 ...

  9. Java实现PCM格式音频转MP3或WAV

    最近做语音合成的项目,需要把PCM格式的音频文件转换成MP3或WAV,记录一下. Java实现的PCM格式音频文件转换MP3格式 import java.io.FileInputStream; imp ...

最新文章

  1. java component创建_spring--打印hello--注解component--自动创建对象
  2. elasticsearch 5.6.x单机环境构建(集成head插件和IK中文分词)
  3. WPF应用程序内嵌网页
  4. oracle介质恢复的内部过程--推断与参考
  5. Apache Load Balance Using Haproxy
  6. asp.net页面回传与js调用服务端事件、PostBack的原理详解(转)
  7. 页面的数据缓存,包括文字和图片
  8. OpenStack 企业私有云的若干需求(1):Nova 虚机支持 GPU
  9. rapidxml对unicode的支持
  10. 【正点原子MP157连载】 第二十四章 DAC实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  11. 中国天气网城市代码表(MYSQL)
  12. SVN创建分支与分支合并主干
  13. 【评测】照胶的仪器选购
  14. 关于微信平台朋友和朋友圈分享不回调的问题。
  15. python音频处理库librosa基本操作
  16. Ubuntu上遇到Failed to construct device ‘usb-ehci‘ instance #0
  17. Android 62 自制域名解析 服务 花生壳太贵
  18. JS: 参数传递(值传递和引用传递)
  19. 鲲鹏服务器和英特尔服务器性能,华为服务器用的鲲鹏CPU与英特尔至强CPU,性能到底有多大差距?...
  20. gomod问题寻不到

热门文章

  1. 使用Angular cli(ng generate)创建组件、服务、类、路由、指令、管道
  2. 广告素材优选算法在内容营销中的应用实践
  3. MapReduce【数据清洗】
  4. 连接linux的一些工具
  5. linux服务器登录卡在last login的解决
  6. protues仿真技巧——元件制作
  7. POI获取excel日期格式并转换
  8. 【Selenium Grid 分布式测试】Selenium Grid-简介
  9. 前后端分离的Java微信小程序B2C商城 H5+APP源码
  10. FishC《零基础学习python》笔记--第007、008讲、009讲:了不起的分支和循环1、2、3