这几天一个学生在调试视频捕捉程序的时候遇到了一个问题。他使用capGetVideoFormat函数获得视频的格式时,发现m_bmpinfo.bmiHeader.biBitCount为16,他认为这是表示16位的RGB格式。可是不管他是使用RGB565,还是RGB555格式进行转换时,发现转换后的YUV文件都是不对的。在我的Sony笔记本上运行他的程序,其中的m_bmpinfo.bmiHeader.biCompression的值为1498831189,这说明笔记本的摄像头所采集的数据的格式并不是普通的16位RGB数据,而是UYVY格式的。UYVY格式是YUV格式的一个变种,在网上可以找到详细的说明,在此就不赘述了。
要想知道biCompression到底有多少种取值,可以参考一下:http://files.codes-sources.com/fichier.aspx?id=45735&f=src/org/hypik/webcamlib/codecs/Codecs.java。在这里详细的列出了各种视频压缩的编码。
怎样才能知道自己的摄像头到底支持哪种格式的输出呢?可以使用capDlgVideoFormat函数:
capDlgVideoFormat(m_wndVideo);
这个函数会激活摄像头驱动的视频格式设置对话框,如下图所示。
我的这个摄像头支持2种输出格式,一种是UYVY,另一种是YUV2。 如果将m_bmpinfo.bmiHeader.biCompression设置为这两种之外的值,再使用capSetVideoFormat改变输出格式,由于驱动程序不支持而不会获得成功。