[套装书]FFmpeg从入门到精通+音视频开发进阶指南:基于Android与iOS平台的实践

更多详情

内容简介: FFmpeg从入门到精通
本书是一本介绍FFmpeg的实战技术指南,全书共10章,分为两个部分,主要讲解如何使用FFmpeg进行开发。第一部分(第1~7章)为FFmpeg的命令行使用篇,介绍了FFmpeg的基础组成部分、FFmpeg工具使用、FFmpeg的封装操作、FFmpeg的转码操作、FFmpeg的流媒体操作、FFmpeg的滤镜操作、FFmpeg的设备操作。第二部分(第8~10章)为FFmpeg的API使用篇,介绍了FFmpeg封装部分的API使用操作、FFmpeg编解码部分的API使用操作,FFmpeg滤镜部分的API使用操作,相关操作均以实例方式进行说明,包括新API及旧API的操作。
音视频开发进阶指南:基于Android与iOS平台的实践
本书采用从零开始,逐级深入的方式写作,以项目实战为阶段性目标,外加实际生产环境下的特殊案例作为优化方案,让读者可以全方位掌握移动平台下音视频开发的大部分内容。首先介绍实现视频播放器和录制需要的基础知识,然后通过案例讲解如何实现视频播放器和一个视频录制的应用。但是一款录制的应用,要想上线,其实还要进行给音频视频美化,所以在提高篇,介绍了相应的内容,并给出了一个实际生产环境中的案例,之后,指导读者进阶,把前面学到的基础内容应用到直播中。后,给出排错方法和工具,和大家分享如何更有效率地开发应用程序。

