深入理解 FFmpeg

劉歧 趙軍 杜金房 趙文傑 宋韶潁

  • 出版商: 人民郵電
  • 出版日期: 2023-11-01
  • 售價: $839
  • 貴賓價: 9.5$797
  • 語言: 簡體中文
  • 頁數: 530
  • ISBN: 7115621365
  • ISBN-13: 9787115621368
  • 立即出貨

  • 深入理解 FFmpeg-preview-1
  • 深入理解 FFmpeg-preview-2
深入理解 FFmpeg-preview-1

買這商品的人也買了...

商品描述

本書詳細介紹了開源音視頻處理軟件FFmpeg的使用,按照所講述的內容及讀者的不同層次,本書劃分為上下兩篇。上篇為基礎與參數詳解,介紹了FFmpeg的基本組成部分、工具使用,以及封裝、轉碼、流媒體、濾鏡和設備操作。下篇為API使用及開發,介紹了FFmpeg封裝、編解碼和濾鏡部分的API使用操作,相關操作均以實例方式進行說明,包括新舊API的操作方法和異同,並給出了大量的API使用、自定義功能模塊、基於FFmpeg的API開發自己的播放器的示例,以及其在實際開源軟件中的應用等。

  本書不僅適合音視頻流媒體處理的研發人員、對音視頻技術應用和實時音視頻通信感興趣的技術人員,還適合高等院校電腦相關專業的學生閱讀。

作者簡介

刘歧

快手音视频首席架构师、FFmpeg官方源代码活跃维护者和推荐顾问、FFmpeg GSoC Mentor、腾讯云TVP,擅长音视频流媒体技术、分布式流媒体系统设计和流媒体CDN系统开发,个人技术兴趣领域广泛,包括音视频技术、操作系统、分布式系统、通信技术、嵌入式技术等,目前在快手负责音视频基础技术架构升级与优化。

 

赵军

腾讯专家工程师、开源爱好者。2018年成为FFmpeg maintainer,目前在腾讯云音视频负责视频云的编码、系统优化、媒体处理框架相关工作,曾在Intel DCG/NPG 负责基于FFmpeg以及Intel平台上的视频编码/解码/转码、视频后处理、视频分析的硬件加速等工作。

 

杜金房

烟台小樱桃科技创始人、腾讯云TVP、FreeSWITCH中文社区创始人,为FreeSWITCH开源项目贡献了大量代码,包括其中的FFmpeg模块(mod_av)、WebRTC和视频会议MCU代码等,著有《FreeSWITCH权威指南》《Kamailio实战》。

 

赵文杰

好未来教育集团资深架构师、开源流媒体系统SRS 作者成员,擅长音视频编解码技术、流媒体直播技术、播放器开发技术、客户端技术等,已获得多篇音视频流媒体相关专利,曾任职于北京蓝汛、海尔、搜狐畅游等公司。

 

宋韶颍

快手音视频SDK工程师,擅长音视频编解码技术、流媒体直播技术,深度使用FFmpeg落地多个分布式转码系统、流媒体CDN系统、音视频云编辑系统,曾任职于北京蓝汛、金山云等公司。

目錄大綱

上篇 基礎與參數詳解

第 1章 多媒體基礎 2

1.1 從現實世界到數字世界 2

1.1.1 顏色和圖像 2

1.1.2 電影、電視和視頻 4

1.1.3 音頻 6

1.1.4 音視頻封裝、傳輸和 未來 10

1.2 視頻圖像像素點的數據格式 10

1.2.1 圖像的位深 10

1.2.2 FourCC 11

1.2.3 灰度模式表示 11

1.2.4 YUV色彩表示 11

1.2.5 RGB色彩表示 15

1.2.6 HSL與HSV色彩表示 18

1.3 視頻逐行和隔行掃描、NTSC與 PAL制式 19

1.3.1 逐行與隔行掃描 19

1.3.2 NTSC制式 20

1.3.3 PAL制式 21

1.4 幀率、PTS和DTS 22

1.5 圖像分辨率與寬高比 22

1.6 圖像的色彩空間 23

1.7 音頻採樣數據格式 24

1.7.1 聲道 25

1.7.2 採樣率 26

1.7.3 採樣位深 27

1.7.4 帶寬計算 28

1.8 小結 28

第 2章 FFmpeg簡介 29

2.1 FFmpeg的發展歷史 29

2.2 FFmpeg的基本組成 31

2.2.1 封裝/解封裝模塊 AVFormat 32

2.2.2 編/解碼模塊AVCodec 32

