zoukankan      html  css  js  c++  java
  • DirectShow设置采集帧率码率YUV<转>

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

  • 相关阅读:
    centos7修改网卡名称
    xtrabackup备份恢复过程
    centos 设置删除提示
    cetos6 安装samba共享文件夹
    centos 安装cacti监控
    centos6 搭建hdwiki
    centos6.8安装superctl 后台管理工具
    centos6.5 安装ansible,管理多台服务器
    CreateParams作用及重写
    c# 获取当前应用程序的路径
  • 原文地址:https://www.cnblogs.com/wainiwann/p/9060246.html
Copyright © 2011-2022 走看看