iOS音频能力提升——PCM基础

2018 年 1 月 15 日 CocoaChina 落影loyinglin

前言


  • 音频是移动端很重要的能力,像直播类、在线教育类、唱歌类、短视频类等APP,都离不开音频功能。

  • 具备音频相关知识与能力,对未来的职业发展有很大优势。

  • 本文主要围绕音频知识的基础——PCM,介绍PCM的原理和相关操作。

  • 声音是模拟的连续信号,而计算机只能离散的存储。为了使得计算机具备音频的能力,必须支持连续音频信号的离散化描述,而PCM具备这个能力。


正文


PCM脉冲编码调制(Pulse Code Modulation)


脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。



总结起来就是三个步骤:


  1. 抽样;

  2. 量化;

  3. 编码;


PCM基础概念


了解PCM的基本原理之后,再看看PCM衍生出来的常见概念。


1、声道;


录制和播放时,音频信号的数量。


2、采样率;


每秒从连续信号中提取并组成离散信号的采样个数,单位是赫兹(Hz);奈奎斯特采样定理:当采样频率大于声音最高频率的两倍,能完整的保留声音的信息。


3、采样深度;


量化的二进制位数,常为16位;


4、码率;


音频流每秒的大小,单位常用bps;一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的文件,码率为 44.1K×16×2 =1411.2 Kbps


PCM数据操作


了解完PCM的相关概念后,再来看看PCM相关的数据操作。


1、PCM混合;


重采样,对位相加,溢出处理;


2、单声道变立体声;


增加声道,复制数据;


3、立体声变单声道;


减少声道,声道混合或只取其一;


4、音量调整和静音;


改变量化值,对数优化,清零静音;


5、播放速率调整;


  1. 快放:相邻位合并,缩减长度;

  2. 慢放:长度增加,量化值不变;


PCM数据的操作,就是直接操作音频流数据,比如一个简单的音量变大操作:


    int16_t *curData = (int16_t *)ioData->mBuffers[0].mData;

    int size = ioData->mBuffers[0].mDataByteSize;

    

//     音量操作

    for (int pos = 0; pos < size; pos += 2, ++curData) {

        int data = *curData;


        { // 音量调整

            data = data * 2;

            // 溢出

            if (data > 32767) {

                data = 32767;

            }

            else if (data < -32768) {

                data = -32768;

            }

        }

        *curData = data;

    }


Audio Unit 播放 PCM


AudioStreamBasicDescription


iOS的音频描述结构体,包括解析音频数据需要的各种参数


  • mSampleRate:采样率

  • mFormatID:编码格式

  • mFormatFlags:数据格式;(L/R,整形or浮点)

  • mBytesPerPacket:每个Packet的Bytes数

  • mFramesPerPacket:每个Packet的帧数

  • mBytesPerFrame:每帧的Byte数

  • mChannelsPerFrame:每帧的声道数

  • mBitsPerChannel:每个声道的采样深度


立体声的PCM音频数据,通常是以L/R交替(左右声道交替)的方式存储。


在iOS平台可以通过设置kAudioFormatFlagIsNonInterleaved,使得左右声道的数据分别存储在AudioBufferList的两个AudioBuffers中。


由于硬件要求,录制和播放都是整形格式。但在音频处理的过程中, 音频数据可能会溢出(整形格式表示范围有限),故而有些处理需要用浮点数来进行。


总结


  • 本文源自中午分享的PPT内容,排版有所修改。

  • 希望看完本文的你,对PCM有初步的认识。

  • PCM的数据操作部分,可以把样例代码放到Audio Unit播放PCM文件demo的PlayCallback方法中,体会下效果。

登录查看更多
2

相关内容

环太平洋多媒体会议(PCM)是一个重要的年度国际会议,其组织为论坛,以讨论理论,实验和应用多媒体分析与处理领域的最新进展和研究成果。 官网地址:http://dblp.uni-trier.de/db/conf/pcm/
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【实用书】数据科学基础,484页pdf,Foundations of Data Science
专知会员服务
117+阅读 · 2020年5月28日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
111+阅读 · 2020年5月9日
深度学习自然语言处理概述,216页ppt,Jindřich Helcl
专知会员服务
212+阅读 · 2020年4月26日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
用于语音识别的数据增强
AI研习社
24+阅读 · 2019年6月5日
书单 | 语音研究进阶指南
微软研究院AI头条
12+阅读 · 2019年3月22日
一天精通无人中级篇:遥控器协议 S-BUS
无人机
51+阅读 · 2018年12月20日
最全数据科学学习资源:Python、线性代数、机器学习...
人工智能头条
11+阅读 · 2018年5月14日
改进语音识别性能的数据增强技巧
深度学习每日摘要
8+阅读 · 2018年4月22日
【基础数学】- 01
遇见数学
19+阅读 · 2017年7月25日
Mobile big data analysis with machine learning
Arxiv
6+阅读 · 2018年8月2日
VIP会员
相关资讯
用于语音识别的数据增强
AI研习社
24+阅读 · 2019年6月5日
书单 | 语音研究进阶指南
微软研究院AI头条
12+阅读 · 2019年3月22日
一天精通无人中级篇:遥控器协议 S-BUS
无人机
51+阅读 · 2018年12月20日
最全数据科学学习资源:Python、线性代数、机器学习...
人工智能头条
11+阅读 · 2018年5月14日
改进语音识别性能的数据增强技巧
深度学习每日摘要
8+阅读 · 2018年4月22日
【基础数学】- 01
遇见数学
19+阅读 · 2017年7月25日
Top
微信扫码咨询专知VIP会员