目录

第1章 音视频基础概念介绍 1

1.1声音的物理性质 1

1.1.1声音是波 1

1.1.2 声波的三要素 2

1.1.3 声音的传播介质 3

1.1.4 回声 3

1.1.5 共鸣 4

1.2数字音频 4

1.3 音频编码 6

1.4 图像的物理现象 8

1.5图像的数值表示 9

1.5.1 RGB表示方式 9

1.5.2 YUV数值表示方式 10

1.5.3 YUV和RGB的转化 11

1.6视频的编码方式 12

1.6.1视频编码介绍 12

1.6.2编码概念介绍 13

1.7 本章小结 15

第2章 移动端环境搭建 15

2.1 iOS如何搭建一个基础项目 16

2.1.1 Hello world 16

2.1.2增加C++支持 22

2.2 Android如何搭建一个基础项目 23

2.2.1 Hello world 23

2.2.2 增加C++支持 27

2.3 交叉编译的原理与实践 29

2.3.1 交叉编译的原理 29

2.3.2 iOS平台交叉编译的实践 31

2.3.3 Android平台交叉编译的实践 37

2.3.4 使用lame进行编码mp3 43

2.4 本章小结 47

第3章 FFmpeg的介绍与使用 47

3.1 FFmpeg的编译与命令行使用 48

3.1.1 FFmpeg的编译 48

3.1.2 ffmpeg命令行工具使用 56

3.2 ffmpeg API的介绍与使用 66

1. 引用头文件 67

2. 注册协议、格式与编解码器 69

3. 打开媒体文件源,并设置超时回调 69

4. 寻找各个流,并且打开对应的解码器 69

5. 初始化解码后数据的结构体 70

6. 读取流内容并且解码 71

7. 处理解码后的裸数据 72

8. 关闭所有资源 74

3.3 ffmpeg源码结构介绍 75

3.3.1 libavformat与libavcodec介绍 75

3.3.2. ffmpeg通用API分析 76

3.3.3 调用FFmpeg解码时用到的函数分析 78

3.3.4 调用FFmpeg编码时用到的函数分析 79

3.3.5 面向对象的C语言设计 80

3.4 本章小结 82

第4章 移动平台下音视频渲染 82

4.1 AudioUnit介绍与实践 82

4.2 Android平台的音频渲染 92

4.2.1 AudioTrack的介绍与使用 93

4.2.2 OpenSL ES的介绍与使用 96

4.3 视频的渲染 99

4.3.1 OpenGL ES介绍 99

4.3.2 OpenGL ES的实践 100

4.3.3 上下文环境搭建 108

4.3.4 OpenGL ES中的纹理 114

第5章 实现一款视频播放器 119

5.1架构设计 120

5.2 解码模块的实现 125

5.3 音频播放模块的实现 128

5.3.1 Android平台的音频渲染 129

5.3.2 iOS平台的音频渲染 130

5.4 画面播放模块的实现 131

5.4.1 Android平台的视频渲染 131

5.4.2 iOS平台的视频渲染 133

5.5 AVSync模块的实现 135

5.5.1 维护解码线程 135

5.5.2 音视频同步 136

5.6 中控系统, 串联起各个模块 138

5.6.1 初始化阶段 138

5.6.2 运行阶段 140

5.6.3 销毁阶段 141

5.7 本章小结 141

第6章 音视频的采集与编码 142

6.1 音频的采集 142

6.1.1 Android平台的音频采集 143

6.1.2 iOS平台的音频采集 146

6.2 视频画面的采集 149

6.2.1 Android平台的视频画面采集 149

6.2.2 iOS平台的视频画面采集 159

6.3 音频的编码 171

6.3.1 libfdk_aac编码AAC 171

6.3.2 Android平台的硬件编码器MediaCodec 173

6.3.2 iOS平台的硬件编码器AudioToolbox 177

6.4 视频画面的编码 182

6.4.1 libx264编码H264 183

6.4.2 Android平台的硬件编码器 MediaCodec 189

6.4.3 iOS平台的硬件编码器 192

6.5 本章小结 202

第7章 实现一款视频录制应用 202

7.1 视频录制的架构设计 203

7.2 音频模块的实现 206

7.2.1 音频队列的实现 206

7.2.2 Android平台的实现 209

7.2.3 iOS平台的实现 213

7.3 音频编码模块的实现 217

7.3.1 改造编码器 218

7.3.2 编码器适配器 219

7.4 画面采集与编码模块的实现 221

