《FFmpeg開發實戰:從零基礎到短視頻上線》是一本FFmpeg開發的實戰教程,由淺入深,由基礎到高級,帶領讀者一步一步走進音視頻開發的神奇世界。全書共分為12章。其中,第1~5章是基礎部分,主要講解FFmpeg的環境搭建、FFmpeg的開發基礎、FFmpeg的編解碼、FFmpeg處理圖像和FFmpeg處理音頻;第6~10章是進階部分,主要講解FFmpeg加工視頻、FFmpeg添加圖文、FFmpeg自定義濾鏡、FFmpeg混合音視頻和FFmpeg播放音視頻;第11和12章是平臺應用部分,主要講解FFmpeg的桌面開發和FFmpeg的移動開發。本書在講解FFmpeg知識點的同時給出了大量實戰范例,方便讀者迅速將所學的知識運用到音視頻開發中。通過本書的學習,讀者能夠掌握音視頻開發的基本技術,包括音視頻查看、音視頻轉換、音視頻播放、音視頻剪輯、視頻推拉流等。
《FFmpeg開發實戰:從零基礎到短視頻上線》適用于廣大從事FFmpeg開發的專業人士、有志于轉型FFmpeg開發的程序員以及對FFmpeg開發有興趣的業余愛好者,也可作為大中專院校和培訓機構音視頻課程的教材。
由從業十余年一線資深音視頻開發專家、暢銷書作者傾力編撰,通俗、易學、實用,貼近開發實踐。
深入淺出地介紹FFmpeg的基本概念、基礎知識和高級特性,從入門到精通,適合不同層次的讀者學習。
案例豐富,基本上每章都提供項目案例,全書共9個項目案例,所有項目全流程完整呈現,并給出詳盡的代碼實現和注解說明,直接套用即可開發出自己的應用。
涵蓋內容廣泛,涉及從桌面開發到移動開發,如音視頻查看、播放、轉換、剪輯、推拉流等內容。
音視頻開發是近年來的新興軟件開發行業,廣泛運用于在線視頻、網絡直播、安防監控、遠程辦公、線上課堂等業務場景。特別是隨著5G技術的深入應用和短視頻自媒體的廣泛傳播,音視頻領域的技術支持顯得愈發重要。
在眾多音視頻開發技術框架中,FFmpeg是最基礎的音視頻處理平臺。不論是音視頻的編碼、加工,還是傳輸,都離不開FFmpeg的支撐。可以說,入門音視頻開發的第一個門檻就是FFmpeg,掌握FFmpeg是進軍音視頻開發的必經之路。
盡管FFmpeg在音視頻領域擁有舉足輕重的地位,但長期以來入門FFmpeg開發并非易事。一方面,音視頻涉及的專業概念種類繁多,初學者容易困惑;另一方面,FFmpeg基于Linux環境的C語言開發,個人開發由于環境限制,難以深入FFmpeg編程。此外,FFmpeg作為底層框架本身并不提供可視化交互界面。例如,桌面程序需要Qt環境,而手機App需要Android環境,因此,在真正運用FFmpeg時,需要結合FFmpeg Qt,或者FFmpeg Android,這無疑增加了學習FFmpeg編程的難度。
基于以上考慮,本書按照下列章節結構來介紹FFmpeg開發實戰。
第一,在解釋音視頻概念時,首先闡述相關術語的來龍去脈,然后描述這些概念的原理和分類,并最后提供對應的FFmpeg范例代碼,使讀者能夠逐步理解音視頻的基礎知識,從理論到實踐。
第二,詳細說明在Linux環境編譯FFmpeg及其相關庫的步驟,同時也詳述在Windows環境編譯FFmpeg及其相關庫的步驟,以便讀者能夠在個人計算機上搭建FFmpeg的開發學習環境。
第三,對于通過FFmpeg實現的每項功能,不僅提供基于函數調用的示例代碼,還提供具體的FFmpeg操作命令,是本書兼具FFmpeg的代碼開發教程與FFmpeg的命令使用手冊兩種用途。
第四,最后兩章介紹了在Qt環境中集成FFmpeg并在計算機上運行播放影音的桌面程序,以及在Android Studio環境中集成FFmpeg并在手機上運行剪輯視頻的手機App。這方便讀者學以致用,能夠迅速將FFmpeg編程應用到桌面開發與移動開發中。
第五,在介紹FFmpeg開發的過程中,引入了一些輔助工具用于編譯、瀏覽、分析、加工等操作,包括Visual Studio、MSYS、CMake、VLC、YUView、Audacity、Subtitle Edit、MediaMTX等。本書對這些工具都進行詳細介紹,以幫助讀者熟練掌握FFmpeg開發技能。
全書共分為12章。其中,第1~5章是基礎部分,主要講解FFmpeg環境搭建、FFmpeg開發基礎、FFmpeg的編解碼、FFmpeg處理圖像、FFmpeg處理音頻;第6~10章是進階部分,主要講解FFmpeg加工視頻、FFmpeg添加圖文、FFmpeg自定義濾鏡、FFmpeg混合音視頻、FFmpeg播放音視頻; 第11和12章是平臺應用部分,主要講解FFmpeg的桌面開發和FFmpeg的移動開發。
本書在講解FFmpeg知識點的同時給出了大量實戰范例,方便讀者迅速將所學的知識運用到音視頻開發中。這些實戰范例包括:圖片轉視頻、拼接兩段音頻、老電影懷舊風、卡拉OK音樂短片、側邊模糊濾鏡、翻書轉場動畫、同步播放音視頻、桌面影音播放器、仿剪映的視頻剪輯等。通過實戰項目的練習,讀者能夠掌握音視頻的基本開發技術,包括音視頻查看、音視頻轉換、音視頻播放、音視頻剪輯、視頻推拉流等。
所謂零基礎,指的是FFmpeg零基礎,而非C語言零基礎,在讀者開始學習本書之前,建議先學完譚浩強的《C程序設計》,且需要掌握基本的Linux操作命令。在學習第11章之前,建議先入門Qt平臺的C 桌面編程。在學習第12章之前,建議先掌握Android平臺的Java移動編程,可參考筆者的App開發專著《Android Studio開發實戰:從零基礎到App上線(第3版)》。
本書中與FFmpeg相關的C代碼都是基于FFmpeg 5.1.2編寫的。前10章的C/C 代碼在Linux(包括EulerOS和CentOS)和Windows(包括Windows 10和Windows 11)上編譯和調試通過;第11章的程序代碼采用C 編寫,并在Qt 6.5.2上編譯和調試通過;第12章的App代碼采用Java與C 編寫,并在Android Studio Dolphin(小海豚版本)上編譯和調試通過。
在學習音視頻開發過程中,需要用到一些開源軟件,逐個下載它們頗費功夫,而且部分軟件還要搭配對應的FFmpeg版本。為了方便讀者使用這些軟件,筆者把本書用到的軟件源碼和安裝文件統一打包,并與隨書配套的例程源碼和演示課件放在一起,讀者可掃描下方的二維碼一起下載。
如果你在下載過程中遇到問題,請發郵件至booksaga@126.com,郵件標題為FFmpeg開發實戰:從零基礎到短視頻上線獲得幫助。
最后,感謝王金柱編輯的熱情指導,感謝出版社其他人員的辛勤工作,感謝我的家人一直以來的支持,感謝各位師長的諄諄教導。沒有他們的鼎力相助,本書就無法順利完成。
歐陽燊
2024年1月
歐陽燊,碩士,資深開發專家,擁有18年以上軟件開發經驗,對C/C 、Java、Android相關領域的開發、架構駕輕就熟,職業生涯開發過大量企業級項目,實戰經驗極為豐富。出版暢銷書《Android Studio開發實戰:從零基礎到App上線》。
第 1 章 FFmpeg環境搭建 1
1.1 FFmpeg簡介 1
1.1.1 FFmpeg是什么 1
1.1.2 FFmpeg的用途 1
1.1.3 FFmpeg的發展歷程 2
1.2 Linux系統安裝FFmpeg 2
1.2.1 Linux開發機配置要求 2
1.2.2 安裝已編譯的FFmpeg及其SO庫 3
1.2.3 自行編譯與安裝FFmpeg 5
1.3 在Windows系統下安裝FFmpeg 10
1.3.1 Windows開發機配置要求 10
1.3.2 安裝依賴的Windows軟件 10
1.3.3 安裝已編譯的FFmpeg及其DLL庫 15
1.4 FFmpeg的開發框架 17
1.4.1 可執行程序 18
1.4.2 動態鏈接庫 21
1.4.3 第一個FFmpeg程序 23
1.5 小結 26
第 2 章 FFmpeg開發基礎 27
2.1 音視頻的編碼標準 27
2.1.1 音視頻編碼的發展歷程 27
2.1.2 音視頻文件的封裝格式 29
2.1.3 國家數字音視頻標準AVS 31
2.2 FFmpeg的主要數據結構 34
2.2.1 FFmpeg的編碼與封裝 35
2.2.2 FFmpeg的數據包樣式 37
2.2.3 FFmpeg的過濾器類型 39
2.3 FFmpeg查看音視頻信息 41
2.3.1 打開與關閉音視頻文件 41
2.3.2 查看音視頻的信息 42
2.3.3 查看編解碼器的參數 45
2.4 FFmpeg常見的處理流程 47
2.4.1 復制編解碼器的參數 47
2.4.2 創建并寫入音視頻文件 51
2.4.3 使用濾鏡加工音視頻 54
2.5 小結 58
第 3 章 FFmpeg的編解碼 59
3.1 音視頻時間 59
3.1.1 幀率和采樣率 59
3.1.2 時間基準的設定 62
3.1.3 時間戳的計算 64
3.2 分離音視頻 67
3.2.1 原樣復制視頻文件 67
3.2.2 從視頻文件剝離音頻流 70
3.2.3 切割視頻文件 72
3.3 合并音視頻 74
3.3.1 合并視頻流和音頻流 74
3.3.2 對視頻流重新編碼 76
3.3.3 合并兩個視頻文件 82
3.4 視頻瀏覽與格式分析 85
3.4.1 通用音視頻播放器 86
3.4.2 視頻格式分析工具 88
3.4.3 把原始的H264文件封裝為MP4格式 90
3.5 小結 92
第 4 章 FFmpeg處理圖像 93
4.1 YUV圖像 93
4.1.1 為什么要用YUV格式 93
4.1.2 把視頻幀保存為YUV文件 98
4.1.3 YUV圖像瀏覽工具 100
4.2 JPEG圖像 106
4.2.1 為什么要用JPEG格式 106
4.2.2 把視頻幀保存為JPEG圖片 107
4.2.3 圖像轉換器 110
4.3 其他圖像格式 112
4.3.1 把視頻幀保存為PNG圖片 113
4.3.2 把視頻幀保存為BMP圖片 116
4.3.3 把視頻保存為GIF動畫 119
4.4 實戰項目:圖片轉視頻 124
4.5 小結 131
第 5 章 FFmpeg處理音頻 132
5.1 PCM音頻 132
5.1.1 為什么要用PCM格式 132
5.1.2 把音頻流保存為PCM文件 135
5.1.3 PCM波形查看工具 139
5.2 MP3音頻 142
5.2.1 為什么要用MP3格式 142
5.2.2 Linux環境集成mp3lame 144
5.2.3 把音頻流保存為MP3文件 145
5.3 其他音頻格式 148
5.3.1 把音頻流保存為WAV文件 148
5.3.2 把音頻流保存為AAC文件 152
5.3.3 音頻重采樣 158
5.4 實戰項目:拼接兩段音頻 163
5.5 小結 168
第 6 章 FFmpeg加工視頻 169
6.1 濾波加工 169
6.1.1 簡單的視頻濾鏡 169
6.1.2 簡單的音頻濾鏡 176
6.1.3 利用濾鏡切割視頻 182
6.1.4 給視頻添加方格 185
6.2 添加特效 188
6.2.1 轉換圖像色度坐標 188
6.2.2 添加色彩轉換特效 192
6.2.3 調整明暗對比效果 195
6.2.4 添加淡入淡出特效 197
6.3 變換方位 199
6.3.1 翻轉視頻的方向 199
6.3.2 縮放和旋轉視頻 200
6.3.3 裁剪和填充視頻 202
6.4 實戰項目:老電影懷舊風 204
6.5 小結 206
第 7 章 FFmpeg添加圖文 207
7.1 添加圖標 207
7.1.1 添加圖片標志 207
7.1.2 清除圖標區域 209
7.1.3 利用調色板生成GIF動畫 211
7.2 添加文本 214
7.2.1 Linux環境安裝FreeType 214
7.2.2 添加英文文本 216
7.2.3 添加中文文本 218
7.3 添加字幕 221
7.3.1 Linux環境安裝libass 221
7.3.2 Linux安裝中文字體 225
7.3.3 添加中文字幕 226
7.4 實戰項目:卡拉OK音樂短片 229
7.4.1 視頻字幕制作工具 229
7.4.2 制作卡拉OK字幕 233
7.5 小結 237
第 8 章 FFmpeg自定義濾鏡 238
8.1 Windows環境編譯FFmpeg 238
8.1.1 給FFmpeg集成x264 238
8.1.2 給FFmpeg集成avs2 241
8.1.3 給FFmpeg集成mp3lame 243
8.1.4 給FFmpeg集成FreeType 245
8.1.5 給FFmpeg集成x265 248
8.2 優化FFmpeg源碼 255
8.2.1 讀寫音視頻文件的元數據 255
8.2.2 元數據的中文亂碼問題處理 258
8.2.3 修改FFmpeg源碼解決亂碼 262
8.3 自定義視頻濾鏡 265
8.3.1 添加模糊和銳化特效 265
8.3.2 視頻濾鏡的代碼分析 267
8.3.3 自定義視頻翻轉濾鏡 269
8.4 實戰項目:側邊模糊濾鏡 271
8.4.1 實現兩側模糊邏輯 271
8.4.2 集成側邊模糊濾鏡 275
8.5 小結 277
第 9 章 FFmpeg混合音視頻 278
9.1 多路音頻 278
9.1.1 同時過濾視頻和音頻 278
9.1.2 利用多通道實現混音 281
9.1.3 給視頻添加背景音樂 289
9.2 多路視頻 293
9.2.1 通過疊加視頻實現畫中畫 293
9.2.2 多路視頻實現四宮格效果 302
9.2.3 透視兩路視頻的混合畫面 307
9.3 轉場動畫 311
9.3.1 給視頻添加轉場動畫 311
9.3.2 轉場動畫的代碼分析 314
9.3.3 自定義斜邊轉場動畫 317
9.4 實戰項目:翻書轉場動畫 322
9.4.1 貝塞爾曲線實現翻頁特效 322
9.4.2 集成翻書轉場動畫效果 326
9.5 小結 329
第 10 章 FFmpeg播放音視頻 330
10.1 通過SDL播放音視頻 330
10.1.1 FFmpeg集成SDL 330
10.1.2 利用SDL播放視頻 335
10.1.3 利用SDL播放音頻 342
10.2 FFmpeg推流和拉流 346
10.2.1 什么是推拉流 346
10.2.2 FFmpeg向網絡推流 350
10.2.3 FFmpeg從網絡拉流 353
10.3 SDL處理線程間同步 355
10.3.1 SDL的線程 355
10.3.2 SDL的互斥鎖 357
10.3.3 SDL的信號量 360
10.4 實戰項目:同步播放音視頻 367
10.4.1 同步音視頻的播放時鐘 367
10.4.2 優化音視頻的同步播放 371
10.5 小結 376
第 11 章 FFmpeg的桌面開發 377
11.1 搭建Qt開發環境 377
11.1.1 安裝桌面開發工具Qt 377
11.1.2 創建一個基于C 的Qt項目 381
11.1.3 把Qt項目打包成可執行文件 383
11.2 桌面程序播放音頻 385
11.2.1 給Qt工程集成FFmpeg 385
11.2.2 Qt工程使用SDL播放音頻 387
11.2.3 通過QAudioSink播放音頻 392
11.3 桌面程序播放視頻 396
11.3.1 通過QImage播放視頻 396
11.3.2 OpenGL的著色器小程序 404
11.3.3 使用OpenGL播放視頻 407
11.4 實戰項目:桌面影音播放器 411
11.5 小結 415
第 12 章 FFmpeg的移動開發 416
12.1 搭建Android開發環境 416
12.1.1 搭建Android的NDK開發環境 416
12.1.2 交叉編譯Android需要的SO庫 420
12.1.3 App工程調用FFmpeg的SO庫 421
12.2 App通過FFmpeg播放音頻 427
12.2.1 交叉編譯時集成mp3lame 427
12.2.2 通過AudioTrack播放音頻 429
12.2.3 使用OpenSL ES播放音頻 432
12.3 App通過FFmpeg播放視頻 439
12.3.1 交叉編譯時集成x264和FreeType 439
12.3.2 通過ANativeWindow播放視頻 443
12.3.3 使用OpenGL ES播放視頻 449
12.4 實戰項目:仿剪映的視頻剪輯 455
12.5 小結 461
附錄A 音視頻專業術語索引 462