Directshow 视频捕捉 三

Directshow中的视频捕捉 本篇文档主要描述关于用Directshow进行视频开发的一些技术主要包括下面内容1关于视频捕捉(About Video Capture in Dshow) 2选择一个视频捕捉设备(Select capture device) 3预览视频(Previewing Video) 4如何捕捉视频流并保存到文件(Capture video to File) 5将设备从系统中移走时的事件通知(Device r 阅读详情

如何捕捉视频流并保存到文件(Capture video to File)

1 将视频流保存到AVI文件


AVI Mux filter接收从capture pin过来的视频流,然后将其打包成AVI流。音频流也可以连接到AVI Mux Filter上,这样mux filter就将视频流和视频流合成AVI流。File writer将AVI流写入到文件中。
可以像下面这样构建graph图

Cpp代码   收藏代码
  1. IBaseFilter *pMux;  
  2. hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,            //Specifies AVI for the target file  
  3.                                 L"C:\\Example.avi",             //File name  
  4.                                &pMux,                                   //Receives a pointer to the mux  
  5.                                NULL);       //(Optional)Receives a pointer to the file sink  

 

 

第一个参数表明文件的类型,这里表明是AVI,第二个参数是制定文件的名称。对于AVI文件,SetOutputFileName函数会创建一个AVI mux Filter 和一个 File writer Filter ,并且将两个filter添加到graph图中,在这个函数中,通过File Writer Filter 请求IFileSinkFilter接口,然后调用IFileSinkFilter::SetFileName方法,设置文件的名称。然后将两个filter连接起来。第三个参数返回一个指向 AVI Mux的指针,同时,它也通过第四个参数返回一个IFileSinkFilter参数,如果你不需要这个参数,你可以将这个参数设置成NULL。
然后,你应该调用下面的函数将capture filter 和AVI Mux连接起来。

Cpp代码   收藏代码
  1. hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,         //Pin category  
  2.                           &MEDIATYPE_Video,         //Media type  
  3.                           pCap,         //Capture filter  
  4.                           NULL,         //Intermediate filter(optional)  
  5.                           pMux);         //Mux or file sink filter  
  6. //Release the mux filter  
  7. pMux->Release();  

 

 

第5个参数就是使用的上面函数返回的pMux指针。
当捕捉音频的时候,媒体类型要设置为MEDIATYPE_Audio,如果你从两个不同的设备捕捉视频和音频,你最好将音频设置成主流,这样可以防止两个数据流间drift,因为avi mux filter为同步音频,会调整视频的播放速度的。为了设置master 流,调用IConfigAviMux::SetMasterStream方法,可以采用如下的代码:

Cpp代码   收藏代码
  1. IConfigAviMux *pConfigMux = NULL;  
  2. hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux);  
  3. if(SUCCEEDED(hr))  
  4. {  
  5.     pConfigMux->SetMasterStream(1);  
  6.     pConfigMux->Release();  
  7. }  

 

 

SetMasterStream的参数指的是数据流的数目,这个是由调用RenderStream的次序决定的。例如,如果你调用RenderStream首先用于视频流,然后是音频,那么视频流就是0,音频流就是1。
添加编码filter

Cpp代码   收藏代码
  1. IBaseFilter *pEncoder;  
  2. //Add it to the filter graph  
  3. pGraph->AddFilter(pEncoder, L"Encode");  
  4. //Render the stream  
  5. hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,   
  6.                           pCap, pEncoder, pMux);  
  7. pEncoder->Release();  

 

 

2 将视频流保存成wmv格式的文件


为了将视频流保存成并编码成windows media video (WMV)格式的文件,将capture pin连到WM ASF Writer filter。

构建graph图最简单的方法就是将在ICaptureGraphBuilder2::SetOutputFileName方法中指定MEDIASUBTYPE_Asf的filter。如下

Cpp代码   收藏代码
  1. IBaseFilter *pASFWriter = 0;  
  2. hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Asf,        //Create a windows media file  
  3.                                L"C:\\VidCap.wmv",               //File name  
  4.                                &pASFWriter,             //Receives a pointer to the filter  
  5.                                NULL);               //Receives an IFileSinkFilter interface pointer(optional)  

 

 