7.4.1 视频队列的实现 222

7.4.2 Android平台画面编码后入队 223

7.4.3 iOS平台画面编码后入队 224

7.5 Mux模块 225

7.5.1 初始化 226

7.5.2 封装和输出 229

7.5.3 销毁资源 233

7.6 中控系统,串联起各个模块 234

第8章 音频效果器的介绍与实践 235

8.1数字音频基础 236

8.1.1波形图 236

8.1.2频谱图 237

8.1.3语谱图 239

8.1.4深入理解时域与频域 240

8.2 数字音频处理 243

8.2.1 快速傅里叶变换 243

8.3 基本乐理知识 250

8.3.1乐谱 250

8.3.2音符的音高与十二平均律 253

8.3.3 音符的时值 254

8.3.4 节拍 255

8.3.4 MIDI格式 256

8.4 混音效果器 258

8.4.1 均衡效果器 258

8.4.2 压缩效果器 262

8.4.3 混响效果器 264

8.5 效果器实现 267

8.5.1 Android平台的实现 267

8.5.2 iOS平台的实现 278

第9章 视频效果器的介绍与实践 282

9.1 图像处理的基本原理 282

9.1.1 亮度调节 283

9.1.2 对比度调节 284

9.1.3 饱和度调节 285

9.2 图像处理的进阶 286

9.2.1 图像的卷积过程 286

9.2.2 锐化效果器 287

9.2.3 高斯模糊算法 289

9.2.4 双边滤波算法 290

9.2.5 图层混合介绍 291

9.3 使用FFmpeg内部的视频滤镜 293

9.3.1 FFmpeg 视频滤镜的介绍 294

9.3.2 滤镜图的构建 295

9.3.3 使用与销毁滤镜图 297

9.3.4常用滤镜介绍 298

9.4 使用OpenGL ES实现视频滤镜 301

9.4.1 加水印 301

9.4.2 添加自定义文字 308

9.4.3 美颜效果器 312

9.4.4 动图贴纸效果器 314

9.4.5 主题效果器 319

9.5 本章小结 323

第10章 专业的视频录制应用实践 323

10.1 视频硬件解码器的使用 324

10.1.1 初始化信息准备 324

10.1.2 VideoToolbox解码H264 325

10.1.3 MediaCodec解码H264 330

10.2 音频效果器的集成 337

10.2.1 Android音效处理系统的实现 338

10.2.2 iOS音效处理系统的实现 341

10.3 一套跨平台的视频效果器的设计与实现 343

10.4集成特效处理库到视频录制项目 350

10.4.1 Android平台特效集成 350

10.4.2 iOS平台特效集成 356

10.5 本章小结 361

第11章 一个直播应用的构建 362

11.1 直播场景分析 362

11.2拉流播放器的构建 364

11.2.1 Android平台播放器增加后处理过程 364

11.2.2 iOS平台播放器增加后处理过程 368

11.3 推流器的构建 371

11.4 第三方云服务介绍 376

11.5 礼物系统的实现 378

11.5.1 Cocos2dX项目的运行原理 379

11.5.2 关键API详解 382

11.5.3实现一款动画 385

11.6 聊天系统的实现 388

11.6.1 Android客户端的WebSocket实现 389

11.6.2 iOS客户端的WebSocket实现 390

11.7 本章小结 391

第12章 直播应用中关键处理 392

12.1 直播应用的细节分析 393

12.2.1 推流端细节分析 393

12.2.2 拉流端细节分析 393

12.2 推流端的关键处理 394

12.2.1 自适应码率的实践 394

12.2.2 统计数据来保证后续的应对策略 401

12.3 拉流端的关键处理 403

12.3.1 重试机制的实践 404

12.3.2 首屏时间的保证 406

12.3.3 统计数据来保证后续的应对策略 411

12.4 本章小结 412

第13章 工欲善记其事,必先利其器 412

13.1 Android平台工具详解 413

13.1.1 ADB工具的熟练使用 413

13.1.2 MAT工具检测Java端的内存泄露 418

13.1.3 NDK工具详解 429

13.1.4 Native层的内存泄露检测 431

13.1.5 Breakpad收集线上Crash 438

13.2 iOS使用Instruments诊断你的应用 442

13.2.1 Debug Navigator 442

13.2.2 Time Profiler 444

13.2.3 Allocations 446

13.2.4 Leaks 447

附录A 通过Ne10的交叉编译输入理解ndk-build

附录B 编码器的使用细节

附录C 视频的表示与编码