2.2.3 濾鏡模塊AVFilter 32

2.2.4 設備模塊AVDevice 33

2.2.5 圖像轉換模塊swscale 34

2.2.6 音頻轉換模塊 swresample 34

2.2.7 編解碼工具ffmpeg 34

2.2.8 播放器ffplay 35

2.2.9 多媒體分析器ffprobe 35

2.3 不同平臺下的編譯 35

2.3.1 Windows平臺編譯 FFmpeg 36

2.3.2 Linux平臺編譯 FFmpeg 37

2.3.3 macOS平臺編譯 FFmpeg 38

2.4 FFmpeg特性的選擇與定製 38

2.4.1 編碼器支持 40

2.4.2 解碼器支持 41

2.4.3 封裝支持 41

2.4.4 解封裝支持 42

2.4.5 通信協議支持 42

2.5 小結 43

第3章 FFmpeg工具使用基礎 44

3.1 ffmpeg常用命令 44

3.1.1 封裝轉換 46

3.1.2 解碼和編碼 47

3.1.3 轉碼流程 48

3.2 ffprobe常用命令 49

3.2.1 ffprobe常用參數 49

3.2.2 ffprobe使用示例 51

3.3 ffplay常用命令 58

3.3.1 ffplay常用參數 59

3.3.2 ffplay高級參數 60

3.3.3 ffplay的數據可視化分析 應用 63

3.3.4 ffplay快捷鍵 65

3.4 小結 65

第4章 封裝與解封裝 66

4.1 視頻文件轉MP4 67

4.1.1 MP4格式標準介紹 68

4.1.2 Fragment MP4與CMAF 89

4.1.3 MP4分析工具 91

4.1.4 MP4在FFmpeg中的 Demuxer 94

4.1.5 MP4在FFmpeg中的 Muxer 95

4.2 視頻文件轉FLV 99

4.2.1 FLV文件標準介紹 99

4.2.2 FLV Muxer參數說明 104

4.2.3 文件轉FLV舉例 104

4.2.4 生成帶關鍵索引的 FLV 105

4.2.5 FLV文件格式分析 工具 106

4.3 視頻文件轉MPEG-TS 107

4.3.1 MPEG-TS格式簡介 109

4.3.2 MPEG-TS Muxer參數 說明 113

4.3.3 MPEG-TS格式分析 工具 114

4.4 視頻文件轉HLS 115

4.4.1 HLS標準的M3U8 介紹 116

4.4.2 HLS Muxer參數 119

4.4.3 HLS Muxer舉例說明 119

4.5 視頻文件切片 128

4.5.1 segment切片參數 128

4.5.2 segment切片舉例 129

4.5.3 使用ss與t參數切片 132

4.6 視頻文件的音視頻流抽取 133

4.6.1 提取AAC音頻流 133

4.6.2 提取H.264視頻流 134

4.6.3 提取H.265視頻流 134

4.7 系統資源使用情況 135

4.8 小結 136

第5章 編碼與轉碼 137

5.1 軟編碼H.264 138

5.1.1 x264編碼參數簡介 139

5.1.2 H.264編碼舉例 141

5.2 硬件加速 154

5.2.1 基於OS的硬件加速方案 簡介 155

5.2.2 NVIDIA GPU硬編 解碼 163

5.2.3 Intel QSV硬編解碼 165

5.2.4 Raspberry Pi硬編解碼 170

5.2.5 macOS系統硬編解碼 171

5.2.6 其他加速方案簡介 173

5.3 輸出MP3 173

5.3.1 MP3編碼參數介紹 174

5.3.2 MP3的編碼質量設置 174

5.3.3 平均碼率編碼ABR 參數 176

5.4 輸出AAC 176

5.4.1 AAC編碼器操作 178

5.4.2 FDK-AAC 179

5.4.3 高質量AAC設置 182

5.4.4 AAC音頻質量對比 182

5.5 系統資源使用情況 182

5.6 小結 183

第6章 流媒體技術 184

6.1 錄制與發布RTMP流 185

6.1.1 RTMP參數說明 186

6.1.2 RTMP參數舉例 187

6.2 錄制與發布RTSP流 189

6.2.1 RTSP demuxer參數 介紹 190

6.2.2 RTSP demuxer參數使用 舉例 191

6.2.3 RTSP demuxer/muxer的 一些小說明 193

6.3 錄制HTTP流 194

6.3.1 HTTP參數說明 194

6.3.2 HTTP參數舉例 195

6.4 錄制與發布UDP/TCP流 197

