本書采用從零開始,逐級深入的方式寫作,以項目實戰(zhàn)為階段性目標,外加實際生產環(huán)境下的特殊案例作為優(yōu)化方案,讓讀者可以全方位掌握移動平臺下音視頻開發(fā)的大部分內容。首先介紹實現視頻播放器和錄制需要的基礎知識,然后通過案例講解如何實現視頻播放器和一個視頻錄制的應用。但是一款錄制的應用,要想上線,其實還要進行給音頻視頻美化,所以在提高篇,介紹了相應的內容,并給出了一個實際生產環(huán)境中的案例,之后,指導讀者進階,把前面學到的基礎內容應用到直播中。后,給出排錯方法和工具,和大家分享如何更有效率地開發(fā)應用程序。
適讀人群:開發(fā)工程師,你們只需要一點移動開發(fā)經驗就可以閱讀本書了;當然如果你已經是一個Senior的移動開發(fā)工程師或者架構師的話,那么你讀起來更會是游刃有余;再進一步,如果你已
作者團隊由來自國內一線移動互聯網公司的技術專家組成,不僅能確保內容的專業(yè)性,而且能把實際一線豐富的經驗帶給讀者,并在github上開源了書中的所有項目,讓讀者可以更容易的集成到自己的App中,對于移動端的音視頻開發(fā)者來講,這本書可以作為枕邊書。
Preface?前言為什么要寫這本書整個音視頻領域的架構以及開發(fā)已經演進了很長時間,從最開始的廣電領域,到PC端的音視頻領域,再到本書所介紹的移動端的音視頻領域。尤其在這幾年中,移動端音視頻領域架構的變化是巨大的。在移動互聯網的發(fā)展熱潮中,我有幸從事了音視頻領域的設計與開發(fā),并且就職于最時尚的手機KTV——唱吧,這使得我開發(fā)出來的東西能夠服務于幾億用戶。對于音視頻的移動端的應用,不論是開發(fā)還是使用,在近兩年都達到了一個高峰,而作為一名工程師,如何高效地開發(fā)出一個音視頻App,是一件非常困難的事情,特別是對于不太了解音視頻概念的工程師。我從事軟件開發(fā)已有7年多的時間,接觸音視頻領域也已經有5年多,在整個開發(fā)過程中,不同的時間段會遇到不同的挑戰(zhàn),尤其是在最開始涉足音視頻領域的時候,真可謂舉步維艱。首先,對于音視頻的基礎概念不是特別清楚,再者在工作中邊學邊做,很難對整個音視頻領域有一個全面的了解,并且市面上沒有相關成熟的資料從更高的層次來介紹音視頻領域在移動端的演進與發(fā)展。這幾年的設計實戰(zhàn)與開發(fā)經驗,以及帶新人入門的眾多感觸,讓我有了寫這本書的動力,同時也形成了這本書的核心內容,我希望通過本書可以幫助更多想要在移動端音視頻領域實現自己想法的工程師,讓大家可以順利地建立起自己的音視頻App。我非常希望能為剛入門的讀者或者遇到困難的讀者提供幫助,希望大家可以享受整個開發(fā)的過程,享受自己開發(fā)的產品為人們的生活帶來便利的成就感。另外,從整個音視頻開發(fā)領域來講,我也十分希望能夠通過本書貢獻出自己的綿薄之力。
讀者對象產品經理,這部分讀者可以從中了解在移動端進行音視頻開發(fā)會遇到的很多問題以及對應的優(yōu)化策略,例如:如何通過音視頻的統計數據為產品提供更加流暢的策略(視頻觀看的秒開、直播推流的流暢度、視頻上傳的成功率等)。
項目經理,這部分讀者可以了解很多時下流行的名詞與概念,不再會因為幾個專業(yè)名詞就讓自己不知所措,并且有助于更好地評估音視頻項目開發(fā)中的風險與進度。
測試人員,這部分讀者可以學習在音視頻App中由于處理過程不同而導致的瓶頸問題,書中也提到了一些自動化測試相關的命令以及工具,可以對CPU的負載情況、內存的占用情況、內存泄漏問題等進行分析。
架構師與工程師,這部分讀者只需要一點移動開發(fā)經驗就可以閱讀本書了。當然如果你已經是一個高級移動開發(fā)工程師或者架構師,那么讀起本書來將更加游刃有余。再進一步,如果你已經是移動領域的音視頻開發(fā)工程師了,那么恭喜你,我們之間將會有一場關于技術領域內部的對話。
開設相關課程的高等院校。
如何閱讀本書為了避免說教式的講解帶來枯燥乏味的閱讀體驗,本書給出了大量的實例及生產環(huán)境下的案例。本書可分為四個部分:第一部分是入門,從理論基礎開始講解,最終會產生兩個實踐項目;第二部分是提高,基于第一部分的項目添加特效,形成一個完整的多媒體項目;第三部分是擴展,結合當下比較流行的直播場景進行實際案例分析;第四部分是工具,介紹當下大部分可以提高開發(fā)以及測試效率的工具。下面是各個章節(jié)的基本介紹。
第1章,介紹音視頻的基礎概念,其中包括音視頻的基礎數據格式、編碼后的數據格式以及不同格式之間的相互轉換等。
第2章,從零開始講解如何搭建一個iOS項目和一個Android項目,并且添加C++支持,因為在音視頻領域的開發(fā)中,有相當一部分的代碼需要用C++來編寫,這樣就可以做到兩個平臺(Android和iOS平臺)共用一套代碼倉庫,以提升開發(fā)效率。然后講解交叉編譯,因為在音視頻開發(fā)過程中會用到很多第三方開源庫,如果將這些庫編譯到我們的項目中,勢必要進行交叉編譯,因此本章會重點講解這些內容。
第3章,探討FFmpeg開源庫。對于音視頻開發(fā)來講,FFmpeg開源庫是眾所周知也是普遍使用的。本章首先從編譯開始,接著是命令行使用,再到源碼結構,最后是API調用,以層層遞進的方式對FFmpeg開源庫展開介紹。
第4章,講解如何利用各自平臺的API進行聲音與畫面的渲染以及解碼,對于畫面的渲染,推薦使用OpenGL ES,兩個平臺可以使用同一個代碼倉庫。
第5章,實現一款視頻播放器。有了前四章的基礎,我們已經完全可以構建起一個視頻播放器了。本書最大的特點就是經過幾章基礎知識的學習立即開始一個項目的實踐,通過本章的視頻播放器項目,我們將會熟悉播放器是如何工作的。
第6章,重點介紹音視頻的采集與編碼器。特別是硬件編解碼器在各個平臺上的使用,使得應用能夠更高效(耗電更少、發(fā)熱更少、界面更流暢)地運行在用戶的手機上。
第7章,繼續(xù)開發(fā)一個視頻錄制的新項目,該項目可以使我們更加熟悉音視頻應用在各個平臺下的實現。
第8章,講解如何處理音頻流。畢竟讓別人聽采集出來的干聲是很不禮貌的,本章將利用各種特效來美化采集的聲音。
第9章,講解如何處理視頻流,使視頻中的顏值變得更高,畢竟愛美之心人皆有之。
展曉凱
曾工作于淘寶,參與設計開發(fā)淘寶旅行的機票搜索業(yè)務,曾就職于115網盤參與核心功能的研發(fā),現就職于北京*淘科技有限公司,任音視頻架構師,在公司的唱吧、唱吧直播間、火星三條產品線都負責客戶端核心的架構設計與開發(fā)工作,其中唱吧目前公布的數據已有幾億用戶,月活也在千萬量級。作者在工作與生活中非常樂于幫助同事與朋友,癡迷于互聯網可以推動整個人類歷史的發(fā)展,同時作為這個大時代的一個小人物,作者也希望幫助更多的人參與到互聯網行業(yè)中。
魏曉紅
多年以來一直從事Android應用的開發(fā)工作,在Android點播、直播相關領域有著豐富的經驗,由于開發(fā)的產品在印度有非常多的Android用戶,所以這讓其積累了豐富的Android端適配的經驗,作者在平時的工作與生活中樂于探討技術,希望互利網可以改變人類生活。
Contents?目 錄
推薦序一
推薦序二
前言
第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章 移動端環(huán)境搭建 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 上下文環(huán)境搭建 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 節(jié)拍 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 亮度調節(jié) 257
9.1.2 對比度調節(jié) 258
9.1.3 飽和度調節(jié) 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 添