ffmpeg基础库编程开发 读书笔记
第一章
1.6 容器和協議
1. 媒體文件和編碼的區別
文件是既包括視頻又包括音頻、甚至還帶有腳本的一個集合,也可以叫做容器;
文件當中的視頻和音頻的壓縮算法才是具體的編碼。
2. 兩大標準指定組織
兩大組織分別是國際標準化組織(iso) 和國際電信聯盟(itu)
在音視頻壓縮標準方面,mpeg系列的協議是iso 制定的標準,而h 系列的協議則是itu 制定的標準
3. h.264
h.264 單看名字,感覺是itu組織制定的,其實它還有一個名字叫mpeg-4 part 10, 這是因為h.264是iso 和itu組織共同制定的,版權共享。
?
1.7 常用概念介紹
1. 軟解和硬解
軟解就是通過軟件讓CPU進行視頻解碼處理;
硬解是指不依賴于CPU, 通過專門的設備(子卡)單獨完成視頻解碼,目前常用的是GPU。
?
1.7.2 IBP幀
1. 幀
幀就是影像動畫中最小單位的單幅影像畫面,相當于電影膠片上的每一格鏡頭
I frame : 幀內編碼幀 又稱 intra picture, I 幀通常是每個GOP的第一幀, 經過適度地壓縮,作為隨機訪問的參考點,可以當成圖像。I幀可以看成是一個圖像經過壓縮后的產物。
P frame : 前向預測編碼幀,又稱predictive-frame, 通過充分將低于圖像序列中前面已編碼幀的時間冗余信息來壓縮傳輸數據量的編碼圖像,也叫預測幀。
B frame : 雙向預測內插編碼幀, 又稱bi-directional interpolated prediction frame, 既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列后面已編碼幀之間的時間冗余信息來壓縮傳輸數據量的編碼圖像,也叫雙向預測幀。
PTS: Presentation Time Stamp。 pts 主要用于度量解碼后的視頻幀什么時候被顯示出來
DTS : Decode Time Stamp. dts 主要是標識讀入內存中的bit 流在什么時候開始送入解碼器中進行解碼。
ps, 在沒有B幀存在的情況下,dts 的順序和pts 的順序應該是一樣的。
2. I幀特點:
1. 它是一個全幀壓縮編碼幀,它將全幀圖像信息進行JPEG壓縮編碼及傳輸
2. 解碼時僅用I幀的數據就可以重構完整圖像;
3. I幀描述了圖像背景和運動主體的詳情;
4. I幀不需要參考其他畫面而生成;
5. I幀是P幀和B幀的參考幀(其質量直接影響到同組中以后各幀的質量);
6. I幀是幀組GOP的基礎幀(第一幀), 在一組中只有一個I幀;
7. I幀不需要考慮運動矢量;
8. I幀所占數據的信息量比較大。
3. P幀: 前向預測編碼幀
P幀的預測與重構:P幀是以I幀為參考幀,在I幀中找出P幀“某點”的預測值和運動矢量,取預測差值和運動矢量一起傳送。在接收端根據運動矢量從I幀中找出P幀“某點”的預測值并與差值相加得到P幀“某點”樣值,從而得到完整的P幀。
P幀特點:
1. P幀是I幀后面相隔1~2幀的編碼幀;
2. P幀采用運動補償的方法傳送它與前面的I幀或P幀的差值及運動矢量(預測誤差);
3. 解碼時必須將I幀中的預測值與預測誤差求和后才能重構完整的P幀圖像;
4. P幀屬于前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀;
5. P幀可以是其后面P幀的參考幀,也可以是其前后B幀的參考幀;
6. 由于P幀也是參考幀,它可能造成解碼錯誤的擴散;
7. 由于是差值傳送,P幀的壓縮比較高。
4. B幀: 雙向預測內插編碼幀
B幀以前面的I或P幀和戶名的P幀為參考幀,找出B幀某點的預測值和兩個運動矢量,并取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中算出預測值并與差值求和,得到B幀某點樣值,從而得到完整的B幀。
B幀特點:
1. B幀是從前面的I幀或P幀和后面的P幀來進行預測的;
2. B幀傳送的是它與前面的I幀或P幀和后面的P幀之間的預測誤差及運動矢量;
3. B幀是雙向預測幀;
4. B幀壓縮比最高,因為它只反映參考幀見運動主體的變化情況,預測比較準確;
5. B幀不是參考幀,不會造成解碼錯誤的擴散。
注意:I、P、B幀是根據壓縮算法需要,是認為定義的,它們是實實在在的物理幀,至于圖像中的哪一幀是I幀,是隨機的。
一般平均來說,I的壓縮率是7, P是20, B可以達到50;
5. GOP
group of pictures 畫面組
gop 策略影響編碼質量,所謂gop, 意思是畫面組,一個gop 就是一組連續的畫面。
MPEG-2 壓縮的幀結構有兩個參數,一個是GOP圖像組的長度,一般可按編碼方式從1-15;另一個是I幀和P幀直接的B幀的數量,一般是1-2個。
?
1.7.5 碼率
一般用kbps(千比特/秒)或者mbps(兆比特/秒)來表示
?
1.7.6 幀率
FPS (幀/秒),就是視頻畫面刷新的速度。作為參考,國內電視機一般是25FPS, 電影標準為24FPS。
?
1.7.7 RGB和YUV
RGB指的就是紅綠藍;而yuv主要指亮度和兩個色差信號,被稱為luminance 和chrominance。我們視頻里面基本上都是用yuv格式。
視頻壓縮用到的是yuv420
?
1.7.8 實時和非實時
實時與非實時,主要用來形容編碼器,它含有兩個意思,一個是要保證幀率,也就是每秒25幀,另一個是live, 意味著直播。
?
第二章 FFmpeg框架
2.1 ffmpeg概述
open-source multimedia library, 遵從GPL/LGPL協議,ffmpeg只是一個商標,它的所有權屬于ffmpeg org.
項目的名稱來自MPEG視頻編碼標準,前面的FF代表Fast Forward
FFmpeg 是一套可以用來記錄、轉換數字音頻、視頻,并將其轉化為流的開源計算機程序。
FFmpeg有非常強大的功能,包括視頻采集功能、視頻格式轉換、視頻抓圖、給視頻加水印等。
2.1.3 模塊組成
1. libavformat : 用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以及生成解碼上下文結構和讀取音視頻幀等功能;音視頻的格式解析協議,為livavcodec分析碼流提供獨立的音頻或視頻碼流源。
2. libavcodec : 用于各種類型聲音/圖像編解碼;該庫是音視頻編解碼核心,實現了市面上大部分解碼器的功能,libavcodec庫被其他各大解碼器ffdshow、Mplayer等所包含或應用;
3. libavdevice : 硬件采集、加速、顯示。
4. libavfilter: filter(FileIO、FPS、DrawText)音視頻濾波器的開發,如寬高比、裁剪、格式化、非格式化伸縮。
5. libavutil : 包含一些公共的工具函數的使用庫,包括算數運算、字符運算
6. libavresample : 音視頻封裝編解碼格式預設等
7. libswresample : 原始音頻格式轉換
8. libpostproc : (同步、時間計算的簡單算法)用于后期效果處理;
9. ffmpeg: 該項目提供的一個工具,用于格式轉換、解碼或即時編碼等
10. ffserver : 一個http 多媒體即時廣播串流服務器
11. ffplay : 簡單播放器
2.2 媒體播放器三大底層框架
大體來說業界主要有3大架構: MPC、Mplayer、VLC。
?
第三章 編譯及簡單應用
1. 安裝mingw
下載地址:https://sourceforge.net/projects/mingw/
執行mingw-get-setup.exe, 一步一步安裝
2. yasm : 匯編編譯器
3. 這個文檔是在windows下面編譯安裝ffmpeg的,所以后面的安裝庫就不記了。
?
3.2 流媒體數據流程講解
?
ffmpeg.c 文件中 main()---av_register_all()
?av_register_all(), 初始化libavcodec 庫,并注冊所有的編解碼器和格式。
3.5 ffmpeg程序的使用
1. ffmpeg是用于轉碼的應用程序,詳細說明文檔:http://ffmpeg.org/ffmpeg.html
2. ffplay 是用于播放的應用程序,詳細說明文檔:http://ffmpeg.org/ffplay.html
3. ffprobe 是用于查看文件格式的應用程序,詳細說明文檔 :http://ffmpeg.org/ffprobe.html
?
第五章 重要模塊
5.1 libavutil 公共模塊
1. common.h? : 基本上是一些宏定義和內聯函數,?common internal and external API header;
2. bswap.h :?byte swapping routines, 字節順序交換,和CPU大小端有關;
? ? 常見的cpu 中,Intel X86 序列及其兼容序列只能是小端, ARM大端小端都支持,但默認小端。
3. rational.h :?Utilties for rational number calculation, 有理數計算
4. mathematics.h :?Mathematical utilities for working with timestamp and time base.
5. avutil.h : Convenience header that includes @ref lavu "libavutil"'s core.
總體來說,avutil 模塊主要有如下功能:
5.2 libavcodec 編解碼模塊
1. avcodec.h :?Encoding/Decoding Library
? ?主要定義編解碼庫使用到的宏、數據結構和函數。通常這些宏、數據結構和函數在這個模塊內相對全局有效。
? ?AV_CODEC_ID_H265 AV_CODEC_ID_HEVC 就是在這個頭文件中定義的。
2. allcodec.c :?Provide registration of all codecs, parsers and bitstream filters for libavcodec.
簡單的注冊、初始化函數,把編解碼器用相應的鏈表串起來便于查找識別。
avcodec_register_all()函數中注冊所有的編解碼器。
?
?
5.3 libavformat 容器模塊
1. avformat.h :?Main libavformat public API header
定義識別文件格式和媒體類型庫使用的宏、數據結構和函數。這些宏、數據結構和函數在這個模塊內基本都是全局的。
2. allformat.c :?簡單的注冊、初始化函數,把編解碼器用相應的鏈表串起來便于查找識別。
av_register_all()函數中注冊所有的編解碼器。
3. file.c : ffmpeg 把file當做類似于rtsp/rtp/tcp 等協議的一種協議,用file: 前綴標示file 協議
4. avio.h 文件:?Buffered I/O operations
文件讀寫模塊定義的數據結構和函數聲明。
5.4 libswscale : 視頻色彩空間轉換
5.5 libswresample : 音頻重采樣
5.6 libavfilter : 音視頻濾波器
5.7 libavdevice : 設備輸入輸出容器
5.8 libpostproc : 視頻后期處理
?
第八章 關鍵函數介紹
8.1 avformat_open_input :
ffmpeg 打開媒體的過程開始于avformat_open_input, 該函數有兩個功能:
1. 輸入輸出結構體AVIOContext的初始化;
2. 輸入數據的協議(如RTMP,file)的識別,通過一套評分機制:1. 判斷文件名的后綴;2. 讀取文件頭的數據進行比對
?每個具體的輸入協議都有自己對應的URLProtocol,比如說rtmp 協議
URLProtocol ff_rtmp_protocol = { .name = "rtmp", .url_open = rtmp_open, .url_read = rtmp_read, .url_write = rtmp_write, .url_close = rtmp_close, .url_read_pause = rtmp_read_pause, .url_read_seek = rtmp_read_seek, .url_get_file_handle = rtmp_get_file_handle, .priv_data_size = sizeof(RTMP), .flags = URL_PROTOCOL_FLAG_NETWORK, };8.2 avcodec_register_all
ffmpeg注冊復用器、編碼器等的函數av_register_all, 該函數在所有基于ffmpeg的應用程序中幾乎都是第一個被調用的。只有調用了該函數,才能使用復用器,編碼器等。
8.3 av_read_frame
ffmpeg中的av_read_frame的作用是讀取碼流中的音頻若干幀或者視頻一幀;
解碼視頻的時候,每解碼一個視頻幀,需要先調用av_read_frame獲得一幀視頻的壓縮數據,然后才能對該數據進行解碼(例如H.264中一幀壓縮數據通常對于一個NAL)
?
第九章 ffmpeg相關工程
9.1 ffdshow?
ffdshow是基于ffmpeg的解碼器類庫libavcodec的directshow filter.
ffdshow 是一個非常強大的DirectShow 解碼器,封裝了ffmpeg,libmpeg2 等解碼庫。它也提供了豐富的加工處理選
項,可以銳化畫面,調節畫面的亮度等等。不止是視頻,FFDShow 現在同樣可以解碼音頻,AC3、MP3 等音頻格
式都可支持。并且可以外掛winamp 的DSP 插件,來改善聽覺效果。一個詞形容:強大。
9.2?LAV filters
LAV Filter 是基于ffmpeg 的解碼器類庫libavcodec,以及解封裝器類庫libavformat 的DirectShow Filter。廣泛安裝在
PC 上。
9.3 MPlayer
MPlayer 是一個LINUX 下的視頻播放器,它支持相當多的媒體格式,無論在音頻播放還是在視頻播放方面,可以說
它支持的格式是相當全面的。
視頻格式支持:MPEG、AVI、ASF 與WMV、QuickTime 與OGG/OGM、SDP、PVA、GIF。
音頻格式支持:MP3、WAV、OGG/OGM 文件(Vorbis)、WMA 與ASF、MP4、CD 音頻、XMMS。
?
第十一章 mp4 文件封裝協議分析
11. 概述
MP4文件格式中,所有的內容存在一個稱為movie的容器中, 一個movie可以由多個trak組成。 每個trak就是一個隨時間變化的媒體序列。
注意:一幀音頻可以分解成多個音頻sample, 所有音頻一般用sample作為單位,而不用幀。
MP4文件格式定義里面,用sample這個單詞表示一個時間幀或者數據單元。
每個trak會有一個或者多個sample descriptions
MP4文件中所有的數據都封裝在一些box中,以前叫atom
?
11.2? mp4 的物理結構
一個trak的連續幾個sample組成的單元就被稱為chunk
?
11.4 mp4 的時間結構
關鍵詞:
1.?trak 表示一些sample的集合,對于媒體數據來說,track表示一個視頻或音頻序列
2.?sample video sample即為一幀視頻,或一組連續視頻幀,audio sample即為一段連續的壓縮音頻,它們統稱
sample
3.?chunk 一個trak的幾個sample組成的單元;
4.?box box 由header 和body 組成,其中header 統一指明box 的大小和類型,body 根據類型有不同的意義和格
式。標準的box 開頭的4 個字節(32 位)為box size,該大小包括box header 和box body 整個box 的大小,這樣我
們就可以在文件中定位各個box。size 后面緊跟的32 位為box type,一般是4 個字符,如“ftyp”、“moov”等,這
些box type 都是已經預定義好的,分別表示固定的意義
?MP4 文件的結構樹:
?11.5 文件結構分析
1. File type box (ftyp)
該box 有且只有一個,并且只能被包含在文件層,而不能被其他box包含。該box應該被放在文件的最開始,指示該MP4文件應用的相關信息。
2. Movie Box (moov)
該box包含了文件媒體的metadata 信息, “moov”是一個container box, 具體內容信息由子box 詮釋。同file type box 一樣,該box 有且只有一個,且只被包含在文件層。一般情況下,moov會緊隨ftyp 出現
一般情況下,moov中會包含一個mvhd和若干個trak, 其中mvhd 為header? box, 一般作為moov的第一個子box 出現。
3.? Movie Header Box (mvhd)
mvhd定義了整個movie的特性,例如time scale 和duration, 它的atom 類型是mvhd
4. Track box (trak)
主數據存儲結構,一部movie可以包含一個或多個tracks, 它們之間相互獨立,各自有各自的時間和空間信息,每個trak atom 都有與之關聯的media atom
trak atoms 的atom 類型都是trak, trak atom 要求必須有一個trak header atom(tkhd) 和一個media atom(mdia).
5. Media box(mdia)
mdia 也是一個container box , 其子box 的結構和種類還是比較復雜的。樹結構如下:
總體來說,mdia 定義了trak媒體類型以及sample數據,描述sample信息。
一般mdia 包含一個mdhd, 一個hdlr,一個minf,其中mdhd 為media head box, hdlr 為handler reference box, minf 為media information box .
6. Sample Table Box (stbl)
stbl 包含了關于trak 中sample所有時間和位置的信息,以及sample的編解碼等信息。利用這個表,可以解釋sample的實現、類型、大小和在各自存儲容器中的位置。stbl 是一個container box, 其子box 包括stsd, stts, stsz, stsc , stco, ctts, stss等
?
第十二章 flv 文件格式分析
12.1 概要
FLV視頻格式是Adobe 公司設計開發的一種流媒體的封裝格式,總體上看,FLV包括文件頭(FLV Header)和文件體(FLV body)兩部分,其中文件體由一系列的Tag 及Tag Size 對組成。
Tag 又可以分為三類:audio 、video、script
12.2 文件總體結構
?12.3 文件結構分析
1. flv 文件頭的結構
在ffmpeg 進行格式識別的時候,是以頭部的前3 個字節進行探測,識別到'F' 'L' 'V'即可認定該格式為flv 格式。
2. body 主體結構
Tag 包括Tag Header 和Tag Data 兩部分。
3. 如果SoundFormat 是10 (AAC),TagDataHeader 后緊隨著一個1 個字節的數據AACPacketType,這個字段來表
示AACAUDIODATA 的類型:0 = AAC sequence header,1 = AAC raw。在flv 中一般情況下,帶有該AACPacketType
的Tag 只會在第一個audio Tag 中出現一次,因為aac 格式的音頻需要在每幀AAC ES 流前邊添加7 個字節ADST
頭(相當于幀頭),就是AAC 的純ES 流要打包成ADST 格式的AAC 文件,解碼器才能正常播放.特別對于RTSP,RTP
等實時傳輸流,ADST 必須存在,否則傳輸過來的流不知道該怎么播放。
4.?SCRIPT Tag。該類型Tag 又通常被稱為Metadata Tag
通常該類型Tag 會跟在File Header 后面作為第一個Tag 出現,而且只有一個
一般來說,該Tag Data 結構包含兩個AMF 包。AMF(Action Message Format)是Adobe 設計的一種通用數據
封裝格式,在Adobe 的很多產品中應用,簡單來說,AMF 不區分根節點與子節點,將不同類型的數據用統一的格
式來描述。第一個AMF 包封裝字符串類型數據,即:“02” type+string length+“onMetaData”。第二個AMF 包封裝
一個數組類型,這個數組中包含了音視頻信息項的名稱和值。
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的ffmpeg基础库编程开发 读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MOV及MP4文件格式中几个重要的Tab
- 下一篇: F4V 封装格式详解(一)-------