重磅推荐
【产品特色】


【编辑推荐】

1 一线专家和工程师陆其明、刘望舒 、许建林(Piasy)、房鹏联袂力荐
2 详解了Android音视频开发相关技术,从原理到案例展示了音视频开发的独特魅力,包含直播技术相关内容
3 本书分别介绍了音视频基础知识、MediaPlayer、MediaPlayerService、StagefrightPlayer、NuPlayer、OpenMAX框架、FFmpeg项目、FFmpeg源码分析及实战、直播技术、H.264编码及H.265编码、视频格式分析等内容


【内容简介】

近年来,直播、短视频行业的相关业务发展迅猛,本书主要介绍其中涉及的Android音视频开发相关技术。本书一共有11章,分别介绍了音视频基础知识、MediaPlayer、MediaPlayerService、StagefrightPlayer、NuPlayer、OpenMAX框架、FFmpeg项目、FFmpeg源码分析及实战、直播技术、H.264编码及H.265编码、视频格式分析内容。希望本书能帮助读者系统学习、化繁为简,在Android音视频开发的道路上不断进步。本书适合具有一定Android开发基础并且对音视频技术方向感兴趣的读者阅读。


【作者简介】

何俊林,曾就职于爱奇艺公司,先后参与过TV播放器业务和需求开发工作,以及TV新播放内核的开发和维护工作。主要研究方向为多媒体、音视频、Codec相关方向。长期在CSDN上坚持写博客,2016年获得CSDN音视频之星、年度博客之星等称号。热爱开源,乐于研究和分享技术。同时运营公众号“何俊林”,该公众号有4万多人关注。


【媒体评论】

多媒体技术是相当复杂的。你若深究,方知深不可测,必须找到一个合适的切入点。在移动互联网的时代背景下,如何快速开发音视频应用?有了本书的指引,这个问题就迎刃而解了。“Talk is cheap, show me the code.”便是作者的风格,也是本书给出的诚意满满的回答。 ——爱奇艺高级技术总监,陆其明
“一线经验 实例代码”,这是一本Android音视频开发技术的快速入门手册。

——LiveVideoStack音视频社区创始人,包研
随着直播和短视频的兴起,音视频已经是一个非常热门的技术领域,但是这个领域却几乎没有入门书籍,本书正好填补了这一空白。书中不仅介绍了Android系统的音视频相关框架,还介绍了其他主流的开源音视频框架和流媒体技术,是入门音视频开发技术的好书。
——《Android进阶之光》《Android进阶解密》作者,刘望舒
俊林兄是音视频开发领域的牛人,其公众号中分享过很多相关技术文章,而且内容比较成体系。这次他终于成功进阶为“有书人士”,这对广大读者来说是一个大好消息。本书系统地介绍了几大常用的播放器和框架,分析了它们的主体流程,而本书的后半部分还介绍了FFmpeg、直播、Codec、封装格式等内容,这些对音视频开发者来说都是很好的内容。
——Powerinfo公司研发总监,许建林(Piasy)
本书内容丰富、分析透彻,从应用到原理面面俱到,是一本很好的音视频开发工具书。
——腾讯音乐高级多媒体工程师,房鹏

【目录】

目  录


