Directshow_驱动摄像头预览视频

出于兴趣一直以来都断断续续看过dshow的东西,可没怎么系统地总结过(学习还是要多实践,多总结啊).

dshow预览摄像头捕捉的视频比较简单基础,网上相关的资料很多,简单的思路由下面代码所示:

ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder
// Initialize pBuild (not shown).
IBaseFilter *pCap; // Video capture filter.
/* Initialize pCap and add it to the filter graph (not shown). */
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
 pCap, NULL, NULL);

dshow 提供了一个 Capture Graph Builder COM 组件使得捕捉graph 图的生成更加简单。 Capture Graph Builder 提供了一ICaptureGraphBuilder2接口 ,这个接口提供了一些方法用来构建和控制捕捉 graph。video capture filter则由系统设备枚举得到可用视频设备,并生成filter;最后智能连接graph即可.具体见代码和注释:

#include <dshow.h>
#include <stdio.h>
#include <atlconv.h>
#pragma comment(lib,"quartz.lib")
#pragma comment(lib, "strmiids.lib")
void main()
{
	IGraphBuilder *pGraph = NULL;
	IMediaControl *pControl = NULL;
	IMediaEvent   *pEvent = NULL;
	IVideoWindow *pVideoWindow = NULL;
	ICaptureGraphBuilder2 *pBuild = NULL;
	// Initialize the COM library.
	HRESULT hr = CoInitialize(NULL);
	if (FAILED(hr)){
		printf("ERROR - Could not initialize COM library");
		return;
	}
	//创建Capture Graph Builder 对象
	 hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
		 CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild);
	if (SUCCEEDED(hr)){
		// 创建 graph manger 对象.
		hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,
			IID_IGraphBuilder, (void**)&pGraph);
		if (SUCCEEDED(hr))
			// 初始化 Capture Graph Builder.
			pBuild->SetFiltergraph(pGraph);
	}
	//各个查询接口.
	hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
	hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
	hr = pGraph->QueryInterface(IID_IVideoWindow, (void**)&pVideoWindow);

	ICreateDevEnum *pDevEnum = NULL;
	IEnumMoniker *pEnum = NULL;
	//创建一个系统设备枚举对象
    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
		CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,reinterpret_cast<void**>(&pDevEnum));
	if (SUCCEEDED(hr))
		//创建一个枚举器,用来枚举视频设备
		hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum, 0);

	IMoniker *pMoniker = NULL;
	//开始枚举设备
	while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
	{
		IBaseFilter *pCap = NULL;
		hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);//为设备生成 filter
		if (SUCCEEDED(hr))
		{
			hr = pGraph->AddFilter(pCap, L"Capture Filter");//将filter加入到graph
		}
		if (SUCCEEDED(hr))
		{
			//PIN_CATEGORY_PREVIEW: specifying a pin category;
		    //MEDIATYPE_Video:      the major media types.
			//pCap:                 pointer to the starting filter for the connection
			hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,  pCap, NULL, NULL);//连接graph
			break;
		}
		else{
			pMoniker->Release();
			continue; //尝试下一个
		}
	}
     pVideoWindow->put_AutoShow(OATRUE);//graph自动显示视频窗口
	//pVideoWindow->put_Visible(OATRUE/*OAFALSE*/);
		if (SUCCEEDED(hr))
		{
			// Run the graph.
			hr = pControl->Run();
			if (SUCCEEDED(hr)){
				long evCode;
				pEvent->WaitForCompletion(INFINITE, &evCode);//一直阻塞在这边;
			}
		}
	pBuild->Release();
	pMoniker->Release();
	pControl->Release();
	pEvent->Release();
	pGraph->Release();
	CoUninitialize();
}

参考资料:

  1. 《Directshow开发指南》
  2. 《directshow SDK 学习笔记》
时间: 2024-11-24 16:59:14

Directshow_驱动摄像头预览视频的相关文章

Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用(转)

原文地址:http://blog.csdn.net/yanzi1225627/article/details/8605061# 很多时候,android摄像头模块不仅预览,拍照这么简单,而是需要在预览视频的时候,能够做出一些检测,比如最常见的人脸检测.在未按下拍照按钮前,就检测出人脸然后矩形框标示出来,再按拍照.那么如何获得预览帧视频么? 只需要在Activity里继承PreviewCallback这个接口就行了.示例如下: public class RectPhoto extends Acti

