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

  • 相关阅读:
    layer备忘
    Java中遍历Map对象的4种方法
    为什么Java中1000==1000为false而100==100为true?
    linux系统安装psycopg2
    centos7源码安装mysql5.7
    Azure Sql
    javascript和jQuery动态修改css样式的方法
    Git early EOF index-pack failed 问题
    C# 多线程——SemaphoreSlim的使用
    Docker 可视化
  • 原文地址:https://www.cnblogs.com/wainiwann/p/9060246.html
Copyright © 2011-2022 走看看