本書采用從零開始,逐級深入的方式寫作,以項(xiàng)目實(shí)戰(zhàn)為階段性目標(biāo),外加實(shí)際生產(chǎn)環(huán)境下的特殊案例作為優(yōu)化方案,讓讀者可以全方位掌握移動(dòng)平臺(tái)下音視頻開發(fā)的大部分內(nèi)容。首先介紹實(shí)現(xiàn)視頻播放器和錄制需要的基礎(chǔ)知識,然后通過案例講解如何實(shí)現(xiàn)視頻播放器和一個(gè)視頻錄制的應(yīng)用。但是一款錄制的應(yīng)用,要想上線,其實(shí)還要進(jìn)行給音頻視頻美化,所以在提高篇,介紹了相應(yīng)的內(nèi)容,并給出了一個(gè)實(shí)際生產(chǎn)環(huán)境中的案例,之后,指導(dǎo)讀者進(jìn)階,把前面學(xué)到的基礎(chǔ)內(nèi)容應(yīng)用到直播中。后,給出排錯(cuò)方法和工具,和大家分享如何更有效率地開發(fā)應(yīng)用程序。
適讀人群:開發(fā)工程師,你們只需要一點(diǎn)移動(dòng)開發(fā)經(jīng)驗(yàn)就可以閱讀本書了;當(dāng)然如果你已經(jīng)是一個(gè)Senior的移動(dòng)開發(fā)工程師或者架構(gòu)師的話,那么你讀起來更會(huì)是游刃有余;再進(jìn)一步,如果你已
作者團(tuán)隊(duì)由來自國內(nèi)一線移動(dòng)互聯(lián)網(wǎng)公司的技術(shù)專家組成,不僅能確保內(nèi)容的專業(yè)性,而且能把實(shí)際一線豐富的經(jīng)驗(yàn)帶給讀者,并在github上開源了書中的所有項(xiàng)目,讓讀者可以更容易的集成到自己的App中,對于移動(dòng)端的音視頻開發(fā)者來講,這本書可以作為枕邊書。
Preface?前言為什么要寫這本書整個(gè)音視頻領(lǐng)域的架構(gòu)以及開發(fā)已經(jīng)演進(jìn)了很長時(shí)間,從最開始的廣電領(lǐng)域,到PC端的音視頻領(lǐng)域,再到本書所介紹的移動(dòng)端的音視頻領(lǐng)域。尤其在這幾年中,移動(dòng)端音視頻領(lǐng)域架構(gòu)的變化是巨大的。在移動(dòng)互聯(lián)網(wǎng)的發(fā)展熱潮中,我有幸從事了音視頻領(lǐng)域的設(shè)計(jì)與開發(fā),并且就職于最時(shí)尚的手機(jī)KTV——唱吧,這使得我開發(fā)出來的東西能夠服務(wù)于幾億用戶。對于音視頻的移動(dòng)端的應(yīng)用,不論是開發(fā)還是使用,在近兩年都達(dá)到了一個(gè)高峰,而作為一名工程師,如何高效地開發(fā)出一個(gè)音視頻App,是一件非常困難的事情,特別是對于不太了解音視頻概念的工程師。我從事軟件開發(fā)已有7年多的時(shí)間,接觸音視頻領(lǐng)域也已經(jīng)有5年多,在整個(gè)開發(fā)過程中,不同的時(shí)間段會(huì)遇到不同的挑戰(zhàn),尤其是在最開始涉足音視頻領(lǐng)域的時(shí)候,真可謂舉步維艱。首先,對于音視頻的基礎(chǔ)概念不是特別清楚,再者在工作中邊學(xué)邊做,很難對整個(gè)音視頻領(lǐng)域有一個(gè)全面的了解,并且市面上沒有相關(guān)成熟的資料從更高的層次來介紹音視頻領(lǐng)域在移動(dòng)端的演進(jìn)與發(fā)展。這幾年的設(shè)計(jì)實(shí)戰(zhàn)與開發(fā)經(jīng)驗(yàn),以及帶新人入門的眾多感觸,讓我有了寫這本書的動(dòng)力,同時(shí)也形成了這本書的核心內(nèi)容,我希望通過本書可以幫助更多想要在移動(dòng)端音視頻領(lǐng)域?qū)崿F(xiàn)自己想法的工程師,讓大家可以順利地建立起自己的音視頻App。我非常希望能為剛?cè)腴T的讀者或者遇到困難的讀者提供幫助,希望大家可以享受整個(gè)開發(fā)的過程,享受自己開發(fā)的產(chǎn)品為人們的生活帶來便利的成就感。另外,從整個(gè)音視頻開發(fā)領(lǐng)域來講,我也十分希望能夠通過本書貢獻(xiàn)出自己的綿薄之力。
讀者對象產(chǎn)品經(jīng)理,這部分讀者可以從中了解在移動(dòng)端進(jìn)行音視頻開發(fā)會(huì)遇到的很多問題以及對應(yīng)的優(yōu)化策略,例如:如何通過音視頻的統(tǒng)計(jì)數(shù)據(jù)為產(chǎn)品提供更加流暢的策略(視頻觀看的秒開、直播推流的流暢度、視頻上傳的成功率等)。
項(xiàng)目經(jīng)理,這部分讀者可以了解很多時(shí)下流行的名詞與概念,不再會(huì)因?yàn)閹讉(gè)專業(yè)名詞就讓自己不知所措,并且有助于更好地評估音視頻項(xiàng)目開發(fā)中的風(fēng)險(xiǎn)與進(jìn)度。
測試人員,這部分讀者可以學(xué)習(xí)在音視頻App中由于處理過程不同而導(dǎo)致的瓶頸問題,書中也提到了一些自動(dòng)化測試相關(guān)的命令以及工具,可以對CPU的負(fù)載情況、內(nèi)存的占用情況、內(nèi)存泄漏問題等進(jìn)行分析。
架構(gòu)師與工程師,這部分讀者只需要一點(diǎn)移動(dòng)開發(fā)經(jīng)驗(yàn)就可以閱讀本書了。當(dāng)然如果你已經(jīng)是一個(gè)高級移動(dòng)開發(fā)工程師或者架構(gòu)師,那么讀起本書來將更加游刃有余。再進(jìn)一步,如果你已經(jīng)是移動(dòng)領(lǐng)域的音視頻開發(fā)工程師了,那么恭喜你,我們之間將會(huì)有一場關(guān)于技術(shù)領(lǐng)域內(nèi)部的對話。
開設(shè)相關(guān)課程的高等院校。
如何閱讀本書為了避免說教式的講解帶來枯燥乏味的閱讀體驗(yàn),本書給出了大量的實(shí)例及生產(chǎn)環(huán)境下的案例。本書可分為四個(gè)部分:第一部分是入門,從理論基礎(chǔ)開始講解,最終會(huì)產(chǎn)生兩個(gè)實(shí)踐項(xiàng)目;第二部分是提高,基于第一部分的項(xiàng)目添加特效,形成一個(gè)完整的多媒體項(xiàng)目;第三部分是擴(kuò)展,結(jié)合當(dāng)下比較流行的直播場景進(jìn)行實(shí)際案例分析;第四部分是工具,介紹當(dāng)下大部分可以提高開發(fā)以及測試效率的工具。下面是各個(gè)章節(jié)的基本介紹。
第1章,介紹音視頻的基礎(chǔ)概念,其中包括音視頻的基礎(chǔ)數(shù)據(jù)格式、編碼后的數(shù)據(jù)格式以及不同格式之間的相互轉(zhuǎn)換等。
第2章,從零開始講解如何搭建一個(gè)iOS項(xiàng)目和一個(gè)Android項(xiàng)目,并且添加C++支持,因?yàn)樵谝粢曨l領(lǐng)域的開發(fā)中,有相當(dāng)一部分的代碼需要用C++來編寫,這樣就可以做到兩個(gè)平臺(tái)(Android和iOS平臺(tái))共用一套代碼倉庫,以提升開發(fā)效率。然后講解交叉編譯,因?yàn)樵谝粢曨l開發(fā)過程中會(huì)用到很多第三方開源庫,如果將這些庫編譯到我們的項(xiàng)目中,勢必要進(jìn)行交叉編譯,因此本章會(huì)重點(diǎn)講解這些內(nèi)容。
第3章,探討FFmpeg開源庫。對于音視頻開發(fā)來講,F(xiàn)Fmpeg開源庫是眾所周知也是普遍使用的。本章首先從編譯開始,接著是命令行使用,再到源碼結(jié)構(gòu),最后是API調(diào)用,以層層遞進(jìn)的方式對FFmpeg開源庫展開介紹。
第4章,講解如何利用各自平臺(tái)的API進(jìn)行聲音與畫面的渲染以及解碼,對于畫面的渲染,推薦使用OpenGL ES,兩個(gè)平臺(tái)可以使用同一個(gè)代碼倉庫。
第5章,實(shí)現(xiàn)一款視頻播放器。有了前四章的基礎(chǔ),我們已經(jīng)完全可以構(gòu)建起一個(gè)視頻播放器了。本書最大的特點(diǎn)就是經(jīng)過幾章基礎(chǔ)知識的學(xué)習(xí)立即開始一個(gè)項(xiàng)目的實(shí)踐,通過本章的視頻播放器項(xiàng)目,我們將會(huì)熟悉播放器是如何工作的。
第6章,重點(diǎn)介紹音視頻的采集與編碼器。特別是硬件編解碼器在各個(gè)平臺(tái)上的使用,使得應(yīng)用能夠更高效(耗電更少、發(fā)熱更少、界面更流暢)地運(yùn)行在用戶的手機(jī)上。
第7章,繼續(xù)開發(fā)一個(gè)視頻錄制的新項(xiàng)目,該項(xiàng)目可以使我們更加熟悉音視頻應(yīng)用在各個(gè)平臺(tái)下的實(shí)現(xiàn)。
第8章,講解如何處理音頻流。畢竟讓別人聽采集出來的干聲是很不禮貌的,本章將利用各種特效來美化采集的聲音。
第9章,講解如何處理視頻流,使視頻中的顏值變得更高,畢竟愛美之心人皆有之。
展曉凱
曾工作于淘寶,參與設(shè)計(jì)開發(fā)淘寶旅行的機(jī)票搜索業(yè)務(wù),曾就職于115網(wǎng)盤參與核心功能的研發(fā),現(xiàn)就職于北京*淘科技有限公司,任音視頻架構(gòu)師,在公司的唱吧、唱吧直播間、火星三條產(chǎn)品線都負(fù)責(zé)客戶端核心的架構(gòu)設(shè)計(jì)與開發(fā)工作,其中唱吧目前公布的數(shù)據(jù)已有幾億用戶,月活也在千萬量級。作者在工作與生活中非常樂于幫助同事與朋友,癡迷于互聯(lián)網(wǎng)可以推動(dòng)整個(gè)人類歷史的發(fā)展,同時(shí)作為這個(gè)大時(shí)代的一個(gè)小人物,作者也希望幫助更多的人參與到互聯(lián)網(wǎng)行業(yè)中。
魏曉紅
多年以來一直從事Android應(yīng)用的開發(fā)工作,在Android點(diǎn)播、直播相關(guān)領(lǐng)域有著豐富的經(jīng)驗(yàn),由于開發(fā)的產(chǎn)品在印度有非常多的Android用戶,所以這讓其積累了豐富的Android端適配的經(jīng)驗(yàn),作者在平時(shí)的工作與生活中樂于探討技術(shù),希望互利網(wǎng)可以改變?nèi)祟惿睢?
Contents?目 錄
推薦序一
推薦序二
前言
第1章 音視頻基礎(chǔ)概念 1
1.1 聲音的物理性質(zhì) 1
1.1.1 聲音是波 1
1.1.2 聲波的三要素 2
1.1.3 聲音的傳播介質(zhì) 3
1.1.4 回聲 3
1.1.5 共鳴 4
1.2 數(shù)字音頻 4
1.3 音頻編碼 6
1.4 圖像的物理現(xiàn)象 7
1.5 圖像的數(shù)值表示 8
1.5.1 RGB表示方式 8
1.5.2 YUV表示方式 9
1.5.3 YUV和RGB的轉(zhuǎn)化 10
1.6 視頻的編碼方式 10
1.6.1 視頻編碼 10
1.6.2 編碼概念 11
1.7 本章小結(jié) 13
第2章 移動(dòng)端環(huán)境搭建 14
2.1 在iOS上如何搭建一個(gè)基礎(chǔ)項(xiàng)目 14
2.2 在Android上如何搭建一個(gè)基礎(chǔ)項(xiàng)目 21
2.3 交叉編譯的原理與實(shí)踐 26
2.3.1 交叉編譯的原理 26
2.3.2 iOS平臺(tái)交叉編譯的實(shí)踐 27
2.3.3 Android平臺(tái)交叉編譯的實(shí)踐 33
2.3.4 使用LAME編碼MP3文件 38
2.4 本章小結(jié) 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源碼結(jié)構(gòu) 68
3.3.1 libavformat與libavcodec介紹 68
3.3.2 FFmpeg通用API分析 69
3.3.3 調(diào)用FFmpeg解碼時(shí)用到的函數(shù)分析 70
3.3.4 調(diào)用FFmpeg編碼時(shí)用到的函數(shù)分析 71
3.3.5 面向?qū)ο蟮腃語言設(shè)計(jì) 72
3.4 本章小結(jié) 74
第4章 移動(dòng)平臺(tái)下的音視頻渲染 75
4.1 AudioUnit介紹與實(shí)踐 75
4.2 Android平臺(tái)的音頻渲染 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的實(shí)踐 91
4.3.3 上下文環(huán)境搭建 98
4.3.4 OpenGL ES中的紋理 104
4.4 本章小結(jié) 109
第5章 實(shí)現(xiàn)一款視頻播放器 110
5.1 架構(gòu)設(shè)計(jì) 110
5.2 解碼模塊的實(shí)現(xiàn) 115
5.3 音頻播放模塊的實(shí)現(xiàn) 118
5.3.1 Android平臺(tái)的音頻渲染 118
5.3.2 iOS平臺(tái)的音頻渲染 119
5.4 畫面播放模塊的實(shí)現(xiàn) 121
5.4.1 Android平臺(tái)的視頻渲染 121
5.4.2 iOS平臺(tái)的視頻渲染 122
5.5 AVSync模塊的實(shí)現(xiàn) 124
5.5.1 維護(hù)解碼線程 124
5.5.2 音視頻同步 125
5.6 中控系統(tǒng)串聯(lián)起各個(gè)模塊 127
5.6.1 初始化階段 127
5.6.2 運(yùn)行階段 128
5.6.3 銷毀階段 129
5.7 本章小結(jié) 130
第6章 音視頻的采集與編碼 131
6.1 音頻的采集 131
6.1.1 Android平臺(tái)的音頻采集 131
6.1.2 iOS平臺(tái)的音頻采集 134
6.2 視頻畫面的采集 137
6.2.1 Android平臺(tái)的視頻畫面采集 137
6.2.2 iOS平臺(tái)的視頻畫面采集 146
6.3 音頻的編碼 156
6.3.1 libfdk_aac編碼AAC 156
6.3.2 Android平臺(tái)的硬件編碼器MediaCodec 158
6.3.3 iOS平臺(tái)的硬件編碼器AudioToolbox 161
6.4 視頻畫面的編碼 166
6.4.1 libx264編碼H264 166
6.4.2 Android平臺(tái)的硬件編碼器MediaCodec 172
6.4.3 iOS平臺(tái)的硬件編碼器 175
6.5 本章小結(jié) 184
第7章 實(shí)現(xiàn)一款視頻錄制應(yīng)用 185
7.1 視頻錄制的架構(gòu)設(shè)計(jì) 185
7.2 音頻模塊的實(shí)現(xiàn) 188
7.2.1 音頻隊(duì)列的實(shí)現(xiàn) 189
7.2.2 Android平臺(tái)的實(shí)現(xiàn) 191
7.2.3 iOS平臺(tái)的實(shí)現(xiàn) 194
7.3 音頻編碼模塊的實(shí)現(xiàn) 198
7.3.1 改造編碼器 198
7.3.2 編碼器適配器 199
7.4 畫面采集與編碼模塊的實(shí)現(xiàn) 202
7.4.1 視頻隊(duì)列的實(shí)現(xiàn) 202
7.4.2 Android平臺(tái)畫面編碼后入隊(duì) 203
7.4.3 iOS平臺(tái)畫面編碼后入隊(duì) 204
7.5 Mux模塊 205
7.5.1 初始化 206
7.5.2 封裝和輸出 208
7.5.3 銷毀資源 212
7.6 中控系統(tǒng)串聯(lián)起各個(gè)模塊 213
7.7 本章小結(jié) 214
第8章 音頻效果器的介紹與實(shí)踐 215
8.1 數(shù)字音頻基礎(chǔ) 215
8.1.1 波形圖 215
8.1.2 頻譜圖 217
8.1.3 語譜圖 219
8.1.4 深入理解時(shí)域與頻域 219
8.2 數(shù)字音頻處理:快速傅里葉變換 222
8.3 基本樂理知識 229
8.3.1 樂譜 229
8.3.2 音符的音高與十二平均律 231
8.3.3 音符的時(shí)值 233
8.3.4 節(jié)拍 233
8.3.5 MIDI格式 234
8.4 混音效果器 235
8.4.1 均衡效果器 236
8.4.2 壓縮效果器 239
8.4.3 混響效果器 240
8.5 效果器實(shí)現(xiàn) 243
8.5.1 Android平臺(tái)實(shí)現(xiàn)效果器 243
8.5.2 iOS平臺(tái)實(shí)現(xiàn)效果器 252
8.6 本章小結(jié) 255
第9章 視頻效果器的介紹與實(shí)踐 256
9.1 圖像處理的基本原理 256
9.1.1 亮度調(diào)節(jié) 257
9.1.2 對比度調(diào)節(jié) 258
9.1.3 飽和度調(diào)節(jié) 259
9.2 圖像處理進(jìn)階 259
9.2.1 圖像的卷積過程 260
9.2.2 銳化效果器 260
9.2.3 高斯模糊算法 262
9.2.4 雙邊濾波算法 263
9.2.5 圖層混合介紹 264
9.3 使用FFmpeg內(nèi)部的視頻濾鏡 266
9.3.1 FFmpeg視頻濾鏡介紹 266
9.3.2 濾鏡圖的構(gòu)建 267
9.3.3 使用與銷毀濾鏡圖 269
9.3.4 常用濾鏡介紹 270
9.4 使用OpenGL ES實(shí)現(xiàn)視頻濾鏡 272
9.4.1 加水印 273
9.4.2 添