参数MEDIASUBTYPE_Asf 告诉graph builder,要使用wm asf writer作为文件接收器,于是,pbuild 就创建这个filter,将其添加到graph图中,然后调用IFileSinkFilter::SetFileName来设置输出文件的名字。第三个参数用来返回一个ASF writer指针,第四个参数用来返回文件的指针。


在将任何pin连接到WM ASF Writer之前,一定要对WM ASF Writer进行一下设置,你可以同过WM ASF Writer的IConfigAsfWriter接口指针来进行设置。

Cpp代码   收藏代码
  1. IConfigAsfWriter *pConfig = 0;  
  2. hr = pASFWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig);  
  3. if(SUCCEEDED(hr))  
  4. {  
  5.     //Configure the ASF Writer filter  
  6.     pConfig->Release();  
  7. }  

 

 

然后调用ICaptureGraphBuilder2::RenderStream将capture Filter 和 ASF writer连接起来:

Cpp代码   收藏代码
  1. hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,         //Capture pin  
  2.                           &MEDIATYPE_Video,             //Video. Use MEDIATYPE_Audio for audio  
  3.                           pCap,         //Pointer to the capture filter  
  4.                           0,   
  5.                           pASFWriter);      //Pointer to the sink filter(ASF Filter)  

 

3保存成自定义的文件格式
如果你想将文件保存成自己的格式,你必须有自己的 file writer。看下面的代码:

Cpp代码   收藏代码
  1. IBaseFilter *pMux = 0;  
  2. IFileSinkFilter *pSink = 0;  
  3. hr = pBuild->SetOutputFileName(&CLSID_MyCustomMuxFilter,     //开发自己的Filter  
  4.                                L"C:\\VidCap.avi", &pMux, &pSink);  

 

 

 

4如何将视频流保存进多个文件
当你将视频流保存进一个文件后,如果你想开始保存第二个文件,这时,你应该首先将graph停止,然后通过IFileSinkFilter::SetFileName改变 File Writer 的文件名称。注意,IFileSinkFilter指针你可以在SetOutputFileName时通过第四个参数返回的。
看看保存多个文件的代码:

Cpp代码   收藏代码
  1. IBaseFilter *pMux = 0;  
  2. IFileSinkFilter *pSink = 0;  
  3. hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,   
  4.                                L"C:\\YourFileName.avi", &pMux, &pSink);  
  5. if(SUCCEEDED(hr))  
  6. {  
  7.     hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,  
  8.                                                 pCap, NULL, pMux);  
  9.     if(SUCCEEDED(hr))  
  10.     {  
  11.         pControl->Run();  
  12.         pControl->Stop();  
  13.         //Change the file name and run the graph again  
  14.         pSink->SetFileName(L"YourFileName02.avi", 0);  
  15.         pControl->Run();  
  16.     }  
  17.   
  18.     pMux->Release();  
  19.     pSink->Release();  
  20. }  

 

