http://blog.csdn.net/ljxt523/article/details/52068241

1. What is PCM?

PCM(Pulse-code-modulation)是模拟信号以固定的采样频率转换成数字信号后的表现形式。

Sample Rate : 
采样频率单位为:Hz。采样频率越高,音频质量越好,占用空间也越大。

Sign : 
音频数据是否是有符号的。通常情况下都是有符号的。若是将有符号的数据当做无符号的数据来处理将会使声音听来很刺

Sample Size : 
表示每一个采样数据的大小。通常该值为16-bit。

Byte Ordering : 
字节序指的是little-endian还是big-endian。表示音频数据的存储字节序。通常均为little-endian。

Number of Channels : 
标识音频是单声道(mono,1 channel)还是立体声(stereo,2 channels)。

通过以上五个数据我们就可以描述一个PCM数据,播放一个PCM数据需要的就是以上五个数据。

2. What does a PCM stream look like?

单声道:

  1.  
    +------+------+------+------+------+------+------+------+------+
  2.  
    | 500 | 300 | -100 | -20 | -300 | 900 | -200 | -50 | 250 |
  3.  
    +------+------+------+------+------+------+------+------+------+
  • 1
  • 2
  • 3

每个整数占据2个字节(16-bit),9个采样也就是18字节的数据。每个采样的整数大小最小为 -32768,最大为 32768 。根据采样数据的位置和值画一个图的话,就会得到像播放器上那样的波浪形图。

我们可以像下面伪代码示例这样将数据读入一个C语言数组 :

  1.  
    FILE *pcmfile
  2.  
    int16_t *pcmdata;
  3.  
    pcmfile = fopen(your pcm data file);
  4.  
    pcmdata = malloc(size of the file);
  5.  
    fread(pcmdata, sizeof(int16_t), size of file / sizeof(int16_t), pcmfile);
  • 1
  • 2
  • 3
  • 4
  • 5

如果我们将这些数据送入声卡,我们就可以听到声音。当然我们需要告诉声卡这些数据的采样率。若我们告知声卡的采样率大于数据本身的采样率,那么这些数据的播放速度会高于其原始的速度。就是快放的功能。

立体声:

  1.  
    +----------+----------+---------+----------+---------+----------+---------+----------+----------+
  2.  
    | LFrame1 | RFrame1 | LFrame2 | RFrame2 | LFrame3 | RFrame3 | LFrame4 | RFrame4 | LFrame5 |
  3.  
    +----------+----------+---------+----------+---------+----------+---------+----------+----------+
  • 1
  • 2
  • 3

每一个frame是一个16-bit的采样点。左右声道的数据交叉存放。

3. Basic Audio Effects – Volume Control

现在让我们来看一下一些真实的波形图。最简单的就是正弦波了。 

我们将波形的振幅扩大五倍,图形如下: 

所以如果要增加PCM数据的音量,只需要将每一个采样的数据乘以一个系数就行了。如果我们的PCM数据有2048个字节,则包含了1024个采样。我们用如下的伪代码来扩大音量 :

  1.  
    int16_t pcm[1024] = read in some pcm data;
  2.  
    for (ctr = 0; ctr < 1024; ctr++) {
  3.  
    pcm[ctr] *= 2;
  4.  
    }
  • 1
  • 2
  • 3
  • 4

