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