编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.原生相机采集流程
  • 02.音频基础知识点
  • 05.MediaPlayer原理

02.音频基础知识点

目录介绍

  • 01.音频开发业务
    • 1.1 音频播放
    • 1.2 音频编辑
    • 1.3 音频算法处理
    • 1.4 编解码和格式转换
    • 1.5 音频压缩
  • 02.了解基础概念
    • 2.1 采样率(samplerate)
    • 2.2 声道数(channels)
    • 2.3 音频帧(frame)
  • 03.音频压缩与编码
    • 3.1 音频压缩格式
    • 3.2 音频编码方式
    • 3.3 音频开发相关的API
    • 3.4 音频采集录制

01.音频开发业务

1.1 音频播放

可以直接看我的项目代码,基础播放功能有:播放,暂停,下一首,上一首;可以设置多种播放类型:顺序播放,随机播放,单曲循环

1.2 音频编辑

比如音频录音功能,录完后可以进行裁剪,编辑。比如喜马拉雅,懒人听书等等都有这个功能。

1.3 音频算法处理

目前音频算法处理的开源库有:speex、ffmpeg,webrtc等等。

可以使用FFmpeg框架,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

具体使用看官方网站:https://www.ffmpeg.org/

1.4 编解码和格式转换

1.5 音频压缩

后期研究,有点复杂,也没找到什么好的案例

02.了解基础概念

2.1 采样率(samplerate)

采样就是把模拟信号数字化的过程,不仅仅是音频需要采样,所有的模拟信号都需要通过采样转换为可以用0101来表示的数字信号,示意图如下所示:

图片采集于网络,只是作为学习使用

image
image
  • 蓝色代表模拟音频信号,红色的点代表采样得到的量化数值。
  • 采样频率越高,红色的间隔就越密集,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。

根据奈奎斯特理论,采样频率只要不低于音频信号最高频率的两倍,就可以无损失地还原原始的声音。

通常人耳能听到频率范围大约在20Hz~20kHz之间的声音,为了保证声音不失真,采样频率应在40kHz以上。

常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

2.2 声道数(channels)

音频的采集和播放是可以叠加的,因此,可以同时从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。

常见的有单声道(Mono)和双声道(Stereo)

2.3 音频帧(frame)

音频跟视频很不一样,视频每一帧就是一张图像,而从上面的正玄波可以看出,音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。

这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的,我们可以计算一下一帧音频帧的大小:

假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为:

int size = 8000 x 16bit x 0.02s x 2 = 5120 bit = 640 byte

03.音频压缩与编码

3.1 音频压缩格式

首先简单介绍一下音频数据压缩的最基本的原理:因为有冗余信息,所以可以压缩。

频谱掩蔽效应: 人耳所能察觉的声音信号的频率范围为20Hz~20KHz,在这个频率范围以外的音频信号属于冗余信号。

时域掩蔽效应: 当强音信号和弱音信号同时出现时,弱信号会听不到,因此,弱音信号也属于冗余信号。

简单列出常见的音频压缩格式:MP3,AAC,OGG,WMA,Opus,FLAC,APE,m4a,AMR,等等

3.2 音频编码方式

模拟的音频信号转换为数字信号需要经过采样和量化,量化的过程被称之为编码,根据不同的量化策略,产生了许多不同的编码方式,常见的编码方式有:PCM 和 ADPCM,这些数据代表着无损的原始数字音频信号,添加一些文件头信息,就可以存储为WAV文件了,它是一种由微软和IBM联合开发的用于音频数字存储的标准,可以很容易地被解析和播放。

音频开发过程中,会经常涉及到WAV文件的读写,以验证采集、传输、接收的音频数据的正确性。

3.3 音频开发相关的API

  • 音频采集: MediaRecorder,AudioRecord
  • 音频播放: SoundPool,MediaPlayer,AudioTrack
  • 音频编解码: MediaCodec
  • NDK API: OpenSL ES

目前此开源项目采用MediaPlayer播放音频,采集使用AudioRecord

3.4 音频采集录制

这块没作为重点,如果想深入了解,可以参考大神博客:https://yq.aliyun.com/articles/8637

有点复杂……

5.2 参考链接

  • Android音频知识介绍-从AndroidRecord看起:https://www.jianshu.com/p/8da3cf058c0f
  • Android音频使用总结:http://blog.csdn.net/wenzhi20102321/article/details/53018738
  • 大神之作,Android MP3录音实现:http://www.cnblogs.com/ct2011/p/4080193.html
  • Android音频开发基础:http://blog.51cto.com/ticktick/1748506?spm=a2c4e.11153940.blogcont8637.16.305f9135xi03I2
  • Android音频焦点机制深入理解:http://blog.csdn.net/wusuobupo/article/details/53034506
  • Android音频框架笔记 :https://www.jianshu.com/p/9481b1482367
贡献者: yangchong211
上一篇
01.原生相机采集流程
下一篇
05.MediaPlayer原理