近年來,直播、短視頻行業(yè)的相關業(yè)務發(fā)展迅猛,本書主要介紹其中涉及的Android音視頻開發(fā)相關技術。本書一共有11章,分別介紹了音視頻基礎知識、MediaPlayer、MediaPlayerService、StagefrightPlayer、NuPlayer、OpenMAX框架、FFmpeg項目、FFmpeg源碼分析及實戰(zhàn)、直播技術、H.264編碼及H.265編碼、視頻格式分析內(nèi)容。希望本書能幫助讀者系統(tǒng)學習、化繁為簡,在Android音視頻開發(fā)的道路上不斷進步。本書適合具有一定Android開發(fā)基礎并且對音視頻技術方向感興趣的讀者閱讀。
1 一線專家和工程師陸其明、劉望舒 、許建林(Piasy)、房鵬聯(lián)袂力薦
2 詳解了Android音視頻開發(fā)相關技術,從原理到案例展示了音視頻開發(fā)的獨特魅力,包含直播技術相關內(nèi)容
3 本書分別介紹了音視頻基礎知識、MediaPlayer、MediaPlayerService、StagefrightPlayer、NuPlayer、OpenMAX框架、FFmpeg項目、FFmpeg源碼分析及實戰(zhàn)、直播技術、H.264編碼及H.265編碼、視頻格式分析等內(nèi)容
前 言
從來沒想到自己能出一本書。
寫書是一件很考驗人耐心的事情,從打算寫一本書開始,我心里每時每刻都像有一塊大石頭壓著一樣。一要保證專業(yè)性,二要保證質(zhì)量,同時還要考慮怎么表達才能讓別人明白自己的意思,所以寫書并沒有那么簡單。
近年來,直播、短視頻行業(yè)的相關業(yè)務發(fā)展迅猛,很多人希望學習其中涉及的Android音視頻開發(fā)相關知識,而Android音視頻開發(fā)的難度相對較高,這讓很多Android開發(fā)者望而卻步。例如,音視頻開發(fā)中很多有特色的或者核心的模塊使用NDK開發(fā),而NDK開發(fā)又主要使用C/C 語言編寫代碼,這對于使用Java語言的Android開發(fā)者來說有門檻。
我為什么要寫這本書呢?對于音視頻相關技術,網(wǎng)絡上遍布零散的知識點,但沒有一個成型的知識體系。很多朋友想學習和了解Android音視頻開發(fā),卻不知道如何下手,所以我希望將自己的知識和經(jīng)驗整理成書,幫助讀者系統(tǒng)學習、化繁為簡,讓大家在Android音視頻開發(fā)的道路上不斷進步。
本書概要
第1章:介紹了音視頻基礎知識,通過本章學習可以了解一些音視頻的基礎概念,讓讀者更好地系統(tǒng)掌握音視頻相關知識。
第2章:介紹了Android應用層使用的系統(tǒng)播放器MediaPlayer。
第3章:介紹了Android多媒體管理調(diào)度的服務者MediaPlayerService,以及如何為多媒體播放提供服務。
第4章:介紹了Android系統(tǒng)中的StagefrightPlayer。在Android系統(tǒng)5.1版本之前,其扮演了重要的角色。
第5章:介紹了Android系統(tǒng)中的NuPlayer,其是流媒體播放的新生力量。在Android系統(tǒng)5.1版本之后(包含5.1版本),NuPlayer基于StagefrightPlayer的基礎類進行構建,利用了更底層的ALooper/AHandler機制來異步解碼播放。
第6章:介紹了OpenMAX(OMX)框架相關內(nèi)容。OpenMAX是一個多媒體應用程序的標準,涉及OpenMAX IL API在Android應用程序、多媒體框架和編/解碼庫及其支持的組件(比如sources和sinks)之間建立統(tǒng)一的接口。
第7章:介紹了FFmpeg庫在Windows、Mac OS及Linux下編譯并移植的內(nèi)容,同時介紹了FFmpeg常用的處理音視頻的命令。
第8章:介紹了FFmpeg源碼分析及實戰(zhàn)開發(fā)案例。
第9章:介紹了直播技術,主要涉及直播原理、采集數(shù)據(jù)、編碼、推流、播放等。同時提供了一個直播推流完整案例,可以實現(xiàn)一個簡單的直播App。本章還介紹了直播過程中的優(yōu)化方法,可幫助提升直播體驗。
第10章:介紹了H.264碼流結(jié)構及H.265碼流結(jié)構。在音視頻開發(fā)中,可以通過分析數(shù)據(jù)有無特殊性問題及異常問題來進行排查,幫助定位、修復問題。
第11章:介紹了常見的視頻封裝格式,以及對封裝格式的原理和內(nèi)部結(jié)構進行了分析。
讀者對象
本書適合具有一定Android開發(fā)基礎并且對音視頻技術方向感興趣的讀者閱讀,包括:
? 從事Android多媒體開發(fā)工作的人。
? 從事音視頻開發(fā)工作的人。
? 從事跨平臺Android播放器開發(fā)工作的人。
? 從Android開發(fā)想進階至多媒體、音視頻、直播領域的人。
? 從事Android ROM開發(fā)中維護多媒體播放框架工作的人。
? 對Android音視頻、播放器、直播技術感興趣的其他相關人士。
勘誤和支持
由于作者的水平有限,書中難免會出現(xiàn)一些錯誤或者不準確的地方,懇請廣大讀者批評指正。
另外,我在自己的微信公眾號何俊林中特意添加了一個新的菜單入口,專門用于展示書中的問題,歡迎讀者查看。
如果在閱讀本書的過程中,讀者有任何疑問或希望和我交流,可以在公眾號后臺留言或者發(fā)郵件到hejunlin2013@gmail.com,我會一一回復。
致謝
首先要感謝我的家人,謝謝你們在寫書期間默默支持著我,還要感謝電子工業(yè)出版社博文視點公司付睿老師的耐心校稿,以及感謝同行朋友與我就細節(jié)問題進行討論和對本書的審校。沒有你們,就沒有本書的誕生,謝謝你們所有人。
讀者服務
輕松注冊成為博文視點社區(qū)用戶(www.broadview.com.cn),掃碼直達本書頁面。
? 提交勘誤:您對書中內(nèi)容的修改意見可在 提交勘誤 處提交,若被采納,將獲贈博文視點社區(qū)積分(在您購買電子書時,積分可用來抵扣相應金額)。
? 交流互動:在頁面下方 讀者評論 處留下您的疑問或觀點,與我們和其他讀者一同學習交流。
頁面入口:http://www.broadview.com.cn/34996
何俊林,曾就職于愛奇藝,先后參與TV播放器業(yè)務和需求開發(fā),以及TV新播放內(nèi)核開發(fā)和維護。主要研究方向為多媒體、音視頻、Codec相關方向。長期在CSDN上堅持寫博客,2016獲得CSDN音視頻之星、年度博客之星。愛好開源,樂于研究和分享技術。同時運營公號何俊林,超過4w 人關注。
目 錄
第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 畫質(zhì)與碼率5
1.5.8 DTS與PTS5
1.5.9 YUV與RGB5
1.5.10 視頻幀及音頻幀5
1.5.11 量化精度6
1.5.12 采樣率6
1.5.13 聲道6
第2章 常用的系統(tǒng)播放器MediaPlayer8
2.1 狀態(tài)圖及生命周期8
2.2 從創(chuàng)建到setDataSource過程12
2.2.1 從創(chuàng)建到setDisplay過程12
2.2.2 創(chuàng)建過程13
2.2.3 setDataSource過程16
2.2.4 setDisplay過程20
2.3 開始prepare后的流程22
2.4 C 中MediaPlayer的C/S架構31
第3章 管理調(diào)度的服務者MediaPlayerService40
3.1 Client/Server通過IPC的通信流程圖40
3.2 相關聯(lián)的類圖42
3.3 產(chǎn)生過程43
3.4 添加服務的過程48
3.5 通過BinderDriver和MediaPlayer通信的過程50
3.6 創(chuàng)建播放器55
3.7 建立StageFright層交互58
第4章 StagefrightPlayer(AwesomePlayer)60
4.1 AwesomePlayer構造過程60
4.2 AwesomePlayer使用MediaExtractor進行數(shù)據(jù)解析的過程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 用一張圖回顧數(shù)據(jù)處理過程80
4.4.2 視頻渲染器構建過程81
4.4.3 將音頻數(shù)據(jù)放到Buffer的過程87
4.4.4 AudioPlayer在AwesomePlayer中的運行過程91
4.4.5 音視頻同步93
4.4.6 音視頻輸出96
4.5 概要總結(jié)97
第5章 流媒體播放的新生力量NuPlayer98
5.1 NuPlayer整體結(jié)構98
5.2 NuPlayer的構建過程100
5.3 NuPlayer的數(shù)據(jù)解析模塊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節(jié)點的操作127
6.1.5 總結(jié)AwesomePlayer到OMX服務過程130
6.2 Codec部分中的OMXCodec與OMX事件回調(diào)流程131
6.2.1 OMXCodec與OMX callback事件的處理時序圖132
6.2.2 如何從OMX中分發(fā)事件到OMXCodec133
6.2.3 緩沖區(qū)更新過程135
6.2.4 消息回調(diào)137
6.3 MediaCodec相關知識139
6.3.1 MediaCodec的基本認識139
6.3.2 從創(chuàng)建到Start過程148
6.3.3 MediaCodec到OMX框架過程154
6.3.4 MediaCodec硬解碼158
第7章 FFmpeg項目161
7.1 FFmpeg簡介161
7.2 在Windows下編譯FFmpeg163
7.2.1 MSYS2164
7.2.2 Yasm164
7.2.3 開始編譯FFmpeg-3.1.3166
7.2.4 創(chuàng)建shell編譯腳本167
7.2.5 編譯動態(tài)庫.so169
7.2.6 編譯靜態(tài)庫.a171
7.3 在Linux下編譯FFmpeg172
7.3.1 在/etc/profile.d下配置環(huán)境變量172
7.3.2 開始編譯FFmpeg-3.1.3174
7.3.3 編寫shell腳本175
7.3.4 編譯動態(tài)庫.so176
7.3.5 編譯靜態(tài)庫.a178
7.4 在Mac OS下編譯FFmpeg179
7.4.1 下載源碼及配置環(huán)境變量179
7.4.2 開始編譯FFmpeg-3.1.3183
7.4.3 編寫shell腳本183
7.4.4 編譯動態(tài)庫.so185
7.4.5 編譯靜態(tài)庫.a187
7.5 FFmpeg常用命令189
7.5.1 改變幀率、碼率和文件大小189
7.5.2 調(diào)整視頻分辨率190
7.5.3 裁剪/填充視頻191
7.5.4 翻轉(zhuǎn)和旋轉(zhuǎn)視頻193
7.5.5 模糊和銳化視頻196
7.5.6 畫中畫197
7.5.7 在視頻上添加文字201
7.5.8 文件格式轉(zhuǎn)換205
7.5.9 時間操作207
第8章 FFmpeg源碼分析及實戰(zhàn)208
8.1 FFmpeg常用結(jié)構體分析208
8.1.1 AVFormatConext209
8.1.2 AVInputFormat211
8.1.3 AVStream212
8.1.4 AVCodecContext215
8.1.5 AVPacket216
8.1.6 AVCodec218
8.1.7 AVFrame219
8.1.8 AVIOContext222
8.1.9 URLProtocol223
8.1.10 URLContext224
8.2 FFmpeg關鍵函數(shù)介紹225
8.2.1 av_register_all函數(shù)225
8.2.2 avformat_alloc_context函數(shù)226
8.2.3 avio_open函數(shù)226
8.2.4 avformat_open_input函數(shù)229
8.2.5 avformat_find_stream_info函數(shù)232
8.2.6 av_read_frame函數(shù)246
8.2.7 av_write_frame函數(shù)252
8.2.8 avcodec_decode_video2函數(shù)256
8.3 FFmpeg案例(代碼實現(xiàn))264
8.3.1 利用FFmpeg轉(zhuǎn)換格式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 注冊所有容器格式和Codec309
8.4.2 打開流文件309
8.4.3 讀取數(shù)據(jù)311
8.4.4 保存數(shù)據(jù)318
8.4.5 音視頻同步322
8.4.6 音視頻輸出326
第9章 直播技術328
9.1 直播原理328
9.2 直播架構328
9.3 直播過程329
9.3.1 采集數(shù)據(jù)329
9.3.2 渲染處理332
9.3.3 編碼數(shù)據(jù)333
9.3.4 推流335
9.3.5 CDN分發(fā)338
9.3.6 拉流341
9.3.7 播放流數(shù)據(jù)341
9.3.8 直播推流完整案例343
9.4 流媒體服務器搭建377
9.5 FFmpeg推流到流媒體服務器的過程384
9.6 直播優(yōu)化那些事387
9.6.1 卡頓優(yōu)化387
9.6.2 延時優(yōu)化388
9.6.3 數(shù)據(jù)代理優(yōu)化389
9.6.4 首屏秒開優(yōu)化390
9.6.5 弱網(wǎng)優(yōu)化391
9.6.6 運營商劫持優(yōu)化391
9.6.7 CDN節(jié)點優(yōu)化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 Header397
10.3.3 H.264的傳輸399
10.3.4 H.264碼流結(jié)構399
10.3.5 H.264的Level和Profile說明406
10.4 H.265編碼框架408
10.4.1 背景知識408
10.4.2 H.265碼流結(jié)構409
第11章 視頻格式分析414
11.1 MP4格式分析414
11.1.1 Box結(jié)構415
11.1.2 MP4總體結(jié)構416
11.1.3 movie(moov)box416
11.1.4 media box418
11.1.5 sample table(stbl)box420
11.2 FLV格式分析422
11.2.1 FLV文件結(jié)構422
11.2.2 File Header(文件頭)422
11.2.3 Body423
11.2.4 Tag423
11.3 F4V格式分析428
11.3.1 file type box429
11.3.2 movie box430
11.3.3 movie header box430
11.3.4 track box430
11.3.5 media box431
11.3.6 media information box433
11.3.7 sample table box433
11.4 TS格式分析437
11.4.1 TS格式介紹437
11.4.2 TS流包含的內(nèi)容438
11.4.3 TS包頭解析438
11.4.4 TS包傳輸部分440
11.4.5 節(jié)目專用信息PSI(Program Specific Information)440
11.5 AVI格式分析444
11.5.1 AVI整體結(jié)構445
11.5.2 AVI信息塊('hdrl' LIST塊)446
11.5.3 AVI數(shù)據(jù)塊('movi' LIST塊)447
11.5.4 AVI索引塊('idxl'子塊)448
11.6 ASF格式分析448
11.6.1 認識ASF448
11.6.2 ASF文件整體結(jié)構449