原因:由于目前pc平台采集DirectShow老旧和复杂,故了解MediaFoundation简单调用。

概述:利用MediaFoundation实现视频采集,利用同步方式实现视频数据的读取。

MediaFoundation介绍:

MediaFoundation是DirectShow的替代,vist及以上才能支持,也就是说xp不支持,且不同的系统某些功能支持情况也不同,提供了两种编码模型,第一种是Media Session为主的Media pipeline模型,复杂。

第二种就是通过SourceReader,sinkWirter等模块开发,简单。

SDK Version Libraries
vista evr.lib mf.lib mfplat.lib
server2008
win7

如果目标是server2008,链接库如下:

evr_vista.lib,mf_vista.lib,mfplat_vist.lib

如果目标是win7或以上,链接库如下:

evr.lib,mf.lib,mfplat.lib

主要流程如下:

1:引入头文件和静态库

#include<mfapi.h>
#include<mfidl.h>
#include<mfreadwrite.h>
#include<wmsdkidl.h>#pragma comment(lib,"mfplat.lib")
#pragma comment(lib,"mf.lib")
#pragma comment(lib,"Mfreadwrite.lib")
#pragma comment(lib,"mfuuid.lib")
#pragma comment(lib,"evr.lib")

初始化MF

hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
hr = MFStartup(MF_VERSION);

枚举设备创建采集源,通过该方法目前发现不能找到本机的虚拟设备,只能找到对应的usb摄像头,如有知道望告知。

IMFMediaSource *pSource = nullptr;
IMFAttributes *pAttributes = nullptr;HRESULT hr = MFCreateAttributes(&pAttributes, 1);
hr = pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
MFEnumDeviceSources(pAttributes, &ppDevices, &count);
hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));

2:创建Source Reader用于数据读取

IMFSourceReader *pSourceReader = nullptr;MFCreateSourceReaderFromMediaSource(*ppSource, nullptr/*pAttributes*/, &pSourceReader);

3:设置Source Reader媒体数据类型,此时如果媒体类型不支持则设置也会成功,但是读取数据时会失败,所以需要知道源设备支持的类型。

IMFMediaType *mediatype = nullptr;hr = MFCreateMediaType(&mediatype);
mediatype->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
mediatype->SetGUID(MF_MT_SUBTYPE, WMMEDIASUBTYPE_YUY2);  //设置支持的类型 否则读取失败
hr = MFSetAttributeSize(mediatype, MF_MT_FRAME_SIZE, 640, 480);hr = pSourceReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, nullptr, mediatype);

4:获取源设备支持类型,

IMFPresentationDescriptor *pDescriptor;
IMFStreamDescriptor *pStreamDes;
IMFMediaTypeHandler *pMediaHand;
IMFMediaType    *pMediaType;hr = pSource->CreatePresentationDescriptor(&pDescriptor);
hr = pDescriptor->GetStreamDescriptorByIndex(0, &bSelect, &pStreamDes);
hr = pStreamDes->GetMediaTypeHandler(&pMediaHand);
pMediaHand->GetMediaTypeCount(&dcount);
for(int i=0;i<dcount;i++)
{pMediaHand->GetMediaTypeByIndex(i,&pMediaType);pMediaType->GetCount();....
}

5:同步读取数据

hr = pSourceReader->ReadSample(MF_SOURCE_READER_ANY_STREAM,0, &index, &flags, &llvideoTs, &sampe);
if (sampe){BYTE *data = nullptr;IMFMediaBuffer *buffer = nullptr;DWORD dmax=0, dcurrent = 0;sampe->GetBufferByIndex(0, &buffer);buffer->Lock(&data, &dmax, &dcurrent);buffer->Unlock();buffer->Release();}

总结:上面就是利用MF简单的视频数据采集。相对于DShow简单了很多,不需要创建Grap,Filter,也不需要Pin的连接。

