视频编码参数与视频采集参数匹配策略

来源:互联网 发布:vim python 开发环境 编辑:程序博客网 时间:2024/06/07 00:16

在voip系统中,音视频客户端往往需要配置视频编码的分辨率,码率和帧率,其中分辨率和帧率是与采集息息相关的。一般的如果直接使用的是usb摄像头,对于不同厂家,不同规格的摄像头所支持的分辨率,图像格式和帧率是有很大不同的,以下是windows下获取摄像头支持格式属性的方法:

//hwnd为显示窗口的句柄 int CCamera::ShowCapturePropertyPage(HWND hWnd){if(!m_bInit)return -1;ISpecifyPropertyPages *pSpec;CAUUID cauuid;HRESULT hr = m_captureConfig->QueryInterface(IID_ISpecifyPropertyPages,(void**)&pSpec);if(hr == S_OK){hr = pSpec->GetPages(&cauuid);//获取指定摄像头的能力hr = OleCreatePropertyFrame(hWnd,200,200,NULL,1,(IUnknown **)&m_captureConfig,cauuid.cElems,(GUID*)cauuid.pElems,0,0,NULL);CoTaskMemFree(cauuid.pElems);pSpec->Release();}return 0;}

会产生如下对话框


如红框所示,依次为帧率,格式和分辨率,这几项的意思为在采集格式为YUY2时能够满足的最大的帧率为5帧,分辨率为1080P。有些摄像头往往支持的最大分辨率只能支持到VGA(640x480) 。在windows和linux下,摄像头的支持是有不同处理的:

在windows下通过directshow采集,其实不用关心采集的格式和帧率,通常都是将采集格式设置为rgb24直接进行采集,不管摄像头是否支持都可以采集出rgb的数据。通常关心的都是分辨率。

在linux下通过v4l2去采集,格式通常YUY2的,并且帧率是与摄像头实际帧率是相符合的,如上图,在YUY2模式下,最大的采集帧率只有5帧。

音视频客户端往往会将视频编码配置参数开放给用户设置,其中视频编码参数就包括视频的分辨率,帧率,码率。而分辨率需要摄像头去支持的,因为用户配置的分辨率摄像头不一定会支持,一个通常的策略是在摄像头不支持配置分辨率情况下,去取摄像头就近最满足的分辨率,如:

  1. 摄像头最大支持vga,用户配置的编码参数为720p,此时取vga,那么在编码前就需要将vga放大成720p的图像。
  2. 摄像头支持vga和1080p,配置的编码参数为720p,此时取最近一个支持的即要么是vga,要么是1080p,不管怎么选都是需要进行缩放的。
原创粉丝点击