第1章 音视频基础知识 1
1.1 视频编码 1
1.2 音频编码 2
1.3 多媒体播放组件(Android、iOS) 2
1.4 常见的多媒体框架及解决方案 3
1.5 相关知识点 4
1.5.1 帧率 4
1.5.2 分辨率 4
1.5.3 刷新率 4
1.5.4 编码格式 4
1.5.5 封装格式 4
1.5.6 码率 5
1.5.7 画质与码率 5
1.5.8 DTS与PTS 5
1.5.9 YUV与RGB 5
1.5.10 视频帧及音频帧 5
1.5.11 量化精度 6
1.5.12 采样率 6
1.5.13 声道 6
第2章 常用的系统播放器MediaPlayer 8
2.1 状态图及生命周期 8
2.2 从创建到setDataSource过程 12
2.2.1 从创建到setDisplay过程 12
2.2.2 创建过程 13
2.2.3 setDataSource过程 16
2.2.4 setDisplay过程 20
2.3 开始prepare后的流程 22
2.4 C 中MediaPlayer的C/S架构 31
第3章 管理调度的服务者MediaPlayerService 40
3.1 Client/Server通过IPC的通信流程图 40
3.2 相关联的类图 42
3.3 产生过程 43
3.4 添加服务的过程 48
3.5 通过BinderDriver和MediaPlayer通信的过程 50
3.6 创建播放器 55
3.7 建立StageFright层交互 58
第4章 StagefrightPlayer(AwesomePlayer) 60
4.1 AwesomePlayer构造过程 60
4.2 AwesomePlayer使用MediaExtractor进行数据解析的过程 66
4.3 AwesomePlayer解码过程 69
4.3.1 AwesomePlayer中的prepare过程 69
4.3.2 初始化音视频解码器过程 73
4.3.3 使用OMXCodec的解码过程 75
4.4 AwesomePlayer的渲染输出过程 80
4.4.1 用一张图回顾数据处理过程 80
4.4.2 视频渲染器构建过程 81
4.4.3 将音频数据放到Buffer的过程 87
4.4.4 AudioPlayer在AwesomePlayer中的运行过程 91
4.4.5 音视频同步 93
4.4.6 音视频输出 96
4.5 概要总结 97
第5章 流媒体播放的新生力量NuPlayer 98
5.1 NuPlayer整体结构 98
5.2 NuPlayer的构建过程 100
5.3 NuPlayer的数据解析模块 102
5.4 NuPlayer的解码模块 107
5.5 NuPlayer的渲染模块 109
第6章 OpenMAX(OMX)框架 118
6.1 Codec部分中的AwesomePlayer到OMX服务 118
6.1.1 OpenMAX与StageFright框架层级的关系 118
6.1.2 OMX的初始化流程 120
6.1.3 OMX中NodeInstance列表的管理 127
6.1.4 OMX中NodeInstance节点的操作 127
6.1.5 总结AwesomePlayer到OMX服务过程 130
6.2 Codec部分中的OMXCodec与OMX事件回调流程 131
6.2.1 OMXCodec与OMX callback事件的处理时序图 132
6.2.2 如何从OMX中分发事件到OMXCodec 133
6.2.3 缓冲区更新过程 135
6.2.4 消息回调 137
6.3 MediaCodec相关知识 139
6.3.1 MediaCodec的基本认识 139
6.3.2 从创建到Start过程 148
6.3.3 MediaCodec到OMX框架过程 154
6.3.4 MediaCodec硬解码 158
第7章 FFmpeg项目 161
7.1 FFmpeg简介 161
7.2 在Windows下编译FFmpeg 163
7.2.1 MSYS2 164
7.2.2 Yasm 164
7.2.3 开始编译FFmpeg-3.1.3 166
7.2.4 创建shell编译脚本 167
7.2.5 编译动态库.so 169
7.2.6 编译静态库.a 171
7.3 在Linux下编译FFmpeg 172
7.3.1 在/etc/profile.d下配置环境变量 172
7.3.2 开始编译FFmpeg-3.1.3 174
7.3.3 编写shell脚本 175
7.3.4 编译动态库.so 176
7.3.5 编译静态库.a 178
7.4 在Mac OS下编译FFmpeg 179
7.4.1 下载源码及配置环境变量 179
7.4.2 开始编译FFmpeg-3.1.3 183
7.4.3 编写shell脚本 183
7.4.4 编译动态库.so 185
7.4.5 编译静态库.a 187
7.5 FFmpeg常用命令 189
7.5.1 改变帧率、码率和文件大小 189
7.5.2 调整视频分辨率 190
7.5.3 裁剪/填充视频 191
7.5.4 翻转和旋转视频 193
7.5.5 模糊和锐化视频 196
7.5.6 画中画 197
7.5.7 在视频上添加文字 201
7.5.8 文件格式转换 205
7.5.9 时间操作 207
第8章 FFmpeg源码分析及实战 208
8.1 FFmpeg常用结构体分析 208
8.1.1 AVFormatConext 209
8.1.2 AVInputFormat 211
8.1.3 AVStream 212
8.1.4 AVCodecContext 215
8.1.5 AVPacket 216
8.1.6 AVCodec 218
8.1.7 AVFrame 219
8.1.8 AVIOContext 222
8.1.9 URLProtocol 223
8.1.10 URLContext 224
8.2 FFmpeg关键函数介绍 225
8.2.1 av_register_all函数 225
8.2.2 avformat_alloc_context函数 226
8.2.3 avio_open函数 226
8.2.4 avformat_open_input函数 229
8.2.5 avformat_find_stream_info函数 232
8.2.6 av_read_frame函数 246
8.2.7 av_write_frame函数 252
8.2.8 avcodec_decode_video2函数 256
8.3 FFmpeg案例(代码实现) 264
8.3.1 利用FFmpeg转换格式 264
8.3.2 在实时流中抓取图像 269
8.3.3 在视频中加入水印 277
8.3.4 FFmpeg音频解码 288
8.3.5 FFmpeg视频解码 300
8.4 FFPlay原理 308
8.4.1 注册所有容器格式和Codec 309
8.4.2 打开流文件 309
8.4.3 读取数据 311
8.4.4 保存数据 318
8.4.5 音视频同步 322
8.4.6 音视频输出 326
第9章 直播技术 328
9.1 直播原理 328
9.2 直播架构 328
9.3 直播过程 329
9.3.1 采集数据 329
9.3.2 渲染处理 332
9.3.3 编码数据 333
9.3.4 推流 335
9.3.5 CDN分发 338
9.3.6 拉流 341
9.3.7 播放流数据 341
9.3.8 直播推流完整案例 343
9.4 流媒体服务器搭建 377
9.5 FFmpeg推流到流媒体服务器的过程 384
9.6 直播优化那些事 387
9.6.1 卡顿优化 387
9.6.2 延时优化 388
9.6.3 数据代理优化 389
9.6.4 首屏秒开优化 390
9.6.5 弱网优化 391
9.6.6 运营商劫持优化 391
9.6.7 CDN节点优化 393
第10章 H.264编码及H.265编码 395
10.1 H.264编码框架 395
10.2 H.264编码原理 395
10.3 H.264码流分析 397
10.3.1 H.264编码格式 397
10.3.2 NAL Header 397
10.3.3 H.264的传输 399
10.3.4 H.264码流结构 399
10.3.5 H.264的Level和Profile说明 406
10.4 H.265编码框架 408
10.4.1 背景知识 408
10.4.2 H.265码流结构 409
第11章 视频格式分析 414
11.1 MP4格式分析 414
11.1.1 Box结构 415
11.1.2 MP4总体结构 416
11.1.3 movie(moov)box 416
11.1.4 media box 418
11.1.5 sample table(stbl)box 420
11.2 FLV格式分析 422
11.2.1 FLV文件结构 422
11.2.2 File Header(文件头) 422
11.2.3 Body 423
11.2.4 Tag 423
11.3 F4V格式分析 428
11.3.1 file type box 429
11.3.2 movie box 430
11.3.3 movie header box 430
11.3.4 track box 430
11.3.5 media box 431
11.3.6 media information box 433
11.3.7 sample table box 433
11.4 TS格式分析 437
11.4.1 TS格式介绍 437
11.4.2 TS流包含的内容 438
11.4.3 TS包头解析 438
11.4.4 TS包传输部分 440
11.4.5 节目专用信息PSI(Program Specific Information) 440
11.5 AVI格式分析 444
11.5.1 AVI整体结构 445
11.5.2 AVI信息块('hdrl' LIST块) 446
11.5.3 AVI数据块('movi' LIST块) 447
11.5.4 AVI索引块('idxl'子块) 448
11.6 ASF格式分析 448
11.6.1 认识ASF 448
11.6.2 ASF文件整体结构 449