【MFC两种视频图像采集方法】DirectShow与Opencv 效果图: DirectShow采集核心代码: 创建线程调用该函数,采集图像能过x264解码封装rtmp协议包,推送至FMS服务器,可实现视频直播 UINT __stdcall StartVideo(void *c) { CVideoConf *conf = (CVideoConf *)c; int vid = conf->code; CString strurl(conf- 阅读详情

相关推荐

windows下视频捕捉VFW和DirectShow

说起视频捕捉问题,先来看一下视频捕捉卡。根据使用的驱动程序的不同来分类,目前市场上大致有两种捕捉卡:VFW (Video for Windows)卡和WDM (Windows Driver Model)卡。前者是一种趋于废弃的驱动模型,而后者是前者的替代模型;WDM还支持更多新的

5429

C++实战之 windows MFC 工程应用开发与框架原理完全剖析

本课程是Windows程序设计系列课程三部曲之二:Windows MFC框架原理与工程应用开发。本课程重点讲解在windows平台开发使用MFC框架进行应用程序开发的核心手段.

Directshow(SDK)学习笔记九_视频捕捉

摘要:本篇文档主要描述关于用Directshow进行视频开发的一些技术主要包括下面内容1关于视频捕捉(About Video Capture in Dshow) 2选择一个视频捕捉设备(Select capture device) 3预览视频(Previewing Video) 4如何捕捉视频流并保存到文件(Capture video to File) 5将设备从系统中移走时的事件通知(Devic

dankes 2938

VC+DirectShow对视频进行图片处理(转)

现在的图像越来越花巧了,有浮雕、马赛克、相框等特效,看得人眼花缭乱。本来图像特效没什么稀奇的,在PhotoShop等图像处理软件中我们早已见得多了,不过用在视频上就令人感觉有点神奇。我一直都想拥有这些效果,但我的摄像头是很早就买到的,没福气奢望驱动程序给 它带来的全新精彩。刚好我学习DirectShow有一段时间了,既为了挑战自己(我从未写过令自己感到满意的程序),也为了检验学习成果,我就下了

一蓑烟雨的专栏 3580

基于MFC和DirectShow实现简易视频捕捉

本文还有配套的精品资源,点击获取 简介:MFC (Microsoft Foundation Classes) 是用于构建Windows应用程序的C++类库。本项目介绍如何通过DirectShow技术在MFC中实现视频捕捉,包括DirectShow Filter Graph的构建、设备捕获、样本抓取以及用户界面交互等方面。提供了一个可以直接运行的示例程序,并阐述了关键知识点,...

weixin_35756624的博客 1462

VC++通过DirectShow播放视频

VC++2015编译,使用DirectX90b中的DirectShow播放常见的AVI、WMA、MP4等格式的视频文件

在VC中调用DirectShow全屏播放视频

有些正在尝试自己编制游戏的朋友可能会碰到这样一个问题:游戏要播放片头动画,可是如何全屏播放动画呢?用媒体播放机控件?这是最简单的方法,可是好多功能都用不上,不免觉得有些浪费。而用vfw之类的多媒体库又太麻烦。怎么办呢?   其实微软不但提供了DirectX这样的便于游戏开发的SDK,还提供了基于其上的DirectX Media SDK。这套SDK可以帮助你简化多媒体开发,而又充分利用DirectX

625

给jetson nano 安装AX200网卡驱动

几经波折,因为在网上看到的基本都是amd版本而非arm版,然后最终选定V5.5是因为更新的几个版本的arm版本是false的(在https://kernel.ubuntu.com/~kernel-ppa/mainline/处选择版本时,得看在arm64上是false还是build succeeded,之前没经验呀刚刚才顿悟的) 1,参考文章https://blog.youkuaiyun.com/MIRANA0/article/details/106696334 学到了得下载如下四个: wget https://k

发嘎嘎的博客 2344

Directshow 捕捉视频入门篇

这篇文章是介绍关于视频捕捉硬件的一些基础知识及硬件输入输出引脚的一些预备知识。

CreatedSign的专栏 2239

手把手教你用Multisim 14.2仿真一个4.4V的LDO电路(附完整仿真文件)

本文详细介绍了如何使用Multisim 14.2仿真一个4.4V的LDO电路,从环境配置、核心参数解析到电路搭建和仿真调试。通过分压电阻精确计算和瞬态响应测试,帮助读者掌握LDO电路的设计与验证技巧,并附有完整仿真文件供参考。

weixin_28738397的博客 274

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5069

DirectShow视频捕捉应用研究

摘要 本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动(Driver)与应用的模型和接口进行研究和分析,比较其Windows与Windows CE中的不同,从而提出在Windows CE下实现视频捕捉数据流的方法。  关键字 DirectShow,视频捕捉,驱动,Windows CE系统  引言  随着多媒体技术的不断发展,相应的软件与硬件层出不穷,现在与多媒体视频会议(Video Co

Briver Song的专栏 1990

从投影到抗噪:直线拟合三大算法实战指南

本文深入解析了直线拟合的三大核心算法:常规最小二乘法(OLS)、正交回归(TLS)和RANSAC。通过对比其几何原理、代码实现与适用场景,为计算机视觉和数据分析领域的实践者提供了清晰的选型指南,帮助在抗噪、旋转不变性等不同需求下,精准选择并应用最合适的算法。

ujm567890的博客 576

Directshow的视频捕捉

<br />Directshow(SDK)学习笔记九_视频捕捉<br />摘要:本篇文档主要描述关于用Directshow进行视频开发的一些技术<br />主要包括下面内容<br /> 1关于视频捕捉(About Video Capture in Dshow)2选择一个视频捕捉设备(Select capture device)3预览视频(Previewing Video)4如何捕捉视频流并保存到文件(Capture video to File)5将设备从系统中移走时的事件通知(Device remove N

n567656756765676567的专栏 849

基于Python实现人脸识别相似度对比

随着人工智能技术的不断进步,人脸识别成为了一种广泛应用的技术。人脸相似度对比是其中的一个重要应用场景,可以用于人脸搜索、身份验证等方面。本文将介绍如何使用Python实现人脸相似度对比。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 9807

RAP BDL 里的 field ( readonly ) 到底控制了什么?——从语法到运行时的全景解析

RAP行为定义中的只读字段控制 摘要:该代码片段展示的是RAP(ABAP RESTful Application Programming)行为定义语言(BDL)中的字段控制语法,用于声明业务对象中需由框架自动维护的只读字段。field ( readonly )语句将订单ID和审计字段(CreatedBy/CreatedAt等)标记为只读,确保这些字段在更新阶段不可修改。在managed场景下,RAP框架会自动处理这些行政性数据的写入:创建时填充创建信息,更新时刷新变更记录,并利用LocalLastChang

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 154

Directshow中的视频捕捉(转)

Directshow中的视频捕捉(转) &nbsp; &nbsp; 本篇文档主要描述关于用Directshow进行视频开发的一些技术主要包括下面内容 1关于视频捕捉(About Video Capture in Dshow) 2选择一个视频捕捉设备(Select capture device) 3预览视频(Previewing Video) 4如何捕捉视频流并保...

ett_qin的博客 816

OpenCASCADE完整教程专栏完整目录

OpenCASCADE完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 9694

基于DirectShow实现的视频捕捉与采集

DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。

毕业作品网站 1688

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2597

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

DirectShow中的视频捕捉之一

关于视频捕捉(About Video Capture in Dshow)1) 视频捕捉Graph的构建一个能够捕捉音频或者视频的graph图都称之为捕捉graph图。捕捉graph图比一般的文件回放graph图要复杂许多,dshow提供了一个Capture Graph Builder COM组件使得捕捉graph图的生成更加简单。Capture Graph Builder提供了一个ICapture...

镜花水月 415

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Directshow 视频捕捉入门篇 二

下面的代码来结束如何选择一个视频捕捉设备,就是我们平常说的摄像头 选择一个视频捕捉设备(Select capture device) 如何选择一个视频捕捉设备,可以采用系统设备枚举,详细资料参见Using the System Device Enumerator 。enumerator可以根据filter的种类返回一个设备的monikers。Moniker是一个com对象,可以参见IM

CreatedSign的专栏 1516

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

DirectShow视频捕获

本文档比较适合初学者,写的比较详细,水平有限,翻译得不好还请见谅。目标是只要不会误导大家就可以了,我可不想误人子弟,哈哈!DirectShow捕捉程序的准备 Graph Edit概述 COM 入门知识 http://www.microsoft.com/japan/com/compapers.asp C Magazine

nisikawaguti的专栏 4444

[转]DirectShow应用——视频捕捉WDM Vs VFW

本文转自:http://bbs.njupt.edu.cn/cgi-bin/bbsanc?path=/groups/computer.faq/MultiMedia/D52F2B929/D99113C57/X70CFBCB7发信人: yellowdawn (追逐天边的云), 信区: MultiMedia标  题: DirectShow应用——视频捕捉WDM Vs VFW发信站: 紫

freeliver54的专栏 1811
上一篇: Directshow 视频捕捉入门篇 二
下一篇: VC++操作Excel在VS2008环境中的配置过程
CreatedSign
博客等级 码龄14年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值