如何得到USB摄像头的数据格式是YUY2还是MJPG?

luckyboy1979 2012-01-12 12:53:06
USB摄像头用DirectShow实现视频预览和按键拍照(CCapture类改的)。摄像头在不同的电脑上输出的数据格式不一样,有的是YUY2格式,有的是MJPG格式(通过调用DirectShow的数据格式属性页看到的,这个代码也是从网上找的)。
我如何能得到摄像头在电脑上的数据格式,有了数据格式就可以正确的设置参数了。
如果是YUY2的格式,mt.subtype = MEDIASUBTYPE_RGB24;按键拍照得到的就是bmp图片的数据;
如果是MJPE的格式,mt.subtype = MEDIASUBTYPE_MJPG;按键拍照得到的就是jpg图片的数据;
跪求!!!
...全文
8879 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello_2012222 2012-01-13
  • 打赏
  • 举报
回复
记得VFW有个API可以跳出来一个对话框,让用户选择支持的分辨率,
就可以看到支持的格式.
buyong 2012-01-12
  • 打赏
  • 举报
回复
没有sdk,或者sdk中没有接口的话,估计很难
飞天舞 2012-01-12
  • 打赏
  • 举报
回复
通过pAMStreamConfig设置摄像头的参数。
查看DXSDK\Samples\C++\DirectShow\Capture\AMCap例子。
“Set &Frame Rate...”菜单
LiuYinChina 2012-01-12
  • 打赏
  • 举报
回复

template <typename QueryCallbackT>
static VOID QueryMediaType(IAMStreamConfig *pStreamConfig, QueryCallbackT queryCallback, DWORD dwContext)
{
INT nConfigCount= 0;
INT nConfigSize = 0;
pStreamConfig->GetNumberOfCapabilities(&nConfigCount, &nConfigSize);

LPBYTE lpConfig = new BYTE[nConfigSize];
AM_MEDIA_TYPE *pMediaType = NULL;
for (INT i=0; i<nConfigCount; ++i) {
pStreamConfig->GetStreamCaps(i, &pMediaType, lpConfig);
queryCallback(pStreamConfig, i, pMediaType, dwContext);
DeleteMediaType(pMediaType);
}
delete []lpConfig;
lpConfig = NULL;
}

{
HWND hVideoType = ::GetDlgItem(GetSafeHwnd(), IDC_COMBO_VIDEO_TYPE);
ClearComboBox(hVideoType);

CString strVideoDevice;
GetDlgItemText(IDC_COMBO_VIDEO_DEVICE, strVideoDevice);

CComQIPtr<IBaseFilter> pVideoSrc;

CComPtr<IPin> pSrcPin;
CComQIPtr<IAMStreamConfig> pAMStreamConfig;

pVideoSrc = DSUtility::CreateVideoDevice(strVideoDevice);
if (pVideoSrc == NULL) {
return;
}
DSUtility::GetCapturePin(pVideoSrc, &pSrcPin);
if (pSrcPin == NULL) {
return;
}

pAMStreamConfig = pSrcPin;
if (pAMStreamConfig == NULL) {
return;
}
DSUtility::QueryMediaType(pAMStreamConfig, QueryVideoTypeCallback, ForceCast<DWORD>(hVideoType));

ComboBox_SetCurSel(hVideoType, 0);
}

不用我再解释了吧,
luckyboy1979 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qqwangbalu 的回复:]
搞错了吧。
YUY2跟RGB是不一样的。
MJPG是压缩的一种编码格式,跟jpg压缩格式是不一样的。
如果你要拍照,只在在TransformFilter里抓图就行了。
要存储为BMP就直接按BMP文件的格式存储就行了,要是想存为JPG的就得用jpeblib库自己再实现压缩后再存储。
抓图参考例子:DXSDK\Samples\C++\DirectShow\Editing\StillCap
[/Quote]
这个摄像头YUY2格式的设置成RGB24可以得到BMP数据;设置成MJPG得到的数据直接保存成JPG文件就可以了。我实在BufferCB回调函数中得到按键拍照数据的,这个都实现了。
我现在就是想通过程序来得到摄像头的数据格式,然后在对摄像头进行初始化的时候赋相应的值,不然按键拍照会有一些问题。
飞天舞 2012-01-12
  • 打赏
  • 举报
回复
搞错了吧。
YUY2跟RGB是不一样的。
MJPG是压缩的一种编码格式,跟jpg压缩格式是不一样的。
如果你要拍照,只在在TransformFilter里抓图就行了。
要存储为BMP就直接按BMP文件的格式存储就行了,要是想存为JPG的就得用jpeblib库自己再实现压缩后再存储。
抓图参考例子:DXSDK\Samples\C++\DirectShow\Editing\StillCap
keith_cheung 2012-01-12
  • 打赏
  • 举报
回复
这要看摄像头的吧!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