// 设置参数,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