终极指南:如何为iOS8应用制作预览视频

最近一两个月里,苹果的世界里出现了很多新东西,比如屏幕更大的iPhone 6,可穿戴设备Apple Watch,iOS8,以及旨在帮助用户更好的发现应用的App Store改版等等. 说到App Store的改版,最值得设计师.开发者和市场人员关注的大概就是视频预览功能了.官方将其称为“应用预览(App Previews)”,如今已经正式出现在iOS8的App Store当中.自然,已经有一大波设计师和开发者为他们的产品制作了预览视频并通过iTunes Connect上传.坦率的说,如果你也有自

APP_Store - 怎样为iOS8应用制作预览视频

关于iOS 8应用预览视频的话题,从设计.技术规范,到录屏.编辑工具,介绍的都比较详尽:建议收藏,在接下来用的到的时候作以参考.下面进入译文. 最近一两个月里,苹果的世界里出现了很多新东西,比如屏幕更大的iPhone 6,可穿戴设备Apple Watch,iOS8,以及旨在帮助用户更好的发现应用的App Store改版等等. 说到App Store的改版,最值得设计师.开发者和市场人员关注的大概就是视频预览功能了.官方将其称为“应用预览(App Previews)”,如今已经正式出现在iOS8的

iOS预览视频的制作

花了两天折腾这个东西,又是升级iOS8,又是安装Yosemite,终于折腾成功了. 安装Yosemite的时候新划分了一个分区,把它安装到新分区,不影响现在的系统,启动时在系统偏好设置->启动磁盘中选择启动到哪个系统,很方便. 安装iOS8很简单了,在iTunes中按住option键点击检测更新,选择下载的iOS8系统文件,一路安装下去即可. 接下来就是在Yosemite中制作预览视频了,连上iPad mini 2真机,用QuickTime Player录制电影,大小为1200 x 900,用你

H5上传前预览视频(结合 video标签 &amp;&amp;h5 fileApi)

2017/09/14 发布 js代码: // hTML5实现表单内的上传文件框,上传前预览视频,刷新预览video,使用HTML5 的File API, // 建立一个可存取到该file的url,一个空的video标签,ID为video0,把选择的文件显示在video标签中,实现视频预览功能. // 需要选择支持HTML API的浏览器. $("#video").change(function(){ var objUrl = getObjectURL(this.files[0]) ;

关于降低android手机摄像头预览分辨率

假设现在有这样一个需求需要一直开着手机摄像头 但是不做任何拍照动作 但是每个手机的相机分辨率都不同 而默认预览的时候参数是最大分辨率 这样有时候就回导致电量损耗的加快 所以我们可以采取降低相机分辨率的方法 这样既达到了目标 又节省了电量 1 package com.example.camerbatterytest; 2 3 4 import java.io.IOException; 5 import java.util.List; 6 7 import android.app.Activity;

制作Appstore预览视频并上传

首先保证你的设备是mac,系统版本为10.10或以上. 工具: 浏览器:safari. 录像:QuickTime player 视频编辑:HandBrake 1.录制视频:打开QuickTime,选择[文件]-[新建影片录制]点击下拉框出现下面界面. 开始录制,注意视频应该在15-30秒之内. 2.编辑 这里主要是转换视频的编码格式.我们用到的工具是HandBrake,进入HandBrake界面导入我们刚才录制的视频.这里我们主要配置下面几个选项 ①FPS:我们用24就好了.②Audio的采样率

Yii2 框架下bootstrap 弹窗预览视频等~

Yii2 本身已经引用了'yii\bootstrap\BootstrapAsset',所以使用bootstrap 非常简洁. 1 在PHP页面引用命名空间 use app\assets\AppAsset; 2 可以直接在PHP页面书写要弹出的iframe的div;在此出可以设置弹窗的宽高,位置,对话框标题等 <div class="modal fade" id="myModalpreview" tabindex="-1" role=&quo

上传图片(预览),视频,并添加数据库小例子

主页面: <script src="../fzl/jquery-1.11.2.min.js"></script> <script src="../tanchuang/tanchuang.js"></script> <script src="fenye.js"></script> <title>无标题文档</title> <style type=&