DirectShow播放视频步骤

2023-11-07

DirectShow是MicrosoftWindows平台上的流媒体架构。可以用它来方便的进行视频捕获和回放。

DirectShow是基于组件对象模型(COM)

 

下面是DirectShow播放AVI视频的代码

#include <stdio.h>
#include <dshow.h>//DirectShow必须包含的头文件,LIB库为Strmiids.lib 和 Quartz.lib
#pragma comment (lib,"Strmiids.lib")

int main() {
	IGraphBuilder *pGraph = NULL;//  用于创建Filter Graph的接口
	IMediaControl *pControl = NULL;//  用于向Filter Graph Manager发送Command
	IMediaEvent *pEvent = NULL; //   用于接收Filter Graph Manager发出的Event

	HRESULT hr = CoInitialize(NULL);
	if (FAILED(hr)) {
		fprintf(stderr, "could not init the com library!");
		return	0;
	}
	//创建Filter Graph Manager
	hr=CoCreateInstance(CLSID_FilterGraph,NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
	if (FAILED(hr)) {
		fprintf(stderr, "could not create Filter Graph Manager!");
		return 0;
	}
	
	//查询并获得接口指针
	hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
	hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
	// RenderFile库函数是少数几个能够自动创建Graph的成页,所以这里省去了创建Graph这一步
	hr = pGraph->RenderFile(L"C:\\01.avi", 0);
	if (SUCCEEDED(hr)) {
		hr = pControl->Run();
		if (SUCCEEDED(hr)) {
			// 等待视频结束
			long evCode;
			pEvent->WaitForCompletion(INFINITE, &evCode);
			// 无限等待
		}
	}

	pControl->Release();
	pEvent->Release();
	pGraph->Release();
	//释放接口
	CoUninitialize();//卸载com库
	system("pause");
	return 0;
}

DirectShow是基于COM的,所以要初始化COM组件使用这个接口 CoInitialize

CoCreateInstance接口可以用它来创建各种过滤器

看到了要首先创建几个接口

IGraphBuilder *pGraph = NULL;//  用于创建Filter Graph(过滤器图表)的接口,DirectShow要播放视频或捕获视频,要创建很多过滤器,这个接口用于连接过滤器或添加过滤器
IMediaControl *pControl = NULL;//  用于向Filter Graph Manager发送Command 这个控制(control)提供了通过过滤器图控制数据流的方法。它包括运行,暂停和停止图表的方法。
IMediaEvent *pEvent = NULL; //   用于接收Filter Graph Manager发出的Event

步骤

  1. 创建Filter Graph Manager的实例。
  2. 使用过滤器图形管理器构建过滤器图形。
  3. 运行图表,使数据在筛选器中移动。
  4. 详细内容请看连接https://docs.microsoft.com/zh-cn/windows/desktop/DirectShow/how-to-play-a-file
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectShow播放视频步骤 的相关文章

随机推荐

  • 备战数学建模34-BP神经网络预测2

    目录 一 辛烷值的预测 1 题目分析与原理介绍 2 神经网络建立过程 3 预测结果分析 BP神经网络模型 包含输入层 隐含层和输出层 正向传播过程是通过输入样本到输入层 通过输入层经过各层隐藏层 最后到达输出层 若输出层输出值与期望值的输出
  • STM32学习----通用定时器的应用(输入捕获,测量周期和占空比)

    输入捕获的应用 输入捕获一般是用来测量输入信号的频率 占空比这些信息 输入捕获的原理 捕获的原理 1 信号从某个通道输入 比如通道1 CH1 2 经过滤波和边沿检测后产生两个一模一样的信号TI1FP1和TI1FP2 TI1FP1送给捕获通道
  • 身份证二进制数据解析

    头数据 AA AA AA 96 69 05 08 00 00 90 01 00 04 00 文本信息 256个字节 使用Unicode解码 得到中文信息 姓名 30个字节 性别 2个字节 民族 4个字节 出生日期 16个字节 地址 70个字
  • 数据治理项目工作方式总结

    1 当工作完成后 每天完成对应的计划任务列表分析 图表展示 代码展示等汇总报告 PPT 是简单的方式 word excel也是可以的 这边习惯用word 写一写文档之类的 excel 做工作拆分和总结 PPT 做工作汇报 2 没有的话 可以
  • 入门数据结构,c语言实现循环队列实现(详细篇)。

    目录 一 前言 二 循环队列的概念 三 实现循环队列 1 头文件与特殊函数介绍 2 循环队列的结构体 3 队列的初始化 4 判断队列是否为空 5 队列的进队操作 6 队列的出队操作 7 返回队头 8 返回队列长度 9 放回队列容量大小 10
  • MIB文件解析,常见报错整理

    我用的是这个工具FmMib 需要的可以给我留言 目前网上关于类似的报错整理还是挺少的 可能这个知识点用的也不多 我开始解析mib文件时 小问题还是挺多的 很多书写问题 格式都是自己手动改源文件才可以解析出来 建议在做类似解析的时候可以先学习
  • 基础11:深浅拷贝

    1 浅拷贝 创建一个新对象 这个对象有着原始对象属性值的一份精确拷贝 如果属性是基本类型 拷贝的就是基本类型的值 如果属性是引用类型 拷贝的就是内存地址 所以如果其中一个对象改变了这个地址 就会影响到另一个对象 简单来说 浅拷贝只拷贝了对象
  • java jdbc 优化_调参优化jdbc初始连接时的性能消耗

    背景 mysql connector java JDBC驱动是java开发数据库相关应用重要的组件 绝大多数场景下默认的设置即可以满足需求 但最近有个业务场景 导致了需要重新审视对jdbc的使用 这篇文章用以记录 描述 同事反馈业务在集群扩
  • Java对一维数组倒叙排列

    直接数组元素对换 public class ReversTest public static void main String args int arr 25 4 15 7 8 String strings ramer jelly bean
  • ChatGPT 吹响了第四次产业革命(AI 革命)的号角

    目录 未来 AI 大模型的发展趋势 通用多模态大模型 语言文字是多模态大模型的核心
  • vue.config.js 配置的文件

    vue config js是一个可选的配置文件 用于配置Vue CLI构建的项目 如webpack的配置等 使用vue config js 可以在项目的根目录下创建一个JavaScript文件 并在该文件中进行配置 下面是一些在vue co
  • JAVA-JDK1.8介绍

    Java JDK 1 8 Java Development Kit的第8个主要版本 Java JDK 1 8是Java编程语言的一个重要版本 引入了一些新的功能和改进 同时也修复了几项bug 在本博客中 我将详细介绍Java JDK 1 8
  • ESP8266常见问题汇总——转载自官网

    ESP8266 常见问题 本页面收集esp8266常见问题 概述 本文档主要介绍开发者在ESP8266开发中常见的一些问题 这些问题主要包括以下几大类 基本概念相关 ESP8266 相关 AiCloud 相关 固件编译调试相关 文档资料相关
  • leetcode 376 摆动序列

    动态规划 class Solution public int wiggleMaxLength int nums if nums length 1 return nums length 动态规划 dp i 0 表示当前数字的子序列长度 dp
  • rabbitmq Attempting to connect to: [localhost:5672] SocketExceptio:Socket Closed

    今天使用spring cloud stream for rabbitmq启动项目报错 2019 05 03 13 22 27 350 INFO file 18160 main o s a r c CachingConnectionFacto
  • FAPI专题-8:5G FAPI接口 - 中文规范-4- P7消息格式

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120645757 目录 第3章 主要的
  • 若依管理系统RuoYi-Vue(二):权限系统设计详解

    本篇文章试图讲解若依Vue系统中的权限设计原理以及实战 为什么是 试图 因为这也是摸索着理解的 不一定准 若依Vue系统中的权限管理部分的功能都集中在了系统管理菜单模块中 如下图所示 其中权限部分主要涉及到了用户管理 角色管理 菜单管理 部
  • nginx中root与alias关键字的区别

    前言 近段时间秋招上岸了 于是每天疯狂补各种分布式基础 每天都在痛苦与快乐中度过 在学习 nginx 的时候 遇到配置上的问题 root 与 alias 的区别 卡了大概三个小时 记录下来警醒自己不要再犯了 正文 在使用 进行配置时 两者没
  • CentOS yum的详细使用方法

    yum 是什么yum Yellow dog Updater Modified主要功能是更方便的添加 删除 更新RPM包 它能自动解决包的倚赖性问题 它能便于管理大量系统的更新问题 yum特点可以同时配置多个资源库 Repository 简洁
  • DirectShow播放视频步骤

    DirectShow是MicrosoftWindows平台上的流媒体架构 可以用它来方便的进行视频捕获和回放 DirectShow是基于组件对象模型 COM 下面是DirectShow播放AVI视频的代码 include