感觉Microsoft Source Reader还是比较坑的,只是由于需要,不得不使用。其实按照Microsoft提供的示例,基本上可以正常的调试出程序来。

下面的例子,简单的给出了Source Reader的代码。同时,HRESULT CreateVideoDeviceSource(IMFMediaSource **ppSource)函数中,使用了指针的指针,能正确的传出ppSource,不是NULL。之前调试时,使用HRESULT CreateVideoDeviceSource(IMFMediaSource *ppSource),出来后,ppSource依旧为NULL。后来直接把代码展开,没有继续深入考虑。感谢前两天@wuruifang  的建议,之后在网上搜了一下,指针的指针可以使得输入参数为NULL时输出正常。因而此处重新写成一个函数(以前不清楚为啥用指针的指针时出错,现在倒是没有)。

主要代码:

 int _tmain(int argc, _TCHAR* argv[])
{
IMFMediaSource *ppSource = NULL;
CreateVideoDeviceSource(&ppSource); // hr = EnumerateCaptureFormats(ppSource); // This can show the formats the camera support. Notice that output window of visual studio shows the infomation.
// if (FAILED(hr))
// abort();
HRESULT hr;
IMFSourceReader *pReader;
hr = MFCreateSourceReaderFromMediaSource(ppSource, NULL, &pReader);
if (FAILED(hr))
abort(); hr = SetDeviceFormat(ppSource, ); //I need to configure the camera to format 6.
if (FAILED(hr))
abort(); ProcessSamples(pReader); SafeRelease(&pReader);
SafeRelease(&ppSource);
MFShutdown();
CoUninitialize();
} HRESULT ProcessSamples(IMFSourceReader *pReader)
{
HRESULT hr = S_OK;
IMFSample *pSample = NULL;
size_t cSamples = ; _LARGE_INTEGER time_start; /*begin time */
_LARGE_INTEGER time_over; /*end time*/
double dqFreq; /*timer frequence*/
LARGE_INTEGER f; /*timer frequence*/
QueryPerformanceFrequency(&f);
dqFreq = (double)f.QuadPart; QueryPerformanceCounter(&time_start); bool quit = false;
while (!quit)
{
DWORD streamIndex, flags;
LONGLONG llTimeStamp; hr = pReader->ReadSample(
MF_SOURCE_READER_ANY_STREAM, // Stream index.
, // Flags.
&streamIndex, // Receives the actual stream index.
&flags, // Receives status flags.
&llTimeStamp, // Receives the time stamp.
&pSample // Receives the sample or NULL.
); if (FAILED(hr))
break; if (flags & MF_SOURCE_READERF_ENDOFSTREAM)
{
wprintf(L"\tEnd of stream\n");
quit = true;
} if (pSample)
{
BYTE* data;
IMFMediaBuffer* buffer;
DWORD max, current; // printf(" cSamples = %d\n", cSamples);
++cSamples;
pSample->GetBufferByIndex(, &buffer);
buffer->Lock(&data, &max, &current); // saveBMP(data, cSamples, IMGWIDTH, IMGHEIGHT); buffer->Unlock();
SafeRelease(&buffer); QueryPerformanceCounter(&time_over); //In order to find the frames per second of the camera.
double usedtime = ((time_over.QuadPart - time_start.QuadPart) / dqFreq);
if (usedtime>)
{
printf(" cSamples = %d\n", cSamples);
cSamples = ;
QueryPerformanceCounter(&time_start);
}
}
SafeRelease(&pSample);
} SafeRelease(&pSample);
return hr;
} HRESULT CreateVideoDeviceSource(IMFMediaSource **ppSource)
{
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr))
abort();
hr = MFStartup(MF_VERSION, MFSTARTUP_NOSOCKET);
if (FAILED(hr))
abort(); *ppSource = NULL; IMFMediaSource *pSource = NULL;
IMFAttributes *pAttributes = NULL;
IMFActivate **ppDevices = NULL; // Create an attribute store to specify the enumeration parameters.
/*HRESULT*/ hr = MFCreateAttributes(&pAttributes, );
if (FAILED(hr))
abort(); // Source type: video capture devices
hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID );
if (FAILED(hr))
abort(); // Enumerate devices.
UINT32 count;
hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count);
if (FAILED(hr))
abort();
if (count == )
{
hr = E_FAIL;
return hr;
} // Create the media source object.
hr = ppDevices[]->ActivateObject(IID_PPV_ARGS(&pSource));
if (FAILED(hr))
abort(); *ppSource = pSource;
(*ppSource)->AddRef(); // release part
SafeRelease(&pAttributes); for (DWORD i = ; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
SafeRelease(&pSource); //此处不确定,是否需要SafeRelease。
return hr;
}

得到的图片(程序中保存的是BMP图片,由于cnblogs不支持BMP,因而转成jpg):

完整代码(不会插入超链接,抱歉)见:https://github.com/darkknightzh/Microsoft-Source-Reader