6.4.1 TCP與UDP參數 197

6.4.2 TCP/UDP參數使用 舉例 198

6.4.3 TCP/UDP使用小結 201

6.5 多路流輸出 202

6.5.1 管道方式輸出多路流 202

6.5.2 tee封裝格式輸出 202

6.5.3 tee協議輸出多路流 203

6.6 DASH流輸出 204

6.6.1 參數介紹 205

6.6.2 參數舉例 205

6.7 HDS流輸出 206

6.7.1 參數說明 206

6.7.2 HDS使用舉例 207

6.8 小結 208

第7章 bitstream過濾器 209

7.1 aac_adtstoasc過濾器 210

7.1.1 ADTS格式 210

7.1.2 ASC格式 211

7.2 mp4toannexb過濾器 212

7.2.1 Annex B格式 213

7.2.2 AVCC格式 213

7.2.3 hevc_mp4toannexb/h264_ mp4toannexb的使用 214

7.3 h264_metadata過濾器 215

7.3.1 h264_metadata參數說明  216

7.3.2 h264_metadata參數舉例  216

7.3.3 其他Codec的metadata 過濾器 221

7.4 其他常用bitstream過濾器 221

7.4.1 dump_extra 221

7.4.2 trace_headers 222

7.4.3 filter_units 223

7.5 小結 225

第8章 濾鏡使用 226

8.1 濾鏡表達式使用 226

8.2 濾鏡描述格式 229

8.2.1 濾鏡基本排列方式 229

8.2.2 時間內置變量 229

8.3 視頻水印操作 229

8.3.1 文字水印示例 229

8.3.2 圖片水印示例 232

8.4 畫中畫操作 233

8.5 視頻多宮格處理 235

8.6 視頻字幕操作 237

8.6.1 ASS字幕流寫入視頻流  237

8.6.2 ASS字幕寫入封裝容器  238

8.7 視頻3D化處理 239

8.7.1 stereo3d處理3D視頻 239

8.7.2 3D圖像轉換示例 241

8.8 視頻截圖操作 242

8.8.1 vframes參數截取一張圖片  242

8.8.2 fps濾鏡定時獲得圖片 242

8.9 音頻流濾鏡操作 243

8.9.1 雙聲道合並單聲道 243

8.9.2 雙聲道提取 243

8.9.3 雙聲道轉雙音頻流 244

8.9.4 單聲道轉雙聲道 244

8.9.5 兩個音頻源合並雙聲道 245

8.9.6 多個音頻合並為多聲道  245

8.10 音頻音量探測 246

8.10.1 音頻音量獲得 246

8.10.2 繪制音頻波形 247

8.11 生成測試元數據 248

8.11.1 生成音頻測試流 248

8.11.2 生成視頻測試流 248

8.12 音視頻倍速處理 250

8.12.1 atempo音頻倍速處理 250

8.12.2 setpts視頻倍速處理 251

8.13 雲剪輯常用技術 252

8.13.1 定格幀 252

8.13.2 透明視頻兼容處理 252

8.13.3 隔行交錯視頻兼容處理  253

8.13.4 HDR視頻兼容處理 254

8.13.5 雪碧圖和WebVTT 255

8.13.6 縮略圖 256

8.13.7 復雜項目渲染 256

8.13.8 色度摳圖 257

8.13.9 蒙版摳圖 258

8.13.10 調色 259

8.13.11 透明度調整 259

8.13.12 動態縮放 260

8.13.13 畫質檢測 260

8.13.14 濾鏡動態調整 262

8.13.15 深度學習 262

8.14 小結 264

第9章 採集設備操作 265

9.1 Linux設備操作 265

9.1.1 查看設備列表 265

9.1.2 採集設備fbdev參數說明 和使用 266

9.1.3 採集設備v4l2參數說明 和使用 266

9.1.4 採集設備x11grab參數 說明和使用 268

9.2 macOS設備操作 269

9.2.1 查看設備列表 270

9.2.2 設備採集舉例 270

9.3 Windows設備採集 273

9.3.1 使用dshow採集音視頻 設備 273

9.3.2 使用vfwcap採集視頻 設備 274

9.3.3 使用gdigrab採集窗口 274

9.4 小結 276

下篇 API使用及開發

第 10章 libavformat接口的使用 279

10.1 媒體流封裝 281

10.2 媒體流解封裝 284

10.3 文件轉封裝 288

10.4 視頻截取 290

10.5 AVIO以及示例 292

10.6 AVPacket常用操作 296

10.7 小結 300

第 11章 libavcodec接口的使用 301

