首页 > 系统相关 >Windows Media Foundation读取摄像头数据

Windows Media Foundation读取摄像头数据

时间:2023-11-14 16:57:58浏览次数:49  
标签:Foundation MF goto failed Windows Media stop hr FAILED

可以读取数据,设置分辨率

如果我们期望的数据格式与摄像头的数据格式不同,就需要设置 MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING 

否则不需要

以下是代码:
int ReadCameraData(UINT32 width, UINT32 height)
{
IMFAttributes* attributes = NULL;
IMFActivate** devices = NULL;
IMFActivate* deviceUsing = NULL;
IMFMediaType* mediaType = NULL;
IMFAttributes* attr = nullptr;
IMFMediaSource* deviceSource;
IMFSourceReader* reader;
UINT32 count = 0;

auto hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (FAILED(hr)) {
goto failed_stop;
}
hr = MFCreateAttributes(&attributes, 1);
if (FAILED(hr)) {
goto failed_stop;
}
hr = attributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
if (FAILED(hr)) {
goto failed_stop;
}
hr = MFEnumDeviceSources(attributes, &devices, &count);
if (FAILED(hr)) {
goto failed_stop;
}
if (count < 1) {
hr = -1;
goto failed_stop;
}
deviceUsing = devices[0];

hr = MFCreateDeviceSource(deviceUsing, &deviceSource);
if (FAILED(hr)) {
goto failed_stop;
}
hr = MFCreateAttributes(&attr, 1); {
if (FAILED(hr)) {
attr = nullptr;
}
else {
hr = attr->SetUINT32(MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING, 1);
}
}
hr = MFCreateSourceReaderFromMediaSource(deviceSource, attr, &reader);
if (FAILED(hr)) {
goto failed_stop;
}
hr = reader->GetNativeMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &mediaType);
if (FAILED(hr)) {
}
hr = MFSetAttributeSize(mediaType, MF_MT_FRAME_SIZE, width, height);
hr = mediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_YUY2);

PROPVARIANT var;
hr = mediaType->GetItem(MF_MT_FRAME_RATE_RANGE_MAX, &var);
if (!FAILED(hr)) {
hr = mediaType->SetItem(MF_MT_FRAME_RATE, var);
}
hr = reader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediaType);
if (FAILED(hr)) {
goto failed_stop;
}
while (1) {
DWORD index = 0;
DWORD flag = 0;
IMFSample* sample;
LONGLONG timestamp;

hr = reader->ReadSample((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &index, &flag, &timestamp, &sample);
if (sample) {
IMFMediaBuffer* buffer = NULL;
sample->ConvertToContiguousBuffer(&buffer);
if (buffer) {
BYTE* channelBuf;
DWORD channelLen;
buffer->Lock(&channelBuf, NULL, &channelLen);

buffer->Release();
}
sample->Release();
}
}

failed_stop:
if (attr)
attr->Release();
for (UINT32 i = 0; i < count; i++) {
devices[i]->Release();
}
mediaType->Release();
return hr;
}

标签:Foundation,MF,goto,failed,Windows,Media,stop,hr,FAILED
From: https://www.cnblogs.com/ceblog/p/17831990.html

相关文章

  • 同一用户名,远程连接Windows Server 2019 时,如何禁止打开新窗口
    同一用户名,远程连接WindowsServer2019时,如何禁止打开新窗口答:您好!如果您想在远程连接WindowsServer2019时禁止打开新窗口,您可以尝试以下方法:使用组策略编辑器:打开组策略编辑器,可以通过运行"gpedit.msc"命令来打开。导航到"计算机配置">"管理模板">"Windows组件">"远......
  • 在 WINDOWS 安装 ACTIVE DIRECTORY 用户和计算机管理单元 (ADUC)
     在WINDOWS安装ACTIVEDIRECTORY用户和计算机管理单元(ADUC)安装官方AD域管理工具(ADUsersandComputers)  一、在WindowsServer里安装AD域管理工具:    1.WindowsServer只需要在角色和功能里,安装Active Directory域服务(ADDS){ActiveDirectoryDomain......
  • windows基本实用命令以及相关炫酷操作
    记录一下windows常用的命令,以及一些炫酷的操作文件操作dir:查看当前目录下的文件,查看隐藏文件dir/atree:使用树形查看当前目录下的文件和文件夹,以及子目录中的文件和文件夹cd目录名:进入指定目录copycon文件名:在屏幕输入内容,最后输入Ctrl+Z,将文件保存到文件名中type......
  • 2.3 Windows驱动开发:内核字符串转换方法
    在内核编程中字符串有两种格式ANSI_STRING与UNICODE_STRING,这两种格式是微软推出的安全版本的字符串结构体,也是微软推荐使用的格式,通常情况下ANSI_STRING代表的类型是char*也就是ANSI多字节模式的字符串,而UNICODE_STRING则代表的是wchar*也就是UNCODE类型的字符,如下文章将介绍这......
  • 2.4 Windows驱动开发:内核字符串拷贝与比较
    在上一篇文章《内核字符串转换方法》中简单介绍了内核是如何使用字符串以及字符串之间的转换方法,本章将继续探索字符串的拷贝与比较,与应用层不同内核字符串拷贝与比较也需要使用内核专用的API函数,字符串的拷贝往往伴随有内核内存分配,我们将首先简单介绍内核如何分配堆空间,然后再以......
  • windows 10 安装ubuntu+docker(不安装desktop docker)步骤
    windows10安装ubuntu+docker(不安装desktopdocker)步骤1.安装wsl2,ubuntu22.04参考网络文档2.powershell里运行wsl3.sudo-i4.curl-fsSLhttps://get.docker.com-oget-docker.sh5.shget-docker.sh6.servicedockerstart7.在2.1通过脚本安装docker时,会出现下面这个问......
  • Azure DevOps 发布.Net项目到Windows IIS站点之通过公网IP(账号、密码)
    在AzureDevOps中通过指定公网IP发布代码到指定目录#ASP.NETCore(.NETCore7.0)#BuildandtestASP.NETCoreprojectstargeting.NETCore7.0.#Addstepsthatpublishsymbols,savebuildartifacts,andmore:#https://docs.microsoft.com/azure/devops/pipeli......
  • Windows下安装Jenkins
    从官网下的最新的Jenkins,在安装时出现了:Service'Jenkins'(Jenkins)failedtostart.verifythatyouhavesufficientprivilegestostartsystemservices试过网上的各种方法都无效。最后找到了Jenkins的安装目录下有一个jenkins.err.log,打开后发现里面有一段话如下:Ru......
  • Azure DevOps 发布.Net项目到Windows IIS站点之Azure项目发布内网VM
    当你有一个需求,需要通过AzureDevOps发布到一个没有公网的VM的时候,你将需要使用以下脚本trigger:-masterpool:vmImage:'windows-2022'variables:-name:Build.ArtifactStagingDirectoryvalue:'$(Build.Repository.LocalPath)\artifacts'-name:buildConf......
  • 【Windows 开发环境配置】NVIDIA 篇
    CUDA从CUDAToolkitArchive下载相应版本的离线安装包,这里以11.7为例。打开安装包,在安装选项选择自定义模式,点击下一步。在自定义安装选项中,仅选择CUDA组件(其中Nsight相关组件用于代码调试与性能分析),若未安装显卡驱动,选择NVIDIAGeForceExperiencecomponents并点击下一步。......