(原)Microsoft Source Reader的简单使用
感觉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, ¤t); // 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的简单使用的更多相关文章
- 【FLYabroad 】微软内部代码检查工具 (Microsoft Source Analysis for C#)[转]
SourceAnalysis (StyleCop)的终极目标是让所有人都能写出优雅和一致的代码,因此这些代码具有很高的可读性. 早就听说了微软内部的静态代码检查和代码强制格式美化工具 StyleCop ...
- C# 使用自带Microsoft.Office.Interop.Excel简单操作Excel文件
项目添加应用 Microsoft.Office.Interop.Excel.dll 文件 引用命名空间: using Excel = Microsoft.Office.Interop.Excel; 简 ...
- Microsoft.AspNet.Identity 的简单使用
要完成一个简单的注册,登陆,至少需要实现Identity中的3个接口 IUser IUserStore<TUser> : IDisposable where TUser : IUser I ...
- [原][译][lua][luabridge]一个简单的luabridge与c++例子结合例子
参考:https://eliasdaler.wordpress.com/tag/luabridge/ https://eliasdaler.wordpress.com/2015/08/10/using ...
- Source Insight 项目简单使用说明
SI(Source Insight) 是我一直写代码的好伙伴, 相信这强大的软件也是广大程序猿编写软件的利器. 正所谓" 工欲善其事, 必先利其器", 我们要学会利用这款软件. 先 ...
- 【原】shell编写一个简单的jmeter自动化压测脚本
在公司做压力测试也挺长时间了,每次测试前环境数据准备都需要话费较长时间,所以一直在考虑能不能将整个过程实现自动化进行,于是就抽空写了一个自动化脚本,当然这个脚本目前功能十分简陋,代码也不完善,很有很多 ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
- Java IO: Reader And Writer
原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStre ...
- 给Source Insight做个外挂系列之四--分析“Source Insight”
外挂的目的就是将代码注入到其它进程中,所以必须要有目标进程才能完成注入,而所谓的目标进程通常是某软件的一部分或者是全部,所以要对目标程序有深入地了解.一般外挂都是针对某个应用程序开发的,其装载.运行都 ...
随机推荐
- 养成代码注释习惯,帮助你更好使用NetBeans导航器
在使用NetBeans编写php代码时,为了在一个类中,或者在方法库文件中快速找到你想要找的函数或方法,通常我们会使用NetBeans的导航器. 我们看一个导航器的事例: 大家知道,在php中代码习惯 ...
- LeetCode_Regular Expression Matching
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- gridview两列数据的互换
如下图所示: GridView绑定数据的时候,若ReName列里面有数据,则显示ReName列里面的数据,如果没有数据,则显示Name列里面的数据.Name和ReName是数据表里面的两个字段< ...
- Powershell变量的类型和强类型
Powershell变量的类型和强类型12 12月, 2011 在 Powershell tagged Powershell教程 / 变量 / 存储 / 数据 / 类型 by Mooser Lee ...
- java.lang.OutOfMemoryError: unable to create new native thread(转)
解决 - java.lang.OutOfMemoryError: unable to create new native thread 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文 ...
- DELL配置信息
CPU详情CPU厂商 英特尔CPU (英特尔)Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHzCPU核心数 2CPU默认频率 2400 MhzCPU外频 533 MHz ...
- Unix/Linux环境C编程入门教程(39) shell命令之系统管理
df命令 用于检测文件系统的磁盘空间占用和空余情况,可以显示所有文件系统对节点和磁盘块的使用情况.命令的使用格式如下: df [选项] 常用参数及含义如下表所示. df -a:显示所有文件系统的磁盘 ...
- 基于公网smtp协议实现邮件服务器
刚开始做邮件服务器开发,一切都是茫然的.在书上网上都很难找到一套完整的邮件服务器开发教程.在个人的摸索中碰到了很多蛋疼得问题.现终于完成了,将我的开发经验分享给大家. 开发环境:vs2012 mfc ...
- 【HDU2795】Billboard(线段树)
大意:给一个h*w的格子,然后给出多个1*w的板子往格子里面填,如果有空间尽量往上一行填满,输出行数,无法填补,则输出-1: 可以使用线段树转化问题,将每一排的格子数目放到每一个叶子节点上,然后每有一 ...
- MySQL中多表删除方法(转载)
如果您是才接触MySQL数据库的新人,那么MySQL中多表删除是您一定需要掌握的,下面就将为详细介绍MySQL中多表删除的方法,供您参考,希望对你学习掌握MySQL中多表删除能有所帮助. 1.从MyS ...