【前言】

前  言


从来没想到自己能出一本书。
写书是一件很考验人耐心的事情,从打算写一本书开始,我心里每时每刻都像有一块大石头压着一样。一要保证专业性,二要保证质量,同时还要考虑怎么表达才能让别人明白自己的意思,所以写书并没有那么简单。
近年来,直播、短视频行业的相关业务发展迅猛,很多人希望学习其中涉及的Android音视频开发相关知识,而Android音视频开发的难度相对较高,这让很多Android开发者望而却步。例如,音视频开发中很多有特色的或者核心的模块使用NDK开发,而NDK开发又主要使用C/C 语言编写代码,这对于使用Java语言的Android开发者来说有门槛。
我为什么要写这本书呢?对于音视频相关技术,网络上遍布零散的知识点,但没有一个成型的知识体系。很多朋友想学习和了解Android音视频开发,却不知道如何下手,所以我希望将自己的知识和经验整理成书,帮助读者系统学习、化繁为简,让大家在Android音视频开发的道路上不断进步。
本书概要
第1章:介绍了音视频基础知识,通过本章学习可以了解一些音视频的基础概念,让读者更好地系统掌握音视频相关知识。
第2章:介绍了Android应用层使用的系统播放器MediaPlayer。
第3章:介绍了Android多媒体管理调度的服务者MediaPlayerService,以及如何为多媒体播放提供服务。
第4章:介绍了Android系统中的StagefrightPlayer。在Android系统5.1版本之前,其扮演了重要的角色。
第5章:介绍了Android系统中的NuPlayer,其是流媒体播放的新生力量。在Android系统5.1版本之后(包含5.1版本),NuPlayer基于StagefrightPlayer的基础类进行构建,利用了更底层的ALooper/AHandler机制来异步解码播放。
第6章:介绍了OpenMAX(OMX)框架相关内容。OpenMAX是一个多媒体应用程序的标准,涉及OpenMAX IL API在Android应用程序、多媒体框架和编/解码库及其支持的组件(比如sources和sinks)之间建立统一的接口。
第7章:介绍了FFmpeg库在Windows、Mac OS及Linux下编译并移植的内容,同时介绍了FFmpeg常用的处理音视频的命令。
第8章:介绍了FFmpeg源码分析及实战开发案例。
第9章:介绍了直播技术,主要涉及直播原理、采集数据、编码、推流、播放等。同时提供了一个直播推流完整案例,可以实现一个简单的直播App。本章还介绍了直播过程中的优化方法,可帮助提升直播体验。
第10章:介绍了H.264码流结构及H.265码流结构。在音视频开发中,可以通过分析数据有无特殊性问题及异常问题来进行排查,帮助定位、修复问题。
第11章:介绍了常见的视频封装格式,以及对封装格式的原理和内部结构进行了分析。
读者对象
本书适合具有一定Android开发基础并且对音视频技术方向感兴趣的读者阅读,包括:
√ 从事Android多媒体开发工作的人。
√ 从事音视频开发工作的人。
√ 从事跨平台Android播放器开发工作的人。
√ 从Android开发想进阶至多媒体、音视频、直播领域的人。
√ 从事Android ROM开发中维护多媒体播放框架工作的人。
√ 对Android音视频、播放器、直播技术感兴趣的其他相关人士。
勘误和支持
由于作者的水平有限,书中难免会出现一些错误或者不准确的地方,恳请广大读者批评指正。
另外,我在自己的微信公众号“何俊林”中特意添加了一个新的菜单入口,专门用于展示书中的问题,欢迎读者查看。
如果在阅读本书的过程中,读者有任何疑问或希望和我交流,可以在公众号后台留言或者发邮件到hejunlin2013@gmail.com,我会一一回复。
致谢
首先要感谢我的家人,谢谢你们在写书期间默默支持着我,还要感谢电子工业出版社博文视点公司付睿老师的耐心校稿,以及感谢同行朋友与我就细节问题进行讨论和对本书的审校。没有你们,就没有本书的诞生,谢谢你们所有人。
读者服务
轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。
√ 提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。
√ 交流互动:在页面下方 读者评论 处留下您的疑问或观点,与我们和其他读者一同学习交流。
页面入口:http://www.broadview.com.cn/34996


返回顶部