FFmpeg,H.264,Directshow,和opencv及視頻編碼與封裝格式

http://www.voidcn.com/blog/yhhyhhyhhyhh/article/p-5769736.html

    最近做項目,參考網上的資料,梳理了一下視頻採集,編碼,傳輸,顯示相關知識及常用的視頻處理框架和開源庫(本文有誤的地方請見諒,好多概念網上說的感覺都不清楚)。


一.FFmpeg,H.264,Directshow,和opencv

1)FFmpeg:一套開源的音視頻處理的框架或程序。

2)H.264:一種目前比較高效的視頻壓縮標準或一套編解碼協議x264是關於H.264的一個開源項目是實現這種視頻壓縮的方法(算法或軟件))。

3)DirectShow:微軟推出的流媒體處理的開發包

4)Opencv:一個開源的計算機視覺的處理庫

       FFmpeg,Directshow和opencv都可以實現視頻文件和流數據(攝像頭採集)的播放處理,其中Directshow攝像頭採集的數據(攝像頭採集數據返回的數據類型和opencv一致),可以直接在opencv中的接口使用。

FFmpeg中的libavcodec包含了音視頻編解碼器的庫,其中包含H.264的編解碼。

Opencv中包含FFmpeg的dll。

1.FFmpeg

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。它包括了領先的音/視頻編碼庫libavcodec等。FFmpeg有非常強大的功能包括視頻採集功能、視頻格式轉換、視頻抓圖、給視頻加水印等。FFmpeg視頻採集功能非常強大,不僅可以採集視頻採集卡或USB攝像頭的圖像,還可以進行屏幕錄製,同時還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務器,支持直播應用。FFmpeg Linux上開發,可以在大多數操作系統下編譯,包括Windows

2.H.264:

目前比較高效的視頻壓縮標準(h.265更高效)或一套編解碼協議。

x264則是關於H264的一個開源項目是實現這種視頻壓縮的方法(算法或軟件))。

H.264,同時也是MPEG-4第十部分,是由ITU-T視頻編碼專家組(VCEG)和ISO/IEC動態圖像專家組(MPEG)聯合組成的聯合視頻組(JVT,Joint Video Team)提出的高度壓縮數字視頻編解碼器標準。這個標準通常被稱之爲H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明確的說明它兩方面的開發者。

3.DirectShow

DirectShow是微軟公司推出的新一代基於COM(Component Object Model)的流媒體處理的開發包。主要功能是流媒體的採集與回放。它集成了DirectDraw,DirectSound,Direct3D的一些技術。它是一個開放的架構,你自己可以寫自己的Filter組件。一般在windows下做視頻採集處理。

4.opencv

opencv是一個開源的計算機視覺的處理庫。opencv可以利用DirectShow來採集攝像頭視頻,這比採用opencv裏的採集視頻數據函數要好用。directshow用於視頻採集容易些而opencv用於圖像處理容易些opencv內含ffmpeg編、解碼的dll。所攝像頭時可以:利用DirectShow採集,利用opencv處理。

 Video4linux2(簡稱V4L2),是linux中關於視頻設備的內核驅動。在Linux中,視頻設備是設備文件,可以像訪問普通文件一樣對其進行讀寫,攝像頭在/dev/video0下。

二.視頻編碼與封裝格式

遠程攝像頭採集視頻實時播放機處理流程:

視頻原始數據(攝像頭採集)---->編碼---->傳輸---->終端(解碼,顯示,處理)

1.攝像頭採集的數據格式:

色彩空間或色彩模型:RGB,YUVYCbCr

RGB紅綠藍色彩空間。常見的RGB格式有RGB1RGB4RGB8RGB565RGB555RGB24RGB32ARGB32等;

YUV色彩空間的重要性是它的亮度信號Y和色度信號UV是分離的。

