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格式 的相关文章

随机推荐

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

    到目前为止 我们学习了十进制 二进制 八进制 十六进制等用来代表实际数值的数 称为真值 这些数我们再日常生活中都会使用到 那么在计算机中数值是怎么来表示的呢 数在计算机中的表示形式统称为机器数 计算机中处理数据及运算都是采用二进制 通常规定
  • 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 或非压缩的