FFmpeg 音視頻開發基礎與實戰 ( 簡體 字) |
作者:殷汶杰 | 類別:1. -> 教材 -> 數位影像處理 |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 55542 詢問書籍請說出此書號!【有庫存】 NT售價: 540 元 |
出版日:1/1/2022 |
頁數:416 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121425554 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:多年來,音視頻、多媒體技術一直以各種各樣的形式對社會產生深刻影響,從專業領域的廣播電視到消費領域的個人數字攝像機等這些都已融入人們生活的方方面面。進入互聯網時代,在線視頻、短視頻等娛樂場景,以及遠程會議、遠程醫療等專業應用進一步擴展了音視頻技術的應用領域,使其與現代文明的聯系更加密不可分。
音視頻技術推動泛娛樂行業高速發展
從21 世紀的最初幾年開始,在線視頻產業便漸漸開始興起。隨著寬帶網逐漸走入尋常百姓家,消費者們無須再忍受撥號網絡緩慢的傳輸速度,部分知名門戶網站(如搜狐等)也逐漸開始涉足在線視頻領域。此后,如樂視網、優酷網、土豆網、PPLive、PPS、酷6 等在線視頻網站層出不窮,再加上背靠互聯網巨頭公司的騰訊視頻、愛奇藝等,國內在線視頻行業呈現百花齊放的場景。然而,隨著版權和帶寬等成本的日漸高漲,多數平臺逐漸沉寂,最終形成了“愛(奇異)優(酷視頻)騰(訊視頻)”三足鼎立的格局。此外,如Acfun 和bilibili 等二次元主題網站和芒果TV 等以綜藝為特色的平臺也在各自的領域逐漸擴大了影響力。
在視頻網站平臺的發展起起伏伏之際,另一種在線視頻娛樂的形態——網絡互動直播開始異軍突起。直播本是歷史最悠久的視頻應用之一,多年以來廣電領域的數字電視廣播、閉路電視系統一直是直播系統的最典型應用。進入互聯網時代,直播的整體形態與產品細節與傳統的閉路電視系統相比發生了翻天覆地的變化,最典型的升級是從主播到觀眾的單方面放送,轉變為主播與觀眾的雙向互動,如通過彈幕或連麥等方式。網絡互動直播從萌芽到興起,到最為繁榮的“千播大戰”,直到最終經歷多次的兼并和淘汰,其中的幸存者已經寥寥無幾。當前仍較為活躍的直播平臺有頭部的斗魚、虎牙和主要用于帶貨的淘寶直播和京東直播等。
除中、長視頻外,隨著以智能手機為代表的移動智能設備的日漸普及,短視頻作為一項新的業務形態逐漸占據了消費者的碎片時間。通常認為短視頻起源自本世紀早期的微電影、網絡短片和校園DV 等形態,伴隨著各種UGC 視頻平臺的蓬勃發展而越發興盛。但由于平臺的定位、資本及政策等的多重影響,多數平臺在曇花一現后迅速消失在市場中,甚至騰訊旗下的微視也難逃被雪藏多年的命運。在智能移動設備全面進入人們的生活后,通過移動設備進行“短、平、快”風格的內容分享重新點燃了短視頻行業的星星之火,低成本、快節奏的短視頻拍攝成為人們分享生活和觀點的重要手段。今天,以抖音和快手為代表的移動短視頻平臺憑借其豐富的內容和對用戶心理與喜好的研究在用戶中產生了巨大影響,成為當前基于音視頻的泛娛樂場景中新的一極。
音視頻技術給商務與辦公領域帶來新生命
目前,遠程辦公已成為必然選擇。當前市場上多家科技企業發布了多款遠程辦公產品軟件或一體式解決方案,典型的有Microsoft 的Teams、Google 的Google Meet、騰訊的騰訊會議、字節跳動的飛書、阿里巴巴的釘釘和Zoom 的同名產品Zoom 等。這些產品的共同特點是基于互聯網、云計算等技術,集成了電子郵件、電子白板、遠程連接與桌面共享等模塊,旨在為異地辦公的員工和團隊提供強大而可靠的交流和共享服務。構建一個穩定而完備的遠程辦公系統需要多個不同的系統精密配合,而實時音視頻通信可謂其中技術最為復雜、挑戰最大的模塊之一,其穩定性和性能直接決定了系統整體的性能與用戶體驗。目前主流的實時音視頻通信解決方案主要基于WebRTC 標準。與傳統的RTMP+CDN 系統相比,基于WebRTC 的方案延遲更低,卡頓情況更少,且支持直接接入瀏覽器進行推流與播放。
音視頻技術具有廣闊的發展前景和學習價值
從上述音視頻應用的發展歷史我們可以看出,音視頻技術始終在行業內占據重要地位。從在線視頻網站到互動直播,再到短視頻與實時音視頻通信,當音視頻領域在某一個行業發展到頂峰,甚至隨后開始逐漸衰落時,也總是有另一個風口異軍突起成功接棒。究其原因在于,音視頻由于具有可以生動形象地攜帶大量信息,且易于被人們快速理解的特性,已成為信息傳輸效率最高的通信媒介。幾乎所有的商業形態都可以通過音視頻技術實現信息的快速理解與交換,實現效率的倍增。因此,近年來無論社會如何發展變化,音視頻領域依然以朝陽產業的面貌蓬勃發展。
另一方面,音視頻技術是軟件編程的一項高階技術,具有較高的準入門檻。一名優秀的音視頻工程師應當從原理到實踐做到融會貫通,至少需要掌握以下領域的知識與技能:數學、信息與編碼理論、計算機系統原理、算法理論、編程語言(如C++、Java、Go 等)、網絡開發、跨平臺軟件開發(如移動端、服務端和客戶端)和系統架構設計等。因此,音視頻技術的學習之路比普通的軟件開發之路更加艱難、漫長。而另一方面,這也成為音視頻領域技術人員最好的護城河,為行業內的開發者提供了深入沉淀的機會。
本書的價值
音視頻技術并不是一項可以輕松掌握的技術,為了解決這個問題,許多天才程序員貢獻了多項開源工程對音視頻開發的底層技術進行了封裝與集成,以提升整體的開發效率,FFmpeg便是其中的典型。作為最強大的音視頻開源項目之一,FFmpeg 提供了音視頻的編碼與解碼、封裝與解封裝、推拉流和音視頻數據編輯等操作,屏蔽了許多底層技術細節,使得開發者可以將更多的精力專注在業務邏輯的實現上,大幅提升了開發如播放器、推流、音視頻編輯等客戶端或SDK 等產品的效率。
盡管如此,對初學者來說,FFmpeg 提供的命令行工具和SDK 的使用方法仍然較為困難。除音視頻的基本概念外,繁冗復雜的命令行參數與API 常常讓初學者無從下手,除官方提供的文檔外,幾乎沒有完備的技術資料可供參考。本書系統地講解了音視頻領域的基礎知識,并由淺入深地介紹了FFmpeg 的基本使用方法,筆者希望本書的面世可以進一步降低音視頻開發的入門門檻,讓更多有志于從事音視頻開發的同學可以為整個行業添磚加瓦。
本書的內容及學習方法
本書內容分為三部分,各部分之間的內容相互關聯但又相對獨立,讀者可以根據自身的需求按順序閱讀或選擇性學習。
第1∼6 章為本書的第一部分,主要講解音視頻技術的基礎知識,包括音視頻編碼與解碼標準、媒體容器的封裝格式和網絡流媒體協議簡介。建議對音視頻技術不夠熟悉的讀者從該部分開始閱讀,有一定基礎的讀者可以選擇泛讀或跳過該部分。
第7∼9 章為本書的第二部分,主要講解命令行工具ffmpeg、ffprobe 和ffplay 的主要使用方法。命令行工具在搭建測試環境、構建測試用例和排查系統Bug 時常常起到重要作用。如果想要在實際工作中有效提升工作效率,那么應熟練掌握 FFmpeg 命令行工具的使用方法。
第10∼15 章為本書的第三部分,主要講解如何使用libavcodec、libavformat 等FFmpegSDK 進行編碼與解碼、封裝與解封裝,以及媒體信息編輯等音視頻基本功能開發的方法。在實際的企業級音視頻項目中,通常采用調用FFmpeg 相關的API 而非使用命令行工具的方式實現最基本的功能,因此該部分內容具有較強的實踐意義,推薦所有讀者閱讀并多加實踐。此部分的代碼實現基本來自FFmpeg 官方文檔中的示例代碼,筆者在此基礎上進行了一定的改編。書中代碼整體上遵循了示例代碼的指導,穩定性較強,且更易于理解。
勘誤與聯系方式
由于本書內容較為繁雜,且筆者在撰寫稿件的同時仍承擔繁重的一線開發任務,因此書中極有可能出現部分疏漏或錯誤,望廣大讀者閱讀后不吝指正,提出寶貴的意見或建議,聯系郵箱。
致謝
自本書初步策劃開始,截至今日已一年有余。這是我第一次獨立撰寫書稿,其間所經歷的困難甚至痛苦不言而喻。最終初稿得以完成,首先必須感謝我的伴侶,在本書定稿的過程中,你完成了身份從女朋友到妻子的升級,沒有你的支持,本書斷無問世的可能。此外還必須感謝我的父母,你們的關愛、期望與督促,也是本書問世的源動力之一。
感謝博文視點的編輯老師,你們的專業程度一直令我嘆服。沒有你們從開始到最終的指導和幫助,本書是一定無法完成的。
感謝各個技術交流群中的同行與朋友,以及我的博客與課程的讀者,有了你們的支持,我才克服了所經歷的困難,將本書帶到你們的面前。
希望在不久的將來,能有更多更有價值的內容貢獻給大家,謝謝!
殷汶杰
2021 年6 月于上海 |
內容簡介:全書內容分為三部分,共15 章。第1~6 章為第一部分,主要講解音視頻開發的基礎知識,簡要介紹音視頻技術的發展背景,以及主流的音視頻壓縮編碼算法、音視頻容器格式和網絡流媒體協議等。第7~9章為第二部分,主要講解命令行工具ffmpeg、ffprobe 和ffplay 的使用方法,包括如何使用這些工具進行視頻播放、格式檢測、編轉碼、格式轉換和流媒體推拉流等操作;第10~15 章為第三部分,主要講解基于FFmpeg SDK 的開發實戰,主要介紹如何在工程中調用libavcodec 和libavformat 等庫提供的接口實現音視頻處理的相關功能。本書適合從事音視頻編解碼、多媒體應用開發和流媒體技術的初、中級開發者,以及各大院校學生閱讀,也適合有一定經驗的開發人員參考使用。 |
目錄:第一部分 基礎知識
第1 章 音視頻技術概述 ........... 2
1.1 音視頻信息與多媒體系統 .......... 2
1.1.1 信息傳輸系統的發展 ......... 2
1.1.2 信息時代的音視頻技術 ......... 4
1.1.3 音視頻技術的未來展望 ......... 5
1.2 典型的音視頻與多媒體系統結構 ........ 6
1.2.1 視頻點播 ............. 7
1.2.2 視頻直播 ............. 8
1.2.3 安防監控 ............. 9
1.2.4 視頻會議 ............. 9
第2 章 圖像、像素與顏色空間 ........... 11
2.1 圖像與像素 ............ 11
2.2 圖像的位深與顏色空間 .......... 12
2.2.1 圖像的位深 ........... 12
2.2.2 圖像的顏色空間 ........... 14
2.3 圖像壓縮編碼 ............ 15
2.3.1 圖像壓縮算法分類 ........... 16
2.3.2 圖像壓縮基本算法 ........... 16
2.3.3 常見的圖像壓縮編碼格式 ......... 20
第3 章 視頻壓縮編碼 ............ 22
3.1 視頻壓縮編碼的基礎知識 .......... 22
3.1.1 視頻信息的數字化表示 ......... 22
3.1.2 常用的視頻格式與分辨率 ......... 24
3.1.3 對視頻數據壓縮編碼的原因........ 24
3.2 視頻壓縮編碼標準的發展歷程 .......... 24
3.3 視頻壓縮編碼的基本原理 .......... 25
3.3.1 視頻數據中的冗余信息 ......... 25
3.3.2 預測編碼 ........... 26
3.3.3 變換編碼 ........... 27
3.3.4 熵編碼 ............. 28
3.4 視頻編碼標準H.264 ........... 28
3.4.1 H.264 簡介 ............ 28
3.4.2 H.264 的框架 ............ 28
3.4.3 H.264 的基本算法 ........... 30
3.5 高效視頻編碼標準H.265.......... 33
3.5.1 H.265 簡介 ............ 33
3.5.2 H.265 的框架 ............ 33
3.5.3 H.265 的基本算法 ........... 35
第4 章 音頻壓縮編碼 ............ 42
4.1 音頻壓縮編碼的基礎知識 .......... 42
4.1.1 聲音信息的概念 ........... 42
4.1.2 聲音信息的基本要素 ......... 42
4.2 音頻信息采樣與數字化 .......... 43
4.2.1 模擬音頻 ........... 43
4.2.2 數字音頻 ........... 44
4.2.3 采樣和量化 ........... 44
4.3 脈沖編碼調制 ............ 46
4.3.1 PCM 量化區間分割 .......... 46
4.3.2 PCM 量化編碼規則 .......... 49
4.4 MP3 格式與MP3 編碼標準 .......... 51
4.4.1 MP3 格式 ........... 52
4.4.2 MP3 編碼標準 ........... 62
4.5 AAC 格式與AAC 編碼標準 ......... 67
4.5.1 AAC 格式 ............ 67
4.5.2 AAC 編碼標準 .......... 72
第5 章 音視頻文件容器和封裝格式 ......... 74
5.1 概述 .............. 74
5.2 FLV 格式 .............. 75
5.2.1 FLV 文件結構 ........... 75
5.2.2 FLV 文件頭 ........... 76
5.2.3 FLV 標簽 ........... 77
5.3 MPEG-TS 格式 ............ 84
5.3.1 信息包頭 ........... 84
5.3.2 PES 包結構 ........... 85
5.3.3 PSI 結構 ............. 87
5.4 MP4 格式 ............. 88
5.4.1 MP4 格式簡介 ........... 88
5.4.2 ISO 協議族 ............ 89
5.4.3 MP4 封裝格式 ........... 89
5.4.4 Box 類型 ............ 90
5.4.5 MP4 文件結構 ........... 92
5.4.6 構建視頻流的播放時間軸 ......... 98
第6 章 音視頻流媒體協議 ........... 104
6.1 網絡協議模型 ............ 105
6.1.1 ISO/OSI 模型結構 .......... 105
6.1.2 TCP/IP 模型結構 .......... 106
6.2 網絡流媒體協議——RTMP .......... 120
6.2.1 RTMP 的概念 .......... 120
6.2.2 RTMP 分塊與塊流 .......... 121
6.2.3 RTMP 信息格式 .......... 126
6.2.4 RTMP 信息與命令 .......... 129
6.3 網絡流媒體協議——HLS 協議 ........ 136
6.3.1 HLS 協議的概念 ........... 136
6.3.2 HLS 直播流媒體系統結構 ......... 136
6.3.3 HLS 索引文件格式 ......... 138
第二部分 命令行工具
第7 章 FFmpeg 的基本操作 .......... 144
7.1 FFmpeg 概述 ............ 144
7.1.1 各個編譯類型的區別 ......... 145
7.1.2 編譯FFmpeg 源代碼 .......... 148
7.2 ffplay 的基本使用方法 .......... 155
7.2.1 顯示ffplay 版本 .......... 155
7.2.2 顯示編譯選項 ........... 156
7.2.3 設置日志級別 ........... 156
7.2.4 全屏播放 ........... 158
7.2.5 指定輸入視頻的寬、高和幀率 ........ 158
7.2.6 禁用音頻流、視頻流和字幕流 ........ 158
7.2.7 指定播放的起始時間和時長........ 159
7.2.8 指定播放音量 ........... 159
7.2.9 設置播放窗口 ........... 159
7.3 ffprobe 的基本使用方法 .......... 159
7.3.1 顯示詳細的封裝格式信息 ......... 160
7.3.2 顯示每一路媒體流信息 ......... 161
7.3.3 顯示每一個碼流包的信息 ......... 164
7.3.4 顯示媒體流和碼流包的負載信息 ........ 165
7.3.5 顯示每一幀圖像的信息 ......... 167
7.3.6 指定檢測信息的輸出格式 ......... 169
7.4 ffmpeg 的基本使用方法 .......... 175
7.4.1 顯示版本和編譯配置信息 ......... 176
7.4.2 顯示支持的解復用器格式 ......... 177
7.4.3 顯示支持的復用器格式 ......... 179
7.4.4 顯示支持的所有輸入格式和輸出格式 ...... 181
7.4.5 顯示支持的解碼器 ......... 183
7.4.6 顯示支持的編碼器 ......... 184
7.4.7 顯示支持的媒體協議 ......... 186
7.4.8 顯示支持的硬件加速框架 ......... 188
7.4.9 ffmpeg 封裝格式轉換 ......... 188
7.4.10 視頻的解碼和編碼 ......... 193
7.4.11 從視頻中截取圖像 .......... 206
7.4.12 ffmpeg 視頻轉碼 ........... 207
第8 章 濾鏡圖 ............. 209
8.1 ffmpeg 音視頻濾鏡 ............ 209
8.1.1 簡單濾鏡圖 ........... 209
8.1.2 復合濾鏡圖 ........... 210
8.1.3 ffmpeg 支持的濾鏡列表 ......... 211
8.2 簡單濾鏡圖的應用 ............ 212
8.2.1 常用的視頻編輯簡單濾鏡圖........ 212
8.2.2 常用的音頻編輯簡單濾鏡圖........ 227
8.3 復合濾鏡圖的應用 ............ 230
8.3.1 常用的視頻編輯復合濾鏡圖........ 230
8.3.2 常用的音頻編輯復合濾鏡圖........ 234
第9 章 流媒體應用 ............ 236
9.1 構建SRS 流媒體服務 ........... 236
9.1.1 部署RTMP 流媒體服務 ......... 238
9.1.2 部署HLS 流媒體服務 .......... 240
9.1.3 部署HTTP-FLV 流媒體服務 ......... 241
9.2 構建Nginx RTMP 流媒體服務 ......... 241
9.2.1 Nginx 的編譯和部署 .......... 242
9.2.2 Nginx 的流媒體模塊nginx-rtmp-module ...... 246
第三部分 開發實戰
第10 章 FFmpeg SDK 的使用........... 254
10.1 使用CMake 構建工程 ........... 255
10.1.1 使用CMake 構建Hello World 工程 ...... 255
10.1.2 在工程中編譯并輸出多個文件 ........ 257
10.1.3 在工程中添加頭文件和源文件目錄 ...... 259
10.1.4 在工程中引入動態庫 ......... 262
10.2 FFmpeg SDK 基本使用方法示例:獲取目錄下的文件信息 ... 264
10.2.1 顯示指定目錄信息 ......... 264
10.2.2 解析API 和結構體 ......... 266
第11 章 使用FFmpeg SDK 進行視頻編解碼 ........ 269
11.1 libavcodec 視頻編碼 .......... 269
11.1.1 主函數與數據I/O 實現 ........ 269
11.1.2 視頻編碼器初始化 .......... 272
11.1.3 編碼循環體............ 284
11.1.4 關閉編碼器............ 289
11.1.5 FFmpeg 視頻編碼延遲分析 ......... 290
11.2 libavcodec 視頻解碼 .......... 294
11.2.1 主函數實現............ 294
11.2.2 視頻解碼器初始化 .......... 295
11.2.3 解碼循環體............ 297
11.2.4 關閉解碼器............ 304
第12 章 使用FFmpeg SDK 進行音頻編解碼 ........ 306
12.1 libavcodec 音頻編碼 .......... 306
目錄 ∣ XIII
12.1.1 主函數實現 ........... 306
12.1.2 音頻編碼器初始化 ......... 307
12.1.3 編碼循環體 ........... 310
12.1.4 關閉編碼器 ........... 313
12.2 libavcodec 音頻解碼 .......... 315
12.2.1 主函數實現 ........... 315
12.2.2 音頻解碼器初始化 ......... 316
12.2.3 解碼循環體 ........... 318
12.2.4 關閉解碼器 ........... 324
第13 章 使用FFmpeg SDK 進行音視頻文件的解封裝與封裝 ..... 326
13.1 音視頻文件的解封裝 .......... 326
13.1.1 主函數實現 ........... 326
13.1.2 解復用器初始化 ........... 327
13.1.3 循環讀取碼流包數據 ......... 335
13.1.4 釋放解復用器和解碼器 ......... 338
13.1.5 主函數的整體實現 ......... 339
13.2 音頻流與視頻流文件的封裝 .......... 340
13.2.1 主函數實現 ........... 340
13.2.2 音視頻流復用器的初始化........ 341
13.2.3 復用音頻流和視頻流 ......... 348
13.2.4 釋放復用器實例 ........... 353
第14 章 使用FFmpeg SDK 添加視頻濾鏡和音頻濾鏡 ...... 355
14.1 視頻濾鏡 ............ 355
14.1.1 主函數實現 ........... 355
14.1.2 視頻濾鏡初始化 ........... 356
14.1.3 循環編輯視頻幀 ........... 365
14.1.4 銷毀視頻濾鏡 ........... 368
14.2 音頻濾鏡 ............ 370
14.2.1 主函數框架 ........... 370
14.2.2 音頻濾鏡初始化 ........... 371
14.2.3 循環編輯音頻幀 ........... 380
14.2.4 銷毀音頻濾鏡 ........... 381
第15 章 使用FFmpeg SDK 進行視頻圖像轉換與音頻重采樣 ..... 383
15.1 視頻圖像轉換 ............ 383
15.1.1 主函數實現 ........... 383
15.1.2 視頻格式轉換初始化 ......... 384
15.1.3 視頻的圖像幀循環轉換 ......... 388
15.1.4 視頻格式轉換結構的銷毀和釋放 ........ 390
15.2 音頻重采樣 ............ 391
15.2.1 主函數實現 ........... 392
15.2.2 音頻重采樣初始化 ......... 392
15.2.3 對音頻幀循環重采樣 ......... 397
15.2.4 音頻重采樣結構的銷毀和釋放 ........ 400 |
序: |