YCbCr 則是在世界數字組織視頻標準研製過程中作爲ITU - R BT1601 建議的一部分其實是YUV經過縮放和偏移的翻版。其中YYUV 中的Y含義一致, Cb , Cr 同樣都指色彩只是在表示方法上不同而已。在YUV 家族中, YCbCr 是在計算機系統中應用最多的成員其應用領域很廣泛,JPEGMPEG均採用此格式。一般人們所講的YUV大多是指YCbCrYCbCr 有許多取樣格式4∶4∶4 , 4∶2∶2 , 4∶1∶1 4∶2∶0常見的YUV格式有YUY2YUYVYVYUUYVYAYUVY41PY411Y211IF09IYUVYV12YVU9YUV411YUV420等。

X264在進行編碼的時候需要標準的YUV(4:2:0)

RGB24一幀的大小size=width×heigth×3 Byte,RGB32的size=width×heigth×4,如果是I420(即YUV標準格式4:2:0)的數據量是 size=width×heigth×1.5 Byte。
在採集到RGB24數據後,需要對這個格式的數據進行第一次壓縮。即將圖像的顏色空間由RGB2YUV。

要看攝像頭驅動支持哪些格式,一般攝像頭採集後輸出的視頻(或幀)格式爲RGB或YUV。也有可能是經過硬件壓縮的格式的圖片。如ZC301芯片的攝像頭輸出是JPEG流,ov511芯片的攝像頭輸出的是16位的RGB圖片。

2.視頻編碼:

視頻流傳輸中最爲重要的編解碼標準有國際電聯的H.261、H.263、H.264,運動靜止圖像專家組的M-JPEG國際標準化組織運動圖像專家組的MPEG系列標準,此外在互聯網上被廣泛應用的還有Real-Networks的RealVideo、微軟公司的WMV以及Apple公司的QuickTime等。還有國內的AVS。

3.封裝格式:

封裝格式(也叫容器),就是將已經編碼壓縮好的視頻軌和音頻軌按照一定的格式放到一個文件中,也就是說僅僅是一個外殼,或者大家把它當成一個放視頻軌和音頻軌的文件夾也可以。

3.1常見封裝格式

AVI:微軟在90年代初創立的封裝標準,是當時爲對抗quicktime格式(mov)而推出的,只能支持固定CBR恆定比特率編碼的聲音文件。

FLV:針對於h.263家族的格式。

MKV:萬能封裝器,有良好的兼容和跨平臺性、糾錯性,可帶 外掛字幕

MOVMOVQuicktime封裝。

MP4:主要應用於mpeg4的封裝 。

RM/RMVBReal Video,由RealNetworks開發的應用於rmvbrm 

TS/PSPS封裝只能在HDDVD原版。

WMV:微軟推出的,作爲市場競爭。

3.2封裝格式與編碼方式的對應

AVI:可用MPEG-2, DIVX, XVID, WMV3, WMV4, WMV9, H.264

WMV:可用WMV3, WMV4, WMV9

RM/RMVB:可用RV40, RV50, RV60, RM8, RM9, RM10

MOV:可用MPEG-2, MPEG4-ASP(XVID), H.264

MKV:可用所有視頻編碼方案


參考文獻:

視頻編解碼:

http://www.cnblogs.com/xkfz007/archive/2012/08/12/2613690.html

http://www.360doc.com/content/12/0326/16/496343_197879139.shtml

http://www.360doc.com/content/12/0326/16/496343_197882029.shtml

RGB和YUV

http://baike.baidu.com/link?url=XCyLiYVh651UaKQPmCFf1r1JDfamdGu2DZwRHETfhcn6Bkom3nP-lPmImUtpE8jleoJ8GQzygH1Q9vyHlSC8d_

http://www.cnblogs.com/armlinux/archive/2012/02/15/2396763.html

http://blog.sina.com.cn/s/blog_a85e142101010h8n.html

YUV數據格式:

http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

http://www.voidcn.com/blog/jefry_xdz/article/p-322904.html

http://www.voidcn.com/blog/leixiaohua1020/article/p-107586.html


發佈了311 篇原創文章 · 獲贊 24 · 訪問量 82萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章