第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图像的物理现象 7
1.5图像的数值表示 8
1.5.1 RGB表示方式 8
1.5.2 YUV表示方式 9
1.5.3 YUV和RGB的转化 10
1.6视频的编码方式 10
1.6.1视频编码 10
1.6.2编码概念 11
1.7本章小结 13
第2章 移动端环境搭建 14
2.1在iOS上如何搭建一个基础项目 14
2.2在Android上如何搭建一个基础项目 21
2.3交叉编译的原理与实践 26
2.3.1交叉编译的原理 26
2.3.2 iOS平台交叉编译的实践 27
2.3.3 Android平台交叉编译的实践 33
2.3.4使用LAME编码MP3文件 38
2.4本章小结 42
第3章FFmpeg的介绍与使用 43
3.1 FFmpeg的编译与命令行工具的使用 43
3.1.1 FFmpeg的编译 43
3.1.2 FFmpeg命令行工具的使用 51
3.2 FFmpeg API的介绍与使用 60
3.3 FFmpeg源码结构 68
3.3.1 libavfonnat与libavcodec介绍 68
3.3.2 FFmpeg通用API分析 69
3.3.3调用FFmpeg解码时用到的函数分析 70
3.3.4调用FFmpeg编码时用到的函数分析 71
3.3.5面向对象的C语言设计 72
3.4本章小结 74
第4章 移动平台下的音视频渲染 75
4.1 AudioUnit介绍与实践 75
4.2 Android平台的音频渲染 84
4.2.1 AudioTrack的使用 85
4.2.2 OpenSL ES的使用 87
4.3视频渲染 90
4.3.1 OpenGL ES介绍 90
4.3.2 OpenGL ES的实践 91
4.3.3上下文环境搭建 98
4.3.4 OpenGL ES中的纹理 104
4.4本章小结 109
第5章 实现一款视频播放器 110
5.1架构设计 110
5.2解码模块的实现 115
5.3音频播放模块的实现 118
5.3.1 Android平台的音频渲染 118
5.3.2 iOS平台的音频渲染 119
5.4画面播放模块的实现 121
5.4.1 Android平台的视频渲染 121
5.4.2 iOS平台的视频渲染 122
5.5 AVSync模块的实现 124
5.5.1维护解码线程 124
5.5.2音视频同步 125
5.6中控系统串联起各个模块 127
5.6.1初始化阶段 127
5.6.2运行阶段 128
5.6.3销毁阶段 129
5.7本章小结 130
第6章 音视频的采集与编码 131
6.1音频的采集 131
6.1.1 Android平台的音频采集 131
6.1.2 iOS平台的音频采集 134
6.2视频画面的采集 137
6.2.1 Android平台的视频画面采集 137
6.2.2 iOS平台的视频画面采集 146
6.3音频的编码 156
6.3.1 libfdk aac编码AAC 156
6.3.2 Android平台的硬件编码器MediaCodec 158
6.3.3 iOS平台的硬件编码器AudioToolbox 161
6.4视频画面的编码 166
6.4.1 libx264编码H264 166
6.4.2 Android平台的硬件编码器MediaCodec 172
6.4.3 iOS平台的硬件编码器 175
6.5本章小结 184
第7章 实现一款视频录制应用 185
7.1视频录制的架构设计 185
7.2音频模块的实现 188
7.2.1音频队列的实现 189
7.2.2 Android平台的实现 191
7.2.3 iOS平台的实现 194
7.3音频编码模块的实现 198
7.3.1改造编码器 198
7.3.2编码器适配器 199
7.4画面采集与编码模块的实现 202
7.4.1视频队列的实现 202
7.4.2 Android平台画面编码后入队 203
7.4.3 iOS平台画面编码后入队 204
7.5 Mux模块 205
7.5.1初始化 206
7.5.2封装和输出 208
7.5.3销毁资源 212
7.6中控系统串联起各个模块 213
7.7本章小结 214
第8章音频效果器的介绍与实践 215
8.1数字音频基础 215
8.1.1波形图 215
8.1.2频谱图 217
8.1.3语谱图 219
8.1.4深入理解时域与频域 219
8.2数字音频处理:快速傅里叶变换 222
8.3基本乐理知识 229
8.3.1乐谱 229
8.3.2音符的音高与十二平均律 231
8.3.3音符的时值 233
8.3.4节拍 233
8.3.5 MIDI格式 234
8.4混音效果器 235
8.4.1均衡效果器 236
8.4.2压缩效果器 239
8.4.3混响效果器 240
8.5效果器实现 243
8.5.1 Android平台实现效果器 243
8.5.2 iOS平台实现效果器 252
8.6本章小结 255
第9章 视频效果器的介绍与实践 256
9.1图像处理的基本原理 256
9.1.1亮度调节 257
9.1.2对比度调节 258
9.1.3饱和度调节 259
9.2图像处理进阶 259
9.2.1图像的卷积过程 260
9.2.2锐化效果器 260
9.2.3高斯模糊算法 262
9.2.4双边滤波算法 263
9.2.5图层混合介绍 264
9.3使用FFmpeg内部的视频滤镜 266
9.3.1 FFmpeg视频滤镜介绍 266
9.3.2滤镜图的构建 267
9.3.3使用与销毁滤镜图 269
9.3.4常用滤镜介绍 270
9.4使用OpenGL ES实现视频滤镜 272
9.4.1加水印 273
9.4.2添加自定义文字 278
9.4.3美颜效果器 282
9.4.4动图贴纸效果器 284
9.4.5主题效果器 288
9.5本章小结 291
第10章 专业的视频录制应用实践 292
10.1视频硬件解码器的使用 292
10.1.1初始化信息准备 292
10.1.2 VideoToolbox解码H264 294
10.1.3 MediaCodec解码H264 298
10.2音频效果器的集成 304
10.2.1 Android音效处理系统的实现 305
10.2.2 iOS音效处理系统的实现 308
10.3一套跨平台的视频效果器的设计与实现 309
10.4将特效处理库集成到视频录制项目中 315
10.4.1 Android平台特效集成 316
10.4.2 iOS平台特效集成 321
10.5本章小结 325
第11章 直播应用的构建 327
11.1直播场景分析 327
11.2拉流播放器的构建 329
11.2.1 Android平台播放器增加后处理过程 329
11.2.2 iOS平台播放器增加后处理过程 332
11.3推流器的构建 335
11.4第三方云服务介绍 340
11.5礼物系统的实现 341
11.5.1 Cocos2dX项目的运行原理 342
11.5.2关键API详解 344
11.5.3实现一款动画 348
11.6聊天系统的实现 350
11.6.1 Android客户端的WebSocket实现 351
11.6.2 iOS客户端的WebSocket实现 352
11.7本章小结 353
第12章 直播应用中的关键处理 354
12.1直播应用的细节分析 354
12.1.1推流端细节分析 354
12.1.2拉流端细节分析 355
12.2推流端的关键处理 355
12.2.1自适应码率的实践 356
12.2.2统计数据保证后续的应对策略 361
12.3拉流端的关键处理 363
12.3.1重试机制的实践 364
12.3.2首屏时间的保证 366
12.3.3统计数据保证后续的应对策略 370
12.4本章小结 371
第13章 工欲善其事,必先利其器 372
13.1 Android平台工具详解 372
13.1.1 ADB工具的熟练使用 372
13.1.2 MAT工具检测Java端的内存泄漏 377
13.1.3 NDK工具详解 387
13.1.4 Native层的内存泄漏检测 389
13.1.5 breakpad收集线上Crash 396
13.2 iOS使用Instruments诊断应用 399
13.2.1 Debug Navigator 399
13.2.2 Time Profiler 400
13.2.3 Allocations 402
13.2.4 Leaks 403
13.3本章小结 405
附录A通过Ne10的交叉编译输入理解ndk-build 406
附录B编码器的使用细节 415
附录C视频的表示与编码 423