MediaFoundation视频采集相关推荐

  1. iOS 直播专题2-音视频采集

    从设备(手机)的摄像头.MIC中采集音频.视频的原始数据 ios的音视频采集可以从AVFoundation框架里采集 视频采集 这里我们选取GPUImage来采集视频,因为这个框架集成了很多视频滤镜, ...

  2. iOS直播(二)GPUImage音视频采集

    上文中介绍了用AVFoundation实现音视频采集(https://blog.csdn.net/dolacmeng/article/details/81268622) ,开源的基于GPU的第三方图像 ...

  3. 简单的视频采集demo

    打算做个简单的聊天软件,其中一个我没做过的,就是视频采集. 在网上查了许久资料,终于搞清楚了dshow采集视频的流程 参考资料如下: https://msdn.microsoft.com/en-us/ ...

  4. 视频采集-非DICOM影像设备转DICOM标准的解决方案

    现在大多数影像设备都支持DICOM标准了,好多医院都在建设PACS,也有的为了使用干式DICOM像机而需要改造不支持DICOM的影像设备,用我的医网联影像工作站3.0(ProDicom Worksta ...

  5. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  6. V4L2编程 视频采集

    V4L2编程 以前做的智能家居的项目用的是Linux2.6.13的核,使用的中星微的摄像头,移植了spcaview进行图像的获取,后来用了2.6.29的核,发现以前移植的spcaview不能用了,后来 ...

  7. 入门视频采集与处理(学会分析YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

  8. 嵌入式LINUX环境下视频采集知识

    Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口,配合适当的视频采集设备和相应的 ...

  9. Metal之实现视频采集与实时渲染

    一.视频渲染实现思路 ① 思路说明 通过AVFoundation进行视频数据的采集,并将采集到的原始数据存储到CMSampleBufferRef中,即视频帧数据(视频帧其实本质也是一张图片). 通过C ...

  10. webrtc简单案例——音视频采集和播放

    webrtc简单案例--音视频采集和播放 目录 打开摄像头并将画面显示到页面 打开麦克风并在页面播放捕获的声音 同时打开摄像头和麦克风,并在页面显示画面和播放捕获的声音 1. 打开摄像头并将画面显示到 ...

最新文章

  1. 阿里巴巴云游戏平台荣获首届高新视频创新应用大赛一等奖
  2. Flink 助力美团数仓增量生产的应用实践
  3. nginx中文件路径表示方法
  4. .zip.001 -- .zip.003解压缩
  5. 乡镇快递站20万入股50%,每天派件600,是否靠谱?
  6. python 学习资源推荐
  7. jpg怎么合成一份_海外商标注册申请程序复杂吗?应该怎么注册?
  8. 第二篇 FPGA数字信号处理_并行FIR滤波器Verilog设计
  9. 嵌入式操作系统-ucos是什么?
  10. Python中的时间序列数据可视化的完整指南
  11. pytest之.pytest_cache文件夹作用【Pytest中的cache缓存功能】
  12. 复元奇方饮_谁研制的?治疗什疾病?作用与功效?
  13. matlab的比较器模块,simulink中的比较器
  14. 2018/5/3单纯和纯洁
  15. Photoshop CS6 MAC 中文版破解版 支持Retina屏
  16. 科技云报道:科技巨头们为什么要“跨界造芯”?
  17. 二十个不可不知的 TSM 知识点
  18. 高德打车上线支付宝小程序,持续发力一站式出行!
  19. 用户上传用户头像至服务器
  20. java 二义性_Java接口默认方法带来的问题分析【二义性问题】

热门文章

  1. ai怎么做盒子效果图_ai怎么制作包装盒? Ai贴图工具制作包装盒的实例教程
  2. 解决文件不显示后缀名的问题
  3. 对话惠普亚太区高管:绿色智慧的中国战略
  4. 项目经验介绍的STAR法则--面试
  5. lr mysql 增删改查_ssh增删改查流程
  6. c语言程序设计流程图案例
  7. 鼎信诺虚拟服务器导数,鼎信诺审计软件常见问题
  8. 信息系统项目管理师思维导图
  9. 14种鼻型图解_十种鼻型分类图详细解析
  10. 灵敏度 和 特异度的计算