DirectShow应用——支持Windows Media格式

2023-10-27

 

 

大家知道,微软定义了自己的一种媒体文件类型,叫做ASFAdvanced Systems Format)。ASF其实是一个文件“容器”,它本身并没有规定音视频的压缩格式;在ASF文件中,我们可以包含任何格式的压缩的(包括MPEG-4)、或非压缩的数据。另外,微软提供了独立于DirectX开发环境以外的Windows Media Format SDK(以下简称WMFS ,专门用于支持客户开发ASF相关的应用。那么,我们能不能在DirectShow中开发ASF的应用呢?

 

答案是肯定的。因为ASF是微软自己的媒体格式,它当然会得到特别的关照。微软提供了一系列的Filter。只是这些Filter的版本关系比较复杂,我们下面先来整理一下。

 

最早从Windows Media Player (微软的媒体播放器,以下简称WMP6.4,微软使用了一个叫Windows Media SourceFilter,来支持ASF文件的播放。这个Source Filter默认与.asf.wmv.wma扩展名文件关联(即在调用IGraphBuilder::RenderFileIGraphBuilder::AddSourceFilter来播放上述扩展名的文件时,Filter Graph Manager会自动使用Windows Media Source Filter)。下面是典型的使用Windows Media Source Filter来播放ASF文件的Filter Graph参考图:

DirectShow 8.0开始,微软提供了另外两个FilterWM ASF ReaderWM ASF Writer。并且随着DirectShow版本的更新,这两个Filter的版本也在不断更新。(DirectShow 8.1中的这两个Filter使用了WMFS 7.0DirectShow 9.0中的使用了WMFS 7.1。)但是,尽管如此,为了保持向后兼容性,微软还是让Windows Media Source Filter作为播放.asf.wmv.wma文件的默认Source Filter。直到WMFS 9.0(包含有最新版本的WM ASF ReaderWM ASF Writer)的发布,WM ASF Reader才真正完全取代了Windows Media Source Filter。下面是典型的使用WM ASF Reader来播放ASF文件的Filter Graph参考图:

 

理清了上述的版本关系,编写一个播放一般的ASF文件的应用程序,应该没有什么问题了。而播放另外一些特殊的ASF文件,比如经过了DRM Digital Rights Management)保护的文件,我们还需要提供一些特殊的处理。(更多技术细节请参考SDK中的PlayWndASF例子,这里就不再赘述。)下面,我们要来看一下如何生成我们想要的ASF文件。

 

上文已经提及,ASF是一个文件“容器”。.asf扩展名是这种格式文件的“统称”,而如果我们生成的Window Media文件只包含音频,我们一般使用.wma扩展名,如果只包含视频、或同时包含音视频,我们一般使用.wmv扩展名。使用WM ASF Writer,有一个重要的概念就是配置(Profile)。通过配置,我们可以设定WM ASF Writer有几个Input pin、生成文件的比特率、压缩质量等等。当WM ASF Writer创建的时候,使用了一个系统默认的配置。如果这个配置不符合我们的具体应用,我们可以通过Filter上的IConfigAsfWriter接口改变配置。有一点需要注意的是,我们在配置WM ASF Writer之前,必须先把它加入到Filter Graph中,而必须等到配置完成后才能进行Pin的连接;运行Filter Graph之前,WM ASF Writer的所有Input pin都要求完成连接,而且各个Input pin上的输入数据要求都是打好时间戳的。还有一个重要的概念需要提醒,WMFS规定,ASF文件必须以音频为基准来播放。所以,一般WM ASF Writer总是需要一个音频的Input pin,即使这个Pin上只是输入一些静音的、低码流的数据。下面是常见的WM ASF Writer三种应用,可供参考:

提示:构建上述Filter Graph,一般有两种切实可行的方法。一种是,一个一个地加入各个Filter,配置WM ASF Writer(如果系统默认配置不符合具体应用时),然后完成整个Filter链路的连接;另一种方法是,使用IGraphBuilder::RenderFile首先构建源文件的播放链路,然后将Renderer FilterFilter Graph中移除,再加入WM ASF Writer,进行必要的配置后完成最终的连接。

 

总之,微软提供的WM ASF ReaderWM ASF WriterASFDirectShow中的应用提供了“天然的”支持。我们可以在DirectShow环境下,很方便地开发出ASF的应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectShow应用——支持Windows Media格式 的相关文章

  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • RabbitMq 和“致命错误:握手失败 -handshake_decode_error”

    我正在使用 Windows Server 2012 Erlang 19 2 和 RabbitMq 3 6 6 我在使用 TLS 配置端点之间的连接时遇到问题 我已经尝试了所有关于 SO 的答案 以及所有 RabbitMq 文档here ht
  • NtDll 真的导出 C 运行时函数吗?我可以在我的应用程序中使用这些函数吗?

    我在查看 Windows 10 计算机上的 NtDll 导出表 发现它导出标准 C 运行时函数 例如memcpy sprintf strlen etc 这是否意味着我可以在运行时动态调用它们LoadLibrary and GetProcAd
  • Python 无法在 git bash 命令行中工作

    Python 不会在 git bash Windows 中运行 当我在命令行中输入 python 时 它会将我带到一个空行 而不会像在 Powershell 中一样显示它已输入 python 2 7 10 它没有给我错误消息 但 pytho
  • .wav 文件长度/持续时间,无需读入文件

    有没有办法提取有关 wav 文件长度 持续时间的信息 而无需在 R 中读取文件 我有数千个这样的文件 如果我必须阅读每个文件才能找到其持续时间 那将需要很长时间 Windows 文件资源管理器为您提供了打开 长度 字段的选项 并且您可以查看
  • 如何从任何进程关闭 Windows 上的套接字(ipv4 和 ipv6)连接?

    如何在 Windows 上关闭 tcp v4 和 tcp v6 连接 我不想终止具有开放连接的整个进程 因为这显然会将其他人踢出该进程 我需要从一个单独的进程执行此操作 因此无法访问套接字句柄等 我正在使用 Windows API 来获取
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • 代码退出-1073741515 (0xc0000135)“未找到依赖的 dll”

    我正在尝试编写一个简单的程序 与 2019 年相比 Windows 10 64 位 调试 gt x64 遵循 将 Visual C 项目配置为面向 64 位平台 1 include
  • 更改desktop.ini不会在Windows中自动更新文件夹图标

    我使用此批处理脚本将所有文件夹和子文件夹的图标更改为位于文件夹中的 ico 文件 但是 资源管理器中的文件夹图标不会改变除非我手动重命名desktop ini将资源管理器中的文件更改为其他内容 然后返回desktop ini或者例如将字母更
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 如何使用命令行压缩文件?

    我想使用批处理文件命令 Windows XP 批处理文件 压缩目录 例如 如果我想解压缩一个文件意味着我可以使用jar xf file zip java bat 文件命令 就像我想要一个命令行批处理来压缩目录一样 如果您使用的是 Ubunt
  • Vim 在 Mingw 上表现异常

    我在 MinGW 4 6 2 上的 Vim 表现得很奇怪 例如 在插入模式下按 Backspace 会删除字符 但我必须用箭头键移动光标才能删除的字符消失 而且它也会使我退出插入模式 另一个例子 按 Del 删除字符有时会生成奇怪的字符 例
  • 在 Windows 上不使用 OpenSSL 从 pfx 文件或证书存储中提取私钥

    正如标题所示 我想在不使用 OpenSSL 或任何其他第三方工具的情况下导出我的私钥 如果我需要一个 cer文件或 pfx我可以通过 MMC 或 PowerShell 轻松导出这些文件pkiclient但我找不到获取私钥的方法 https
  • Windows 窗口对接

    我想知道如何在 Windows 中将窗口停靠 捕捉到屏幕的一侧 最好使用直接的 Win32 API 我正在寻找的效果就像任务栏 一个在屏幕上有保留空间的窗口 因此最大化另一个窗口会使该窗口占据屏幕的其余部分 但使我的窗口保持在适当的位置并可
  • 对于多重继承,使用隐式转换而不是 QueryInterface() 是否合法?

    假设我有一个类实现两个或多个 COM 接口 正如here https stackoverflow com questions 1742848 why exactly do i need an explicit upcast when imp
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 在哪里可以获得 PHP 5.3+ 的 runkit DLL 扩展?

    这是一个简单的问题 我在哪里可以获得 PHP 5 3 版本的 runkit 扩展 它的手册 http php net manual en book runkit php http php net manual en book runkit
  • SetCurrentDirectoryW 中的错误 206

    在我之后之前不清楚的问题 https stackoverflow com questions 44389617 long path name in setcurrentdirectoryw 我以某种方式能够创建一个具有长路径名的目录 但是
  • teracopy 如何替换默认的 Windows 副本

    我问了这个问题Windows 文件复制内部结构 动态加密 https stackoverflow com questions 24220382 windows file copy internals on the fly encryptio

随机推荐

  • 数据表示——原码、反码、补码、移码

    到目前为止 我们学习了十进制 二进制 八进制 十六进制等用来代表实际数值的数 称为真值 这些数我们再日常生活中都会使用到 那么在计算机中数值是怎么来表示的呢 数在计算机中的表示形式统称为机器数 计算机中处理数据及运算都是采用二进制 通常规定
  • SpringBoot项目结构介绍

    访问 http start spring io 网址 进行项目导入 基本项目结构 src main java 程序开发以及主程序入口 src main resources 配置文件 src test java 测试程序 官方建议项目结构 m
  • Speech框架API

    文章目录 Speech SFVoiceAnalytics SFSpeechRecognitionResult SFTranscription SFTranscriptionSegment SFSpeechRecognitionRequest
  • React 基本简介(1)

    什么是 React 用于构建用户界面的 JavaScript 库 React API 是处理视图的 API 集合 React 仅仅负责 View 层渲染 一个视图渲染的工具库 不做框架的事情 打包 utils 等 React 组件组成 一个
  • 有多条业务线,mysql建多库多表比较好还是一个库多个表比较好呢?

    选择使用多库多表还是一个库多个表 取决于你的具体情况和需求 以下是一些考虑因素 数据隔离 如果每条业务线需要完全独立的数据隔离 例如不同业务线的数据不会相互关联或共享 那么使用多库可以更好地实现数据隔离 管理和维护 使用多库可以将不同业务线
  • pycharm2022.2.4在jupyter notebook模式下画动图不显示

    pycharm2022 2 4在jupyter notebook模式下画动图不显示 解决办法是 matplotlib auto 曾尝试过 matplotlib notebook 还是不行 notebook模式在web浏览器中可以正常使用 能
  • 输入20个学生的成绩,求平均成绩。要求控制成绩输入的正确性,即控制输入的成绩必须为0—100分。(C语言)

    代码 include
  • 【C语言】静态通讯录的实现

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 一 项目要求 实现一个通讯录 二 Contact h 三 Con
  • 力扣第二十七天(heap(priority queue) topic)

    文章目录 problem solution 1 problem solution problem 215 Kth Largest Element in an Array Given an integer array nums and an
  • Python判断是否保留两位以下小数的数字

    判断是否为保留两位小数的数字 def check money interface money 支付时 输入的金额可能是小数 也可能是整数 s str money if s count 1 判断小数点个数 sl s split 按照小数点进行
  • TVM张量表达式

    Get Started with Tensor Expression TVM使用一个定义域特定张量表达式来高效地构造核 In 1 import tvm import tvm testing from tvm import te import
  • jenkins配置sonar并扫描C#代码

    背景 我的jenkins搭在linux上 1 下载插件 下载插件sonarqube scanner 用来集成sonarqube 在配置任务的时候才有sonarscanner的选项 2 全局工具配置 全局工具配置windows本地的msbui
  • qt系列-qt6在线安装慢的问题

    qt unified windows x64 online exe mirror https mirrors aliyun com qt 下载速度飞快
  • Qt贪吃蛇(代码裸写,不用creator)

    先上个图哇 图1 第一关视图 图2 第二关视图 游戏说明 1 每关只需吃20颗红果即可通关 2 增加新场景 在第二关出现 3 增加刚打开程序READY状态 按空格开始 4 增加暂停功能 在程序运行中按空格暂停 再按空格继续游戏 5 只要不关
  • Python客户端发布订阅MQTT云代理消息

    MQTT基础 MQTT 是一种开放且简单的客户端服务器发布 订阅消息传输协议 专为高延迟和低网络带宽环境下不同设备之间的机器对机器通信而设计 机器对机器通信 这很容易 一个系统需要与其他系统交换信息 在物联网环境中 设备之间的通信需求急剧增
  • react native 使用echarts做面积图

    react native 使用echarts 我用到了一个组件 react native secharts https github com shifeng1993 react native secharts 使用 import Echar
  • Git合并的代码 不提交服务器的方法

    使用Git下载代码的时候 常遇到合并的情况 然后再上传的时候 系统就会自动把合并代码的过程也上传 有时候会感觉非常的烦Merge remote tracking branch choose remote name master 每次先下载到
  • pycharm自定义多行注释的颜色

  • JWT续期问题,ChatGPT解决方案

    JWT JSON Web Token 通常是在用户登录后签发的 用于验证用户身份和授权 JWT 的有效期限 或称 过期时间 通常是一段时间 例如1小时 过期后用户需要重新登录以获取新的JWT 然而 在某些情况下 用户可能会在JWT到期之前使
  • DirectShow应用——支持Windows Media格式

    大家知道 微软定义了自己的一种媒体文件类型 叫做ASF Advanced Systems Format ASF其实是一个文件 容器 它本身并没有规定音视频的压缩格式 在ASF文件中 我们可以包含任何格式的压缩的 包括MPEG 4 或非压缩的