// 设置参数,p1=宽,p2=高,p3=帧率
AM_MEDIA_TYPE *p = NULL;
IAMStreamConfig *pSC = NULL;
pCGB2->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pVCap, 
    IID_IAMStreamConfig, (void **)&pSC);
pSC->GetFormat(&p);
VIDEOINFOHEADER *pHd = (VIDEOINFOHEADER *)p->pbFormat;
// 单位为100ns,所以每帧(10^7/p3)*100ns
pHd->AvgTimePerFrame = 10000000 / p3;
// I420格式
pHd->bmiHeader.biCompression = MAKEFOURCC('I', '4', '2', '0');
pHd->bmiHeader.biWidth = p1;
pHd->bmiHeader.biHeight = p2;
// 一个像素点12位
pHd->bmiHeader.biBitCount = 12;
// 图像大小
pHd->bmiHeader.biSizeImage = p1 * p2 * 3 / 2;
// 图像传输率,单位bps
pHd->dwBitRate = pHd->bmiHeader.biSizeImage * 8 * p3;
// defined in wmsdkidl.h
p->subtype = WMMEDIASUBTYPE_I420;
p->lSampleSize = pHd->bmiHeader.biSizeImage;
pSC->SetFormat(p);
// free p
FreeAM_MEDIA_TYPE(p);
pSC->Release();

上面设计的类型定义:

包含一下Windows Media Format 9.0 SDK中的头文件"wmsdkidl.h" 
问题应该就会被解决。在里面有I420的媒体类型GUID定义 

EXTERN_GUID(WMMEDIASUBTYPE_I420,  
0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);  
EXTERN_GUID(WMMEDIASUBTYPE_IYUV,  
0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);

 当我用枚举设备的方式(DirectShow中枚举摄像头的采集分辨率这篇文中讲过)来查看有多少支持的帧率时,得到的分辨率有10帧、20帧、25帧和30帧。DirectShow中是以100纳秒为单位,也就是得到的实际值是1000000、500000、4000000和3333333。

原文:https://blog.csdn.net/thuyz/article/details/46762487

posted on 2018-05-19 14:18  瓦楞球  阅读(1639)  评论(0编辑  收藏  举报