《DirectShow开发指南》学习笔记_6

2024-01-11 03:48

本文主要是介绍《DirectShow开发指南》学习笔记_6,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动态重建技术

由于下列任何一个原因,我们都需要对已有的Filter Graph进行修改。

  1. 应用程序在播放一段视频的过程中想要插入一个视频效果Filter;
  2. Source Filter在运行过程中改变了数据流的媒体类型,需要接入新的解码Filter;
  3. 应用程序想要在Filter Graph中加入另外一条视频流。

       通常的做法是,现将Filter Graph停止,进行修改之后,再重新启动。那么,有没有一种方法能够在保持Filter Graph运行状态的同时实现Filter Graph的重建呢?答案是肯定的。

Filter Graph的重建包括如下几种情形:

  • 仅仅改变Filter之间连接媒体类型;
  • 增加或删除Filter,重新进行相关Filter之间的连接;
  • 对一条Filter链路(Filter Chain)进行操作。

媒体类型的动态改变

当两个Pin连接完成后,就会有一个双方商定的媒体类型用来描述以后在这两个连接Pin之间传递的数据格式。一般情况下,这个媒体类型在Filter Graph运行的整个过程中是不会改变的。但在一些特殊的场合下,“需要”这种媒体类型的动态改变。DirectShow是如何支持的呢?下面分不同情况来讨论。

从上往下要求媒体类型改变,但传送数据使用的内存不需增大

    媒体类型的改变由Filter A的输出Pin发起。首先,Filter A调用Filter B的输入Pin上的IPin::QueryAccept或IPinConnection::DynamicQueryAccept,看Filter B是否支持新的媒体类型,如果支持,则Filter A调用IMemAllocator::GetBuffer得到一个空的Sample,通过IMediaSample::SetMediaType将新的媒体类型与Sample相连。然后,Filter A就可以将Sample传送给Filter B。当Filter B接收到新的Sample时,可以通过调用IMediaSample::GetMediaType得到新的媒体类型。

      一般来说,Filter B应该具有对媒体类型改变的应变能力,这是在写自己的Filter时应该考虑到的问题。Filter A一般调用QueryAccept来判断Filter B的输入Pin是否支持新的媒体类型。可以从CBasePin::QueryAccept的实现中看到,它仅仅是调用Pin上的CheckMediaType函数。所以QueryAccept返回S_OK并不能保证媒体类型能够在Graph运行状态下改变成功。

这篇关于《DirectShow开发指南》学习笔记_6的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/593071

相关文章

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什