什么是WAV和PCM?

WAV:wav是一种无损的音频文件格式,WAV符合 PIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。

PCM:PCM(Pulse Code Modulation----脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。

简单来说:wav是一种无损的音频文件格式,pcm是没有压缩的编码方式。

WAV和PCM的关系

WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。

简单来说:pcm是无损wav文件中音频数据的一种编码方式,但wav还可以用其它方式编码。

将录音写成wav格式的文件

有时候需要将录音文件保存为wav格式,这需要手动填充wav的文件头信息,整段代码非常简单,大致如下:

 private RandomAccessFile fopen(String path) throws IOException {
File f = new File(path); if (f.exists()) {
f.delete();
} else {
File parentDir = f.getParentFile();
if (!parentDir.exists()) {
parentDir.mkdirs();
}
} RandomAccessFile file = new RandomAccessFile(f, "rw");
// 16K、16bit、单声道
/* RIFF header */
file.writeBytes("RIFF"); // riff id
file.writeInt(); // riff chunk size *PLACEHOLDER*
file.writeBytes("WAVE"); // wave type /* fmt chunk */
file.writeBytes("fmt "); // fmt id
file.writeInt(Integer.reverseBytes()); // fmt chunk size
file.writeShort(Short.reverseBytes((short) )); // format: 1(PCM)
file.writeShort(Short.reverseBytes((short) )); // channels: 1
file.writeInt(Integer.reverseBytes()); // samples per second
file.writeInt(Integer.reverseBytes((int) ( * * / ))); // BPSecond
file.writeShort(Short.reverseBytes((short) ( * / ))); // BPSample
file.writeShort(Short.reverseBytes((short) ( * ))); // bPSample /* data chunk */
file.writeBytes("data"); // data id
file.writeInt(); // data chunk size *PLACEHOLDER* Log.d(TAG, "wav path: " + path);
return file;
} private void fwrite(RandomAccessFile file, byte[] data, int offset, int size) throws IOException {
file.write(data, offset, size);
Log.d(TAG, "fwrite: " + size);
} private void fclose(RandomAccessFile file) throws IOException {
try {
file.seek(); // riff chunk size
file.writeInt(Integer.reverseBytes((int) (file.length() - ))); file.seek(); // data chunk size
file.writeInt(Integer.reverseBytes((int) (file.length() - ))); Log.d(TAG, "wav size: " + file.length()); } finally {
file.close();
}
}

参考资料

作者:张明云
链接:https://www.jianshu.com/p/1d1f893e53e9
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

WAV和PCM的关系和区别的更多相关文章

  1. paip.java 以及JavaScript (js) 的关系以及区别

    paip.java 以及JavaScript (js) 的关系以及区别 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...

  2. 【转载】OLE DB, ADO, ODBC关系与区别

    原文:OLE DB, ADO, ODBC关系与区别 OLE DB, ADO, ODBC 一. ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(W ...

  3. CPU MPU MCU SOC SOPC关系及区别

    在嵌入式开过程,会经常接触到一些缩写术语概念,这些概念在嵌入式行业中使用率非常高,下面我们就解释一下这些概念之间的关系和区别: 1.CPU(Central Processing Unit),是一台计算 ...

  4. android 点滴记录 ICCID IMSI IMEI MEID 关系 和 区别,相关参数在什么情况下可以获取...

    1:ICCID:Integrate circuit card identity 集成电路卡识别码(固化在手机SIM卡中) ICCID为IC卡的唯一识别号码,共有20位数字组成,其编码格式为:XXXXX ...

  5. Linux 库函数与系统调用的关系与区别

    上周总结了<C 标准库的基础 IO>,其实这些功能函数通过「系统调用」也能实现相应功能.这次文章并不是要详细介绍各系统调用接口的使用方法,而是要深入理解「库函数」与「系统」调用之间的关系和 ...

  6. UIView的alpha、hidden和opaque属性之间的关系和区别[转]

    UIView的alpha.hidden和opaque属性之间的关系和区别 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/ ...

  7. Babel与Polyfill的关系和区别

    很多同学搞不清楚babel与polyfill的关系以及区别,这儿给大家细致解惑. Babel:Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码.注意:Babel 默 ...

  8. Flex,Flash,AS3,AIR的关系和区别

    转自:http://www.admin10000.com/document/156.html 本文详细介绍了 Flash.Flex.AS3.AIR 的关系和区别.希望对初学者有帮助. AS3 Acti ...

  9. LinkedList、ArrayList、Vector三者的关系与区别?

    LinkedList.ArrayList.Vector三者的关系与区别? 区分ArrayList,Vector,LinkedList的区别 ArrayList,Vector的区别: 1.出现版本:Ar ...

随机推荐

  1. Centos7部署ntp服务器同步时间以及直接将本地时间同步为北京时间

    一.查看配置 查看时区列表: timedatectl list-timezones|grep Asia 查看当前时间: date 查看当前设置: [root@localhost ~]# timedat ...

  2. slice.indices()/collections.Counter笔记

    关于slice.indices() >>> help(slice) Help on class slice in module builtins: class slice(objec ...

  3. ajaxFileupload 多文件上传

    ajaxFileupload 多文件上传 修改前的代码: var oldElement = jQuery('#' + fileElementId); var newElement = jQuery(o ...

  4. overflow标签

    有时父标签设置了固定的宽高,但子标签把父标签给撑开了,就要在父标签里加一个overflow标签,等于hidden超出的地方隐藏,等于auto超出的地方隐藏,并且多个滚动条 <div style= ...

  5. 手机开发者模型,上方显示p dx dy xv yv

    prs:当前压强 (红色的时候 表示 压强趋向稳定或达到最大压强)p:触碰点状况p:(x/y) x为当前监控的触摸点 y为当次触摸屏幕操作最大触摸点个数 你可以理解为 y是有多少根手指放过在屏幕上 x ...

  6. jenkins 邮件配置 二 ***

    Jenkins 有两种邮件通知方式: 1.Jenkins自带的“E-mail Notification” 2.插件:Extended E-mail Notification,是可编辑的邮件配置方式. ...

  7. Mysql binlog日志的介绍

    mysql的复制功能是  大规模,高性能应用的基础.  分担读负载.水平扩展 是通过二进制日志进行复制,是异步的. 只记录成功执行的修改事件,出现错误的和回滚的是不会纪录的. 日志路径 查看日志 RO ...

  8. 在MacOSX系统上的一些工具和问题汇总

    Android 模拟器 1. 安装模拟器 点击链接:https://cloud.genymotion.com/page/launchpad/download 需要先注册登录一下. 2.安装Virtua ...

  9. IDEA运行tomcat8.5.35源代码

    前提环境,安装和配置好java1.8+环境,maven,IDEA 1.下载Tomcat源代码:https://tomcat.apache.org/download-80.cgi#8.5.35 2.创建 ...

  10. 测试教程网.unittest教程.8. 断言异常

    From: http://www.testclass.net/pyunit/assert_raise/ 背景 我们有时候需要断言一些方法会抛出异常,这些异常需要符合我们的预期. 代码 新建test_e ...