FFmpeg 基本知識

容器(container):就是文件格式,在視頻文件進入處理後,我們會給這個視頻文件一個抽象,這個抽象就是存放這種視頻文件的容器,在FFMPEG中,用來抽象文件格式的容器就是AVFormatContext;


數據流(stream):數據流就是我們平時看到的多媒體數據流,它包含幾種基本的數據流,包括:視頻流、音頻流、字幕流;按照我的理解,這三種基本的數據流在時間軸上交錯放置,只有這樣才能滿足多媒體數據流邊接收邊播放;數據流在FFMPEG中的抽象爲AVStream。


解複用器或者說分流器(demuxer):FFMPEG將要處理的多媒體文件看成多媒體數據流,先把多媒體數據流放入容器(AVFormatContext),然後將數據流送入解複用器(demuxer),demuxer在FFMPEG中的抽象爲AVInputFormat,我更願意把demuxer稱爲分流器,因爲demuxer就是把交錯的各種基本數據流識別然後分開處理,將分開的數據流分別送到視頻、音頻、字幕編解碼器處理。


數據包(packet)當然分開的數據流在送往編解碼器處理之前,要先放於緩存中,同時添加一些附屬信息例如打上時間戳,以便後面處理,那麼這個緩存空間就是數據包;由於數據流是在時間軸上交錯放置,所以所有的視頻、音頻、字幕都被分割成一段一段的數據,這些一段段的數據從數據流中解析出來之後,就是存放在各自的packet,那麼在這裏要說明一下,單純的視頻數據包來說,一個視頻數據包可以存放一個視頻幀,對於單純的音頻幀來說,如果抽樣率(sample-rate)是固定不變的,一個音頻數據包可以存放幾個音頻幀,若是抽樣率是可變的,則一個數據包就只能存放一個音頻幀。


在H264中沒有數據包的概念,估計是因爲H264只對視頻做處理,所以不用分流,也就不用分流之後的緩存。


數據幀(frame):終於到數據幀了,編解碼器真正處理的數據就是數據幀,幀這個東西,就是爲了方便處理圖像信息抽象出來的概念,按照我自己的理解,就是原始的圖像數據信息+很多附加的信息=幀;附加的信息就是便於後面編碼的信息,例如幀的解碼時間、幀的顯示時間等,這些信息都是爲了編解碼和播放的方便添加上去的,當然幀的附加信息遠多於這兩個信息,有興趣的可以去看AVFrame,這是幀在FFMPEG中抽象。


我們看到多媒體文件很大,就是因爲這些附加信息也佔據了很大的存儲空間,此外還有協議等信息,當然沒有這些附加信息,這原始的或壓縮的數據流還真不好處理,例如怎麼分辨上一幀與下一幀,這就要靠這些附加信息了。


圖像(picture):FFMPEG中抽象出來分別是AVPictue,這纔是真正圖像像素信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章