参考(其他的记不清了,见谅):

Microsoft :http://msdn.microsoft.com/en-us/library/windows/desktop/dd389281(v=vs.85).aspx

指针的指针(详见4楼,14楼) :http://bbs.csdn.net/topics/210076970

(原)Microsoft Source Reader的简单使用的更多相关文章

  1. 【FLYabroad 】微软内部代码检查工具 (Microsoft Source Analysis for C#)[转]

    SourceAnalysis (StyleCop)的终极目标是让所有人都能写出优雅和一致的代码,因此这些代码具有很高的可读性. 早就听说了微软内部的静态代码检查和代码强制格式美化工具 StyleCop ...

  2. C# 使用自带Microsoft.Office.Interop.Excel简单操作Excel文件

    项目添加应用 Microsoft.Office.Interop.Excel.dll 文件 引用命名空间: using Excel = Microsoft.Office.Interop.Excel; 简 ...

  3. Microsoft.AspNet.Identity 的简单使用

    要完成一个简单的注册,登陆,至少需要实现Identity中的3个接口 IUser IUserStore<TUser> : IDisposable where TUser : IUser I ...

  4. [原][译][lua][luabridge]一个简单的luabridge与c++例子结合例子

    参考:https://eliasdaler.wordpress.com/tag/luabridge/ https://eliasdaler.wordpress.com/2015/08/10/using ...

  5. Source Insight 项目简单使用说明

    SI(Source Insight) 是我一直写代码的好伙伴, 相信这强大的软件也是广大程序猿编写软件的利器. 正所谓" 工欲善其事, 必先利其器", 我们要学会利用这款软件. 先 ...

  6. 【原】shell编写一个简单的jmeter自动化压测脚本

    在公司做压力测试也挺长时间了,每次测试前环境数据准备都需要话费较长时间,所以一直在考虑能不能将整个过程实现自动化进行,于是就抽空写了一个自动化脚本,当然这个脚本目前功能十分简陋,代码也不完善,很有很多 ...

  7. Android系统--输入系统(十一)Reader线程_简单处理

    Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...

  8. Java IO: Reader And Writer

    原文链接 作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStre ...

  9. 给Source Insight做个外挂系列之四--分析“Source Insight”

    外挂的目的就是将代码注入到其它进程中,所以必须要有目标进程才能完成注入,而所谓的目标进程通常是某软件的一部分或者是全部,所以要对目标程序有深入地了解.一般外挂都是针对某个应用程序开发的,其装载.运行都 ...

随机推荐

  1. HDU 1269 裸奔的强联通分量

    看了别人博客  http://blog.csdn.net/jokes000/article/details/7538994 #include <cstdio> #include <c ...

  2. 慕课linux学习笔记(二)Xshell与虚拟机的连接

    选择使用的是Xshell5 新建连接 连接成功 修改编码方式,字号,颜色 PS: 连接过程中遇到了很多问题,虚拟机的网络连接我最初选择的是桥连,虚拟机和主机相互之间都能ping通但Xshell就是连接 ...

  3. js迭代器模式

    在迭代器模式中,通常有一个包含某种数据的集合的对象.该数据可能储存在一个复杂数据结构内部,而要提供一种简单 的方法能够访问数据结构中的每个元素. 实现如下: //迭代器模式 var agg = (fu ...

  4. CentoS7装机

    按delete进入BIOS 选择UEFI 网上关于CentOS 7 的安装教程挺多的,但在前期的引导配置上很多都没有写清楚,让人很郁闷,以致于昨天安装的时候总是到不了安装界面.经过一番胡乱倒腾,终于找 ...

  5. 【笔记】Linux 和 Unix 作业控制

    Linux 和 Unix 属于多任务的操作系统,也就是说一个系统在同一时间段内能运行多重任务(进程). 作业控制不只是能够停止/挂起(stop/suspend)正在执行的进程(命令),也可以继续/唤醒 ...

  6. MHA环境的搭建

    MHA简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开 ...

  7. C语言读写伯克利DB 3

    gcc -o channeldb channel.c -db -Wall # -Wall参数等价于执行lint,即:进行代码的静态分析,它可以指出未初始化的变量,未使用的变量 #include < ...

  8. 记事本创建servlet在tomcat中发布基本思路

    在webapps中新建文件夹H,在其中再创建WEB-INF文件夹,在创建classes文件夹和web.xml文件,web.xml需要配置一下,classes文件夹中存放Servlet经编译过的clas ...

  9. ajax get/post

    xmlhttp.open("POST", url, true); xmlhttp.setRequestHeader("Content-Type", " ...

  10. Powershell变量的幕后管理

    Powershell变量的幕后管理 513 12月, 2011  在 Powershell  tagged 变量 / 类型 by Mooser Lee本文索引[隐藏]1修改变量的选项设置2激活变量的写 ...