目录: FFmpeg从入门到精通
本书赞誉
推荐序一
推荐序二
推荐序三
前言
第一部分 FFmpeg的命令行使用篇
第1章 FFmpeg简介 2
1.1 FFmpeg的定义 2
1.2 FFmpeg的历史 2
1.3 FFmpeg的基本组成 3
1.4 FFmpeg的编解码工具ffmpeg 6
1.5 FFmpeg的播放器ffplay 9
1.6 FFmpeg的多媒体分析器ffprobe 9
1.7 FFmpeg编译 11
1.7.1 FFmpeg之Windows平台编译 11
1.7.2 FFmpeg之Linux平台编译 13
1.7.3 FFmpeg之OS X平台编译 15
1.8 FFmpeg编码支持与定制 16
1.8.1 FFmpeg的编码器支持 24
1.8.2 FFmpeg的解码器支持 25
1.8.3 FFmpeg的封装支持 27
1.8.4 FFmpeg的解封装支持 28
1.8.5 FFmpeg的通信协议支持 29
1.9 小结 29
第2章 FFmpeg工具使用基础 30
2.1 ffmpeg常用命令 30
2.1.1 ffmpeg的封装转换 37
2.1.2 ffmpeg的转码参数 38
2.1.3 ffmpeg的基本转码原理 38
2.2 ffprobe常用命令 40
2.3 ffplay常用命令 50
2.3.1 ffplay常用参数 50
2.3.2 ffplay高级参数 53
2.3.3 ffplay的数据可视化分析应用 57
2.4 小结 59
第3章 FFmpeg 转封装 60
3.1 音视频文件转MP4格式 60
3.1.1 MP4格式标准介绍 61
3.1.2 MP4分析工具 76
3.1.3 MP4在FFmpeg中的Demuxer 79
3.1.4 MP4在FFmpeg中的Muxer 80
3.2 视频文件转FLV 84
3.2.1 FLV格式标准介绍 84
3.2.2 FFmpeg转FLV参数 89
3.2.3 FFmpeg文件转FLV举例 89
3.2.4 FFmpeg生成带关键索引的FLV 91
3.2.5 FLV文件格式分析工具 91
3.3 视频文件转M3U8 93
3.3.1 M3U8格式标准介绍 93
3.3.2 FFmpeg转HLS参数 95
3.3.3 FFmpeg转HLS举例 96
3.4 视频文件切片 105
3.4.1 FFmpeg切片segment参数 105
3.4.2 FFmpeg切片segment举例 106
3.4.3 FFmpeg使用ss与t参数进行切片 110
3.5 音视频文件音视频流抽取 111
3.5.1 FFmpeg抽取音视频文件中的AAC音频流 111
3.5.2 FFmpeg抽取音视频文件中的H.264视频流 112
3.5.3 FFmpeg抽取音视频文件中的H.265数据 113
3.6 系统资源使用情况 114
3.7 小结 115
第4章 FFmpeg转码 116
4.1 FFmpeg软编码H.264与H.265 116
4.1.1 x264编码参数简介 117
4.1.2 H.264编码举例 118
4.2 FFmpeg硬编解码 130
4.2.1 Nvidia GPU硬编解码 130
4.2.2 Intel QSV硬编码 133
4.2.3 树莓派硬编码 137
4.2.4 OS X系统硬编解码 139
4.3 FFmpeg输出MP3 141
4.3.1 MP3编码参数介绍 141
4.3.2 MP3的编码质量设置 142
4.3.3 平均码率编码参数ABR 144
4.4 FFmpeg输出AAC 145
4.4.1 FFmpeg中的AAC编码器使用 145
4.4.2 FDK AAC第三方的AAC编解码Codec库 146
4.4.3 高质量AAC设置 148
4.4.4 AAC音频质量对比 149
4.5 系统资源使用情况 149
4.6 小结 150
第5章 FFmpeg流媒体 151
5.1 FFmpeg发布与录制RTMP流 151
5.1.1 RTMP参数说明 152
5.1.2 RTMP参数举例 152
5.2 FFmpeg录制RTSP流 159
5.2.1 RTSP参数说明 159
5.2.2 RTSP参数使用举例 159
5.3 FFmpeg录制HTTP流 163
5.3.1 HTTP参数说明 163
5.3.2 HTTP参数使用举例 163
5.3.3 HTTP拉流录制 166
5.3.4 拉取HTTP中的流录制FLV 166
5.4 FFmpeg录制和发布UDP / TCP流 166
5.4.1 TCP与UDP参数说明 166
5.4.2 TCP参数使用举例 167
5.4.3 TCP/UDP使用小结 172
5.5 FFmpeg推多路流 173
5.5.1 管道方式输出多路流 173
5.5.2 tee封装格式输出多路流 174
5.5.3 tee协议输出多路流 175
5.6 FFmpeg生成HDS流 176
5.6.1 HDS参数说明 177
5.6.2 HDS使用举例 177
5.7 FFmpeg生成DASH流 179
5.7.1 DASH参数说明 180
5.7.2 DASH参数使用举例 180
5.8 小结 181
第6章 FFmpeg滤镜使用 182
6.1 FFmpeg滤镜Filter描述格式 182
6.1.1 FFmpeg滤镜Filter的参数排列方式 182
6.1.2 FFmpeg滤镜Filter时间内置变量 183
6.2 FFmpeg为视频加水印 183
6.2.1 文字水印 183
6.2.2 图片水印 187
6.3 FFmpeg生成画中画 189
6.4 FFmpeg视频多宫格处理 192
6.5 FFmpeg音频流滤镜操作 193
6.5.1 双声道合并单声道 193
6.5.2 双声道提取 194
6.5.3 双声道转双音频流 195
6.5.4 单声道转双声道 196
6.5.5 两个音频源合并双声道 197
6.5.6 多个音频合并为多声道 198
6.6 FFmpeg音频音量探测 199
6.6.1 音频音量获得 199
6.6.2 绘制音频波形 200
6.7 FFmpeg为视频加字幕 201
6.7.1 ASS字幕流写入视频流 201
6.7.2 ASS字幕流写入封装容器 202
6.8 FFmpeg视频抠图合并 205
6.9 FFmpeg 3D视频处理 206
6.9.1 stereo3d处理3D视频 206
6.9.2 3D图像转换举例 207
6.10 FFmpeg定时视频截图 208
6.10.1 vframe参数截取一张图片 208
6.10.2 fps滤镜定时获得图片 209
6.11 FFmpeg生成测试元数据 210
6.11.1 FFmpeg生成音频测试流 210
6.11.2 FFmpeg生成视频测试流 211
6.12 FFmpeg对音视频倍速处理 212
6.12.1 atempo音频倍速处理 212
6.12.2 setpts视频倍速处理 213
6.13 小结 215
第7章 FFmpeg采集设备 216
7.1 FFmpeg中Linux设备操作 216
7.1.1 Linux下查看设备列表 216
7.1.2 Linux采集设备fbdev参数说明 217
7.1.3 Linux采集设备fbdev使用举例 217
7.1.4 Linux采集设备v4l2参数说明 218
7.1.5 Linux采集设备v4l2使用举例 218
7.1.6 Linux采集设备x11grab参数说明 220
7.1.7 Linux采集设备x11grab使用举例 220
7.2 FFmpeg中OS X设备操作 222
7.2.1 OS X下查看设备列表 223
7.2.2 OS X下设备采集举例 223
7.3 FFmpeg中Windows设备操作 227
7.3.1 FFmpeg使用dshow采集音视频设备 227
7.3.2 FFmpeg使用vfwcap采集视频设备 228
7.3.3 FFmpeg使用gdigrab采集窗口 229
7.4 小结 230
第二部分 FFmpeg的API使用篇
第8章 FFmpeg接口libavformat的使用 232
8.1 音视频流封装 232
8.2 音视频文件解封装 235
8.3 音视频文件转封装 237
8.4 视频截取 240
8.5 avio内存数据操作 242
8.6 小结 244
第9章 FFmpeg接口libavcodec的使用 245
9.1 FFmpeg旧接口的使用 245
9.1.1 FFmpeg旧接口视频解码 245
9.1.2 FFmpeg旧接口视频编码 248
9.1.3 FFmpeg旧接口音频解码 251
9.1.4 FFmpeg旧接口音频编码 252
9.2 FFmpeg新接口的使用 254
9.2.1 FFmpeg新接口音频编码 255
9.2.2 FFmpeg新接口音频解码 257
9.2.3 FFmpeg新接口视频编码 260
9.2.4 FFmpeg新接口视频解码 260
9.3 小结 261
第10章 FFmpeg接口libavfilter的使用 262
10.1 filtergraph和filter简述 262
10.2 FFmpeg中预留的滤镜 263
10.2.1 音频滤镜 263
10.2.2 视频滤镜 265
10.3 avfilter流程图 271
10.4 使用滤镜加LOGO操作 272
10.5 小结 275
音视频开发进阶指南:基于Android与iOS平台的实践
推荐序一
推荐序二
前言
第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 libavformat与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

