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,YUV,YCbCr
RGB紅綠藍色彩空間。常見的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32等;
YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。
YCbCr 則是在世界數字組織視頻標准研制過程中作為ITU - R BT1601 建議的一部分, 其實是YUV經過縮放和偏移的翻版。其中Y與YUV 中的Y含義一致, Cb , Cr 同樣都指色彩, 只是在表示方法上不同而已。在YUV 家族中, YCbCr 是在計算機系統中應用最多的成員, 其應用領域很廣泛,JPEG、MPEG均采用此格式。一般人們所講的YUV大多是指YCbCr。YCbCr 有許多取樣格式, 如4∶4∶4 , 4∶2∶2 , 4∶1∶1 和4∶2∶0。常見的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。
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恆定比特率編碼的聲音文件。
MKV:萬能封裝器,有良好的兼容和跨平台性、糾錯性,可帶 外掛字幕。
MOV:MOV是Quicktime封裝。
MP4:主要應用於mpeg4的封裝 。
RM/RMVB:Real Video,由RealNetworks開發的應用於rmvb和rm 。
TS/PS:PS封裝只能在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://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://blog.csdn.net/jefry_xdz/article/details/7931018
http://blog.csdn.net/leixiaohua1020/article/details/12234821