基本信息
作者: 劉歧 趙文傑
叢書名: 電子與嵌入式係統設計叢書
齣版社:機械工業齣版社
ISBN:9787111592204
上架時間:2018-3-23
齣版日期:2018 年3月
開本:16開
版次:1-1
目錄
本書贊譽
推薦序一
推薦序二
推薦序三
前言
第一部分 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
...
基本信息
- 作者:
- 齣版社:
- ISBN:9787111585824
- 上架時間:2017-12-13
- 齣版日期:2018 年1月
- 開本:16開
- 版次:1-1
- 所屬分類:
目錄
推薦序一
推薦序二
前言
第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
前言
為什麼要寫這本書
整個音視頻領域的架構以及開發已經演進瞭很長時間,從開始的廣電領域,到PC端的音視頻領域,再到本書所介紹的移動端的音視頻領域。尤其在這幾年中,移動端音視頻領域架構的變化是巨大的。在移動互聯網的發展熱潮中,我有幸從事瞭音視頻領域的設計與開發,並且就職於時尚的手機KTV——唱吧,這使得我開發齣來的東西能夠服務於幾億用戶。對於音視頻的移動端的應用,不論是開發還是使用,在近兩年都達到瞭一個高峰,而作為一名工程師,如何高效地開發齣一個音視頻App,是一件非常睏難的事情,特彆是對於不太瞭解音視頻概念的工程師。我從事軟件開發已有7年多的時間,接觸音視頻領域也已經有5年多,在整個開發過程中,不同的時間段會遇到不同的挑戰,尤其是在開始涉足音視頻領域的時候,真可謂舉步維艱。首先,對於音視頻的基礎概念不是特彆清楚,再者在工作中邊學邊做,很難對整個音視頻領域有一個全麵的瞭解,並且市麵上沒有相關成熟的資料從更高的層次來介紹音視頻領域在移動端的演進與發展。這幾年的設計實戰與開發經驗,以及帶新人入門的眾多感觸,讓我有瞭寫這本書的動力,同時也形成瞭這本書的核心內容,我希望通過本書可以幫助更多想要在移動端音視頻領域實現自己想法的工程師,讓大傢可以順利地建立起自己的音視頻App。我非常希望能為剛入門的讀者或者遇到睏難的讀者提供幫助,希望大傢可以享受整個開發的過程,享受自己開發的産品為人們的生活帶來便利的成就感。另外,從整個音視頻開發領域來講,我也十分希望能夠通過本書貢獻齣自己的綿薄之力。
讀者對象
産品經理,這部分讀者可以從中瞭解在移動端進行音視頻開發會遇到的很多問題以及對應的優化策略,例如:如何通過音視頻的統計數據為産品提供更加流暢的策略(視頻觀看的秒開、直播推流的流暢度、視頻上傳的成功率等)。
項目經理,這部分讀者可以瞭解很多時下流行的名詞與概念,不再會因為幾個專業名詞就讓自己不知所措,並且有助於更好地評估音視頻項目開發中的風險與進度。
測試人員,這部分讀者可以學習在音視頻App中由於處理過程不同而導緻的瓶頸問題,書中也提到瞭一些自動化測試相關的命令以及工具,可以對CPU的負載情況、內存的占用情況、內存泄漏問題等進行分析。
架構師與工程師,這部分讀者隻需要一點移動開發經驗就可以閱讀本書瞭。當然如果你已經是一個高級移動開發工程師或者架構師,那麼讀起本書來將更加遊刃有餘。再進一步,如果你已經是移動領域的音視頻開發工程師瞭,那麼恭喜你,我們之間將會有一場關於技術領域內部的對話。
開設相關課程的高等院校。
如何閱讀本書
為瞭避免說教式的講解帶來枯燥乏味的閱讀體驗,本書給齣瞭大量的實例及生産環境下的案例。本書可分為四個部分:,部分是入門,從理論基礎開始講解,終會産生兩個實踐項目;第二部分是提高,基於,部分的項目添加特效,形成一個完整的多媒體項目;第三部分是擴展,結閤當下比較流行的直播場景進行實際案例分析;第四部分是工具,介紹當下大部分可以提高開發以及測試效率的工具。下麵是各個章節的基本介紹。
第1章,介紹音視頻的基礎概念,其中包括音視頻的基礎數據格式、編碼後的數據格式以及不同格式之間的相互轉換等。
第2章,從零開始講解如何搭建一個iOS項目和一個Android項目,並且添加C++支持,因為在音視頻領域的開發中,有相當一部分的代碼需要用C++來編寫,這樣就可以做到兩個平颱(Android和iOS平颱)共用一套代碼倉庫,以提升開發效率。然後講解交叉編譯,因為在音視頻開發過程中會用到很多第三方開源庫,如果將這些庫編譯到我們的項目中,勢必要進行交叉編譯,因此本章會重點講解這些內容。
第3章,探討FFmpeg開源庫。對於音視頻開發來講,FFmpeg開源庫是眾所周知也是普遍使用的。本章首先從編譯開始,接著是命令行使用,再到源碼結構,後是API調用,以層層遞進的方式對FFmpeg開源庫展開介紹。
第4章,講解如何利用各自平颱的AP
解鎖音視頻的奧秘,掌握跨平颱開發的核心技術 您是否曾對手機或電腦中流暢播放的視頻、豐富多彩的音頻感到好奇?是否夢想過自己也能打造齣個性化的音視頻應用,讓創意無限延伸?抑或您是一位渴望深入理解音視頻底層原理,並在 Android 和 iOS 兩個主流移動平颱上實現高階開發的工程師?那麼,這本書將是您踏入音視頻技術殿堂,並實現技術躍升的理想起點。 內容概述 本書旨在為您構建一個全麵、深入且實用的音視頻開發知識體係。我們將從音視頻的基礎概念齣發,逐步引導您理解數據是如何被編碼、解碼、傳輸和播放的。隨後,我們將聚焦於當前業界廣泛應用的 FFmpeg 庫,通過詳細的講解和豐富的實戰案例,助您精通 FFmpeg 的各項功能。更重要的是,本書將把這些理論知識與 Android 和 iOS 平颱的實際開發緊密結閤,為您提供一套切實可行的跨平颱音視頻解決方案。 第一部分:音視頻基礎知識的堅實基石 在深入技術細節之前,理解音視頻的基礎概念至關重要。本部分將為您鋪設一條清晰的學習路徑,幫助您建立紮實的理論基礎。 數字音視頻的本質: 我們將從信號的數字化開始,深入探討聲音和圖像是如何被轉換成計算機可以理解的數據的。您將瞭解到采樣率、比特深度、量化等音頻關鍵概念,以及像素、色彩空間、分辨率等圖像核心要素。 編碼與解碼的魔法: 音視頻數據通常需要經過編碼纔能實現高效的存儲和傳輸。本部分將詳細介紹常見的視頻編碼格式(如 H.264/AVC, H.265/HEVC)和音頻編碼格式(如 AAC, MP3, Opus)的原理,以及它們在壓縮率、畫質和音質方麵的權衡。同時,您也將理解解碼器的作用,是如何將編碼後的數據還原成可用的音視頻流的。 封裝格式的扮演的角色: 編碼後的音視頻數據需要被封裝到特定的容器中,纔能方便地管理和播放。我們將介紹主流的封裝格式,如 MP4, MKV, FLV, AVI 等,理解它們的結構以及如何存儲音視頻流、元數據等信息。 媒體流的傳輸: 在網絡環境下,音視頻數據的傳輸麵臨著帶寬、延遲、丟包等挑戰。本部分將初步介紹流媒體傳輸的基本原理,為後續深入理解網絡傳輸打下基礎。 第二部分:FFmpeg —— 音視頻處理的瑞士軍刀 FFmpeg 是一個功能強大、開源的音視頻處理工具集,被廣泛應用於各種音視頻開發場景。本部分將帶您全麵掌握 FFmpeg 的使用和原理。 FFmpeg 入門: 我們將從 FFmpeg 的安裝和基本命令使用開始,讓您快速熟悉其命令行工具。您將學習如何使用 `ffmpeg` 命令進行音視頻格式轉換、剪輯、閤並、提取音頻/視頻流等基礎操作。 核心 API 詳解: 除瞭命令行工具,FFmpeg 也提供瞭豐富的 API 供開發者在代碼中使用。本部分將深入講解 FFmpeg 的核心庫,包括 libavcodec (編碼/解碼庫)、libavformat (封裝/解封裝庫)、libavutil (通用工具庫)、libswscale (圖像縮放/色彩空間轉換庫)、libswresample (音頻重采樣庫) 等。您將學習如何通過這些 API 實現自定義的音視頻處理邏輯。 高級音視頻處理技巧: 視頻編碼參數優化: 深入理解各種編碼參數(如 GOP 結構、B 幀、參考幀、CRF 等)對編碼效率、畫質和碼率的影響,學會根據實際需求進行參數調優。 音頻處理: 掌握音頻重采樣、混音、音效處理等技術。 濾鏡係統: 探索 FFmpeg 強大的濾鏡係統,學習如何應用各種圖像和音頻濾鏡(如去噪、銳化、變聲、水印添加等)來對音視頻進行增強和處理。 實時編解碼: 理解實時編碼和解碼的挑戰,以及 FFmpeg 在這方麵的應用。 FFmpeg 的編譯與集成: 為瞭在 Android 和 iOS 平颱上使用 FFmpeg,您需要掌握如何針對不同平颱進行編譯和集成。本書將提供詳細的編譯指南,幫助您將 FFmpeg 庫集成到您的開發項目中。 第三部分:Android 平颱上的音視頻開發實踐 Android 作為全球最大的移動操作係統,其音視頻開發生態豐富且充滿挑戰。本部分將聚焦於如何在 Android 平颱上利用 FFmpeg 和原生 API 實現高效的音視頻應用。 Android 音視頻基礎: 迴顧 Android 平颱提供的 MediaPlayer、MediaCodec、MediaRecorder 等原生 API,理解它們的功能和局限性。 FFmpeg 在 Android 上的集成: 詳細介紹將編譯好的 FFmpeg 庫集成到 Android 項目中的方法,包括 JNI (Java Native Interface) 的使用。您將學習如何編寫 Java/Kotlin 代碼調用 FFmpeg 的 C/C++ 函數。 自定義音視頻播放器: 從零開始,學習如何使用 FFmpeg 構建一個高性能的自定義音視頻播放器。您將掌握如何管理音視頻幀、處理解碼、渲染視頻、播放音頻、實現緩衝和seek等關鍵功能。 音視頻錄製與處理: 學習如何利用 FFmpeg 和 Android 原生 API 實現高質量的音視頻錄製。掌握對錄製參數的控製,以及對錄製過程中的音視頻進行實時處理,例如添加濾鏡、轉碼等。 推流與拉流: 探索如何利用 FFmpeg 實現 RTMP、RTSP 等流媒體協議的推流和拉流功能,為構建直播或點播應用打下基礎。 性能優化與內存管理: 在資源受限的移動設備上,性能優化和內存管理至關重要。我們將分享在 Android 平颱上優化 FFmpeg 性能和避免內存泄漏的實用技巧。 第四部分:iOS 平颱上的音視頻開發實踐 iOS 平颱以其流暢的用戶體驗和對開發者友好的生態係統而聞名。本部分將引導您在 iOS 平颱上進行音視頻開發,並充分利用 FFmpeg 的強大功能。 iOS 音視頻基礎: 介紹 iOS 平颱提供的 AVFoundation 框架,這是構建音視頻應用的核心。您將瞭解 AVPlayer、AVAsset、AVAssetReader/Writer 等關鍵類。 FFmpeg 在 iOS 上的集成: 詳細講解如何在 Xcode 中集成 FFmpeg 庫。我們將探討不同的集成方式,包括使用 CocoaPods 或手動引入。 構建自定義音視頻播放器: 學習如何結閤 AVFoundation 和 FFmpeg,實現功能強大的自定義音視頻播放器。您將掌握如何處理視頻幀渲染到 Core Animation 圖層,以及音頻數據的播放。 音視頻錄製與編輯: 探索如何在 iOS 上使用 FFmpeg 和 AVFoundation 進行音視頻錄製,並實現基本的視頻編輯功能,如剪輯、閤並、添加濾鏡等。 推流與拉流: 學習如何在 iOS 平颱上實現 RTMP、RTSP 等流媒體協議的推流和拉流,為開發實時音視頻應用提供支持。 Metal 與 GPU 加速: 瞭解如何利用 iOS 的 Metal 框架,實現 GPU 加速的音視頻處理,極大地提升處理性能和效率。 第五部分:跨平颱音視頻開發的進階思考 在掌握瞭 Android 和 iOS 平颱的獨立開發後,本書還將引導您思考跨平颱音視頻開發的更高層次的問題。 代碼復用與架構設計: 如何在 Android 和 iOS 之間最大化地復用音視頻處理邏輯?我們將探討模塊化設計、抽象層以及跨平颱框架的應用。 多媒體框架的比較與選擇: 深入分析 FFmpeg、AVFoundation、Android 原生 API 的優劣,以及在不同場景下的適用性。 性能監控與調試: 在跨平颱開發中,性能問題可能更加復雜。我們將介紹如何進行有效的性能監控和跨平颱調試。 未來的發展趨勢: 展望音視頻技術的未來發展方嚮,如 AI 在音視頻處理中的應用、更高效的編解碼技術等。 本書特色 理論與實踐深度結閤: 本書不僅講解音視頻的基礎理論,更注重實戰應用,提供大量可運行的代碼示例,幫助您將知識轉化為實際能力。 由淺入深,循序漸進: 從最基礎的概念講起,逐步深入到復雜的音視頻處理技術和跨平颱開發。 麵嚮主流移動平颱: 專注於 Android 和 iOS 兩大主流移動平颱,為您提供最貼閤實際開發需求的解決方案。 FFmpeg 精通: 詳細剖析 FFmpeg 的核心原理和 API,助您成為 FFmpeg 高手。 技術前沿: 關注音視頻技術的最新發展,為您指明前進的方嚮。 無論您是音視頻開發的初學者,還是希望在移動端深化技能的經驗開發者,本書都將為您打開一扇通往音視頻世界的大門,助您在技術之路上不斷精進,創造齣令人驚嘆的音視頻作品。