媒体评论: 金山云高级副总裁、合伙人梁守星
随着计算机网络和多媒体技术的飞速发展,视频作为富媒体的主要元素,成为了信息传递的主要方式,深刻地影响着我们的生活。在互联网流量中,尤其是移动互联网中,视频流媒体的占比已经超过70%。但由于视频相关技术(如编解码、流媒体传输等)入门门槛较高,导致从事视频行业的高端人才数量无法满足行业的发展需要。
刘歧曾经和我一起工作过,也是生活中的朋友,他对技术的执著是我非常赏识和佩服的,同时他为FFmpeg社区在国内的发展做出了很大贡献。
本书由浅入深地介绍了FFmpeg的使用方法,帮助读者更好地理解和掌握音视频相关的实际应用;相信本书将对音视频行业发展起到推动作用,让更多的人参与到音视频行业的创新发展中。如作者在书中所说,“FF”代表的是“Fast Forward”,我也希望读者通过对本书的学习,成长速度可以fast,faster,fastest。
云帆加速联合创始人CTO扶凯
我与武爱敏、刘歧和赵文杰都来自蓝汛,生活中是挚友,多年来我也一直在从事视频编解码相关的工作,经常与他们有联系和交流学习的机会。回想起2008年,彼时我在蓝汛负责过一段时间的视频编解码工作,后来在土豆也负责CDN和视频编解码相关业务,这些技术大多都是基于 FFmpeg。然而,当年一直苦于市面上没有好的中文指导资料,相关技术知识只能从国外的书刊中寻找。
因此我非常期待有一些中文的刊物,能对FFmpeg相关的技术进行深入和系统的介绍。如果当年有这本书的话,我相信能省下我或其他人非常多的时间。目前,中国在音视频方面的流量每年都有60%以上的增速,所以无论对于从业者技能提升还是相关领域技术学习,这本书都非常值得读者期待。
可喜的是,近年来中国的音视频技术在国际上是占有一席之地的。比如,目前一些国外 CDN 公司都不支持目前国内主流的直播流技术(如 rtmp 和 httpflv 流技术),刚好这几位是SRS的作者或推动者——他们推动了整个中国的直播和编解码技术的发展,改变了整个行业。我在研究音视频分布式的大规模分布式转码技术时,与刘歧曾进行过深入的交流,对于他们的技术和实力是有目共睹的。值得一提的是,目前包括我们公司在内的中国众多点播直播领域企业,都在使用或者学习FFmpeg基于开源所提供的技术,以便为市场提供良好的服务。
我相信本书能对视频行业产生极为正面的影响,并且也一定能带动当下中国点播直播技术、H.265 编码技术和VR等技术获得更大的发展。他们编写这本 FFmpeg 的书,是对知识的尊重,是对价值的渴望。我希望从这本书开始,中国在视频领域的技术能逐步赶超国际水平,做一些创新甚至颠覆的事情。我强烈推荐这本书给大家,我能学习到很多,也希望你们受益。
熊猫TV CTO黄欢
FFmpeg是一个功能完备,稳定性强的音视频处理开源项目。但由于其庞大的工程量,复杂的系统构架,以及繁多的参数设置。让一些刚刚接触音视频开发的开发人员不知从何下手。本书由参数入手,细致地讲解了参数背后的原理。让开发人员可以由浅入深的了解音视频开发知识。从FFmpeg安装、转格式、转码起步,深入地分析了FFmpeg所支持的常用格式的结构,对于FLV、MP4 等常用文件格式,细致到每一位进行了详细的说明。编解码方面,本书也细致地讲解了各种编码标准,软硬编解码的使用和转编码中容易遇到的问题和误区。传输方面,不仅对于目前常用的直播点播进行了具体的分析,还对多路处理等问题进行了深入剖析。在图像以及音频处理方面,更是细致地解释了常用的处理操作。总体而言,本书为音视频开发入门铺垫了道路,也为深入理解音视频开发填平了坑点。
高升控股副总经理鄢涛
随着近几年直播、短视频等行业的兴起,流媒体技术越来越多地受到大家的重视。开源的FFmpeg系统,更是流媒体行业内大家学习和实践的最好工具。
刘歧从事流媒体行业多年,一路跳坑踩雷走过来,积累了丰富的行业和实战经验。本书从入门到实例,详细地介绍了在实践中的技术点,是初学者的带路导师,也是流媒体开发者不错的工具字典。期望通过本书,能让更多人更容易地参与到流媒体行业中来。
dotEngine创始人刘连响
FFmpeg被称作音视频应用程序的瑞士军刀,包含音视频采集、编码转化、音视频格式转化、视频滤镜、音频滤镜等功能,还可以进行视频裁剪、缩放、色域转换等一系列后期处理。可以说,无论你想要本地播片,还是转换视频格式,亦或是利用网络看视频,FFmpeg都可以胜任。三大视频播放流派MPC、MPlayer和VLC都和FFmpeg脱不开关系,而Chrome这样的能播放视频的浏览器,底层也是用了FFmpeg来处理音视频。
FFmpeg功能强大的同时也带来了复杂性,命令行参数众多,加上没有系统的教程,我也一直对学习FFmpeg的使用心怀抗拒,在经历了几次到处求命令行之后,最后终于花了一天的时间把FFmpeg官方的文档都看了一遍,在经历了一些练习后,基本能解决工作中遇到的FFmpeg的大部分问题。一些解决不了的问题会请教大师兄,这时候大师兄往往二话不说扔出一个命令行来,留下我辈后来者深深佩服。有些技术只会用一时,有些技术确可以用几十年,FFmpeg是可以用几十年的技术,花上几天学一个可以用几十年的技术是何等高的学习“性价比”。
这本书浅显易懂并能学以致用,只需要对音视频的编码和容器有基本了解就可以快速上手。首先总体讲了FFmpeg的包含的模块,编译安装,接下来对常用的命令行参数进行了讲解,最后部分针对API做了讲解,对于那些有命令行无法完成的任务和一定C语言开发能力的开发者来说,这部分是一个非常好的API开发入门。相信你跟着本书的示例代码练习下来之后会有跟我一样的感叹:原来用FFmpeg做出一个画中画效果和一个多宫格的播放效果这么简单。
大师兄常说的一句话是:独学而无友,则孤陋而寡闻。作为一本系统介绍FFmpeg知识的书,相信本书会是你的良师益友。