11.1 舊接口的使用 302

11.1.1 視頻解碼舊接口 303

11.1.2 視頻編碼舊接口 306

11.1.3 音頻解碼舊接口 308

11.1.4 音頻編碼舊接口 310

11.2 新接口的使用 311

11.2.1 視頻解碼新接口 312

11.2.2 視頻編碼新接口 315

11.2.3 音頻解碼新接口 318

11.2.4 音頻編碼新接口 320

11.3 硬件加速的編解碼 322

11.3.1 硬件加速解碼 323

11.3.2 硬件加速編碼 327

11.4 AVFrame操作 329

11.5 內存操作 335

11.6 小結 337

第 12章 libavfilter接口的使用 338

12.1 Filter和FilterGraph簡述 338

12.2 FFmpeg中內置的濾鏡 340

12.2.1 音頻濾鏡 340

12.2.2 視頻濾鏡 345

12.3 libavfilter的API使用 354

12.4 使用濾鏡給視頻加Logo 356

12.5 小結 360

第 13章 FFmpeg輔助庫的使用 361

13.1 libavutil的dict與opt操作 361

13.2 libswscale的sws_scale圖像 轉換 368

13.2.1 圖像轉換流程 368

13.2.2 代碼實例 370

13.3 libswresample執行聲音轉換 374

13.3.1 聲音轉換流程 374

13.3.2 代碼實例 376

13.4 小結 379

第 14章 音視頻播放器開發實例 380

14.1 播放器開發概述 380

14.2 SDL核心功能API介紹 381

14.2.1 初始化SDL庫 381

14.2.2 圖像渲染 381

14.3 SDL音頻播放 387

14.3.1 SDL事件循環 389

14.3.2 SDL定時器 391

14.4 播放器解碼和展示 392

14.4.1 FFmpegPlayerCtx 393

14.4.2 播放器設計 395

14.4.3 事件循環線程 399

14.4.4 demux線程 400

14.4.5 視頻解碼線程 408

14.4.6 音視頻同步 412

14.4.7 音視頻擴展 417

14.5 小結 417

第 15章 FFmpeg在RTC中的實例解析 418

15.1 RTC的特點 418

15.1.1 什麽是RTC 418

15.1.2 RTC媒體傳輸 419

15.2 FFmpeg在Chromium中的應用 421

15.2.1 FFmpeg在Chromium WebRTC中的應用 422

15.2.2 FFmpeg在Chromium中的其他應用 428

15.3 FFmpeg在FreeSWITCH中的應用 433

15.3.1 FreeSWITCH簡介 433

15.3.2 FreeSWITCH的FFmpeg 模塊開發環境準備 434

15.3.3 FFmpeg初始化和加載  436

15.3.4 avcodec實例 436

15.3.5 avformat實例 447

15.3.6 其他 468

15.4 FFmpeg在BareSIP中的應用  469

15.4.1 AVCodec 469

15.4.2 AVFormat 480

15.4.3 AVFilter 489

15.5 小結 494

第 16章 定製FFmpeg模塊 495

16.1 添加AVFormat模塊 496

16.1.1 book文件格式 496

16.1.2 添加文件 497

16.1.3 添加文件封裝格式 497

16.1.4 添加文件解封裝格式 502

16.2 添加AVCodec模塊 505

16.2.1 book編解碼算法定義 505

16.2.2 實現book編碼 505

16.2.3 實現book解碼 507

16.2.4 將編解碼器註冊到FFmpeg 並加入編譯工程 508

16.2.5 運行測試 509

16.3 添加AVFilter模塊 509

16.3.1 添加基礎濾鏡 509

16.3.2 支持多線程圖像處理  512

16.3.3 支持圖像動態化的表達式 513

16.3.4 支持process_command 515

16.4 添加Protocol模塊 516

16.4.1 添加新協議的消息結構 516

16.4.2 回調函數 517

16.4.3 編譯 518

16.4.4 測試 519

16.5 小結 519

第 17章 FFmpeg調試與測試 520

17.1 自身的調試選項 520

17.1.1 debug選項 520

17.1.2 DTS/PTS問題的排查 521

17.2 loglevel與report  522

17.2.1 使用loglevel 522

17.2.2 使用report 523

17.3 在調用庫時的調試 523

17.3.1 基於日誌 524

17.3.2 基於帶調試信息庫 524

17.4 給社區匯報Bug及提交補丁 525

17.4.1 代碼風格 525

17.4.2 給FFmpeg貢獻代碼 528

17.5 小結 530