音量控制就是这么简单,但是要注意两点:

  1. 若采样点的数据乘以扩大系数之后的值 小于 -32768 或 大于 32768 ,则此处采样的数值只能取 -32768 或 32768
  1.  
    int16_t pcm[1024] = read in some pcm data;
  2.  
    int32_t pcmval;
  3.  
    for (ctr = 0; ctr < 1024; ctr++) {
  4.  
    pcmval = pcm[ctr] * 2;
  5.  
    if (pcmval < 32767 && pcmval > -32768) {
  6.  
    pcm[ctr] = pcmval
  7.  
    } else if (pcmval > 32767) {
  8.  
    pcm[ctr] = 32767;
  9.  
    } else if (pcmval < -32768) {
  10.  
    pcm[ctr] = -32768;
  11.  
    }
  12.  
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. 我们将采样点的数据乘以2并不代表将声音的音量扩大了两倍,事实上也的确如此。声音音量的增益系数与音量的关系如图: 

以上内容翻译自:http://www.ypass.net/blog/2010/01/pcm-audio-part-3-basic-audio-effects-volume-control/

4. How to change PCM Sample Rate

根据定义,Sample Rate表示每秒钟的采样个数,所以若是要改变音频的采样频率,我们只需要对采样点做适当的丢弃或者复制就可以。

比如:原始音频为opus编码,单声道,采样率为48kHz,采样点大小为16-bit。如何得到编码为speex,采样率为16kHz,采样大小为16-bit的音频? 
我们需要以下几步:

    1. 将opus解码为PCM格式数据(叫做PCM1),此时的PCM1的采样率为48kHz
    2. 将PCM1的数据中第 3*n(n为从0开始的自然数) 个位置的采样点,丢弃3*n+1 和3*n+2位置的采样点。得到PCM2,此时的PCM2采样率为48kHz / 3 = 16kHz
    3. 将PCM2编码为speex数据

PCM音频数据格式介绍的更多相关文章

  1. SDL开发笔记(二):音频基础介绍、使用SDL播放音频

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. 使用AudioTrack播放PCM音频数据(android)

    众所周知,Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的.MediaPl ...

  3. PCM文件格式简单介绍

    PCM文件格式简单介绍 PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志.Windows的Convert工具能够把PCM音频格式的文件转换成M ...

  4. Android OpenSL ES 开发:OpenSL ES利用SoundTouch实现PCM音频的变速和变调

    缘由 OpenSL ES 学习到现在已经知道 OpenSL ES 不仅能播放和录制PCM音频数据,还能改变声音大小.设置左声道或右声道播放.还能变速播放,可谓是播放音频的王者.但是变速有一点不好的就是 ...

  5. 常用音频协议介绍&&有关音频编码的知识与技术参数

    (转载)常用音频协议介绍 会议电视常用音频协议介绍及对比白皮书 一.数字化音频原理:声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线.通常人耳可以听到的频率在20 ...

  6. 视音频数据处理入门:PCM音频采样数据处理

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  7. 使用WindowsAPI实现播放PCM音频的方法

    这篇文章主要介绍了使用WindowsAPI实现播放PCM音频的方法,很实用的一个功能,需要的朋友可以参考下 本文介绍了使用WindowsAPI实现播放PCM音频的方法,同前面一篇使用WindowsAP ...

  8. AudioRecord 录制播放PCM音频

    AudioRecord 与 MediaRecorder 区别 AudioRecord 基于字节流录制,输出的是pcm数据,未进行压缩,直接保存的pcm文件不能被播放器识别播放. 可以对音频文件进行实时 ...

  9. iOS 阶段学习第23天笔记(XML数据格式介绍)

    iOS学习(OC语言)知识点整理 一.XML数据格式介绍 1)概念:xml是extensible markup language扩展的标记语言,一般用来表示.传输和存储数据 2)xml与json目前使 ...

随机推荐

  1. debug console不见了

    点击左侧这个标志.

  2. 安卓 android studio 报错 The specified Android SDK Build Tools version (27.0.3) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle

    今天将项目迁移到另一台笔记本,进行build出现以下问题,导致build失败 报错截图: 大致意思,目前使用的build工具版本27.0.3不合适.因为当前使用Gradle插件版本是3.2.1,这个版 ...

  3. [LeetCode] 543. Diameter of Binary Tree 二叉树的直径

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  4. typeof与instanceof运算符

    typeof运算符用来判断某个变量的数据类型.typeof()返回值类型有如下几种: 1.number :数值类型 2.string :字符串类型 3.boolean :布尔型 4.function: ...

  5. FineUI window弹层设置

    需在页面先设置   <f:Window ID="Window1" runat="server" Height="600px" Widt ...

  6. spring整合quartz报错

    今天spring整合quartz报错,最后一步步排查,发现是和redis依赖冲突,最后redis升级了一下,问题解决. 总结:发现问题,逐一排查,如果是整合问题,报类加载不到的错误,大概率是和其他组件 ...

  7. RPC和RestFul

    什么是REST REST是一种架构风格,指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.REST规范把所有内容都视为资源,网络上一切皆资源. REST并没有创 ...

  8. Vue框架初识01

    摘要 vue简介 vue使用 一.Vue简介: 简介: Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 A ...

  9. exit status 1

  10. 【LEETCODE】48、867. Transpose Matrix

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...