FFmpeg基本常識和相關術語
1. FFmpeg
FFmpeg 強大專用于處理音視頻的開源庫,包含了先進的音視頻編解碼庫,提供了錄制、轉換以及流傳輸音視頻的完整跨平臺解決方案。
既可以使用它的API對音視頻進行處理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,來編輯音視頻文件。
開源代碼
https://github.com/FFmpeg/FFmpeg
特點
1.功能完整:
FFmpeg是領先的多媒體框架,能夠解碼(decode)、編碼(encode)、轉碼(transcode)、復用(mux)、解復用(demux)、流(stream)、過濾(filter)和播放(play)人類和機器創(chuàng)建的幾乎所有內(nèi)容。
2.幾乎支持所有格式:
FFmpeg支持最模糊的古代格式直至最前沿。
無論是由某些標準委員會、社區(qū)還是公司設計的。
3.跨平臺高度可移植性:
FFmpeg可以在各種構建環(huán)境:機器體系結構和配置下,跨Linux、Mac OS X、Microsoft Windows、BSD、Solaris等編譯,運行并通過測試基礎架構 FATE。
4.每日更新的文檔:
各種在線每晚更新一次,并且對應于最新的FFmpeg版本。
2.?FFmpeg播放流程及相關術語
2.1 播放流程:
video.avi(Container) -> 打開得到 Video_Stream -> 讀取Packet -> 解析到 Frame -> 顯示Frame。
2.2 相關術語:
2.2.1 「封裝格式(Container Format)」
封裝格式(Container Format),
可看作是編碼流(Stream)(音頻、視頻等)數(shù)據(jù)的一層外殼,將編碼后的數(shù)據(jù),存儲于此封裝格式的文件之內(nèi)。
封裝又稱容器(Container),
容器的用詞更為形象。容器就是存放內(nèi)容的器具。
目的是為了運輸和傳送的。
例如:飲料是內(nèi)容,那么裝飲料的瓶子就是容器。
對視頻來說,封裝格式是MP4、AVI、MKV、RMVB等格式。
2.2.2 「流(Stream)」
流(Stream)是一種音視頻數(shù)據(jù)信息的傳輸方式。
有五種流:視頻流(Video Stream)、音頻流(Audio Stream)、字幕(Subtitle)、附件(t)、數(shù)據(jù)(d)。
例如:曾經(jīng)多年前使用VCD看港片,可以選擇粵語或國語聲音,是視頻文件中存放了兩路音頻流,可供用戶選擇其中一路進行播放。
2.2.3 「幀(Frame)」
幀(Frame)本意代表一幅靜止的圖像。
在流(Stream)中,幀代表最小數(shù)據(jù)單元,也是編解碼器真正處理的最小處理單元。
數(shù)字視頻處理的幀,通常不是說原始圖像,而是被編碼器編碼后的一個圖像。
對于視頻來說,幀(Frame)是編碼器編碼后的一個圖像;
對于音頻來說,幀(Frame)是編碼器編碼后的一個聲音。
幀(Frame)分為:I幀:關鍵幀、P幀:預測幀、B幀:雙向預測幀。
2.2.4 「編解碼(Codec)」
每路音視頻流(Stream)都會以幀(Frame)為最小單位,
被相應的編/解碼器(Codec)進行編碼或解碼,以實現(xiàn)原始數(shù)據(jù)和壓縮數(shù)據(jù)之間的相互轉換。
編碼(Codec)是對原始數(shù)據(jù)的加工,
是對輸入源進行處理,然后輸出的過程。簡單說,就是對圖像和聲音的壓縮方法。
視頻編碼主要有:H263、H264、H265、MPEG系列等。
編碼(Codec)其實是編碼(COde)和解碼(DECode)的合稱。
CODEC = COde(編碼) + DECode(解碼)
解碼就是把編碼后的東西還原為原來的狀態(tài)。
對于視頻來說,就是把壓縮的圖像和聲音還原為正??梢圆シ诺膱D像和聲音。
編碼可以改變文件格式,或者文件格式不變,只更改其他數(shù)據(jù)。
FFmpeg編解碼是基于比特流進行的。
2.2.5 「數(shù)據(jù)包(Packet)」
數(shù)據(jù)包(Packet)是從流(Stream)中讀取的原始Raw數(shù)據(jù)片段,這些數(shù)據(jù)片段中,包含的是解碼后能被應用程序處理的原始幀(Raw Frame)數(shù)據(jù)。
分開的數(shù)據(jù)流在送往編解碼器(Codec)處理之前,要先放于緩存中,
添加一些附屬信息(例如:打上時間戳)以便后續(xù)處理,這個緩存空間就是數(shù)據(jù)包(Packet);

由于數(shù)據(jù)流是在時間軸上交錯放置,所有的視頻、音頻、字幕都被分割成一段一段的數(shù)據(jù),
這些一段段的數(shù)據(jù)從數(shù)據(jù)流中解析出來之后,就是存放在各自的數(shù)據(jù)包(Packet)。
單純的視頻數(shù)據(jù)包來說,一個視頻數(shù)據(jù)包可以存放一個視頻幀;
單純的音頻幀來說,如果抽樣率(sample-rate)是固定不變的,一個音頻數(shù)據(jù)包可以存放幾個音頻幀;若是抽樣率是可變的,則一個數(shù)據(jù)包就只能存放一個音頻幀。