Windows 视频回放技术常识

Windows 系统中视频的完美回放,需要依赖以下产品:

DirectX:Windows 的高级图形 API,对于视频回放,主要是依靠其中的 DirectShow,也会用到 DirectSound、DirectDraw 甚至 Direct3D。对硬件制造商和图形相关应用程序的开发人员来说,就是一种标准。若显卡支持系统所带的 DirectX 版本,则能达到最大效果。

DXVA:DirectX Video Acceleration,DirectX 针对视频加速提供的 API。对硬件制造商和视频相关应用程序的开发人员来说,就是一种标准。若显卡支持系统所带的 DXVA,就有机会达成视频回放的硬解码。

Pixel shader:象素阴影着色器,一种由 GPU 执行的着色程序,必须显卡支持才能使用。DirectX 中包含对其的 API(DirectX 8.0 支持 Pixel shader 1.0,DirectX 9.0 支持 Pixel shader 2.0,DirectX 9.0c 支持 Pixel shader 3.0)。Pixel shader 在 DirectX 10 时代被 Unified Shader 代替,Unified Shader 硬件标准兼容 Pixel shader 的程序。

显卡与显卡驱动:显卡,更准确的说是 GPU,将支持更多视频播放技术,比如依照 DXVA 标准的视频加速和硬解码;驱动则是显卡的指挥和操纵者,影响着功能的开关以及表现效果。原本,视频播放过程的计算几乎是完全由 CPU 配合软件完成的,视频加速的出现使得 GPU 可以帮助完成一些小步骤(比如 YUV - RGB 颜色转换),而当解码过程都有 GPU 参与(即使 GPU 没有负责全部解码过程)时,视频加速就可以被称为硬解码。就算显卡支持硬解码,各显卡的硬解能力和适用范围也不同。

播放机:播放器,必不可少的东西,现在一般都用支持外部/第三方分离器、解码器的播放机,常用的有 Media Player Classic、KMPlayer、BSPlayer(Windows Media Player 和 RealPlayer 虽然也支持外部/第三方分离器、解码器,但是播放机无法作出针对自身的“分离器/解码器设置”,也没提供针对整个操作系统的“分离器/编码器设置”工具)。大多播放机都有以下几个方面的设置——文件扩展名绑定(文件格式关联)、渲染器(呈现器)设置、视频加速设置(包括 DXVA 开关)。

Splitter:分离器,根据视频文件的封装形式(文件格式)将文件解除封装,获得独立的视频流和音频流编码。

Decoder:解码器,将视频流或音频流的编码还原成系统自身能读懂的信息流。解码是最耗 CPU 的过程,所以才会产生硬解码让 GPU 来替 CPU 完成一些 CPU 本不擅长(依赖软件模拟)的计算。硬解码效果的好坏不止是受显卡和显卡驱动的影响,也受着解码器能力的影响(很多老解码器根本就没硬解码方面的功能);而解码器本身调用 GPU 硬解码的能力又会因为不同 GPU 生产商而不同,这是一种搭配机制。

Renderer:渲染器,也叫呈现器,视频必须经过渲染才能正常输出。Windows 平台上的视频文件都可以用 DirectShow 与 DirectSound 的渲染器来渲染;MAC 平台上的视频文件(QuickTime),可以用 Windows 上的 QuickTime 软件(由苹果公司提供)来渲染,也可以调用 VMR(视频混合渲染器)的基于 DirectX 的分配传输器来渲染(需播放机支持);RealMedia 的视频本来就是跨平台的,渲染设置和 QuickTime 类似,而且 RealMedia 播放组件自带的渲染器在 Windows 平台上本身就可以设置成 DirectShow 模式,所以比 QuickTime 更灵活,不是一定需要播放机支持。

字幕插件:很多播放机都集成内部字幕插件,但是由于显示字幕的原理不同而出现不同的结果,比如,Media Player Classic 就只能在 VMR (Renderless) 渲染下才能用内部字幕插件而 KMPlayer、BSPlayer 不是;至于外部字幕插件,最常见的就是 Vobsub 了,但是 Vobsub 使用时播放机将无法进行硬解码(即使 DXVA 开启的一般条件都满足)。

Filter:滤镜,也叫过滤器。广义上,滤镜是从视频文件到生成最终图像、声音所用到的所有加工工具,包括 Splitter、Decoder、Renderer、字幕插件、音频切换器,还有一些比如色彩再调整等工具在内;狭义上,播放机为了播放视频文件,中间过程中调用的所有的独立插件(不包括无法独立于播放器主程序的)。

 

  通常计算机用户只关心前四项,这四项是软件供应商和硬件供应商给你准备好的,在购买产品时已经可以得到;后面的项目,却是需要计算机用户自己安装或设置的,而这些恰恰是需要专业知识的。以下就对播放机和各滤镜进行详细介绍。

一,视频播放流程:

1,文件操作:
方法一:双击视频文件——系统根据文件扩展名找到对应播放机(用户可自设关联)——播放机读取文件数据
方法二:运行播放机主程序——在菜单里用“打开”等命令选择视频文件(或将文件拖入播放机界面)——播放机读取文件数据

2,数据流分离:
(1),播放机调出此文件扩展名所相关的首选分离器序列并作出选择:序列有内容的话总是选择第一项,没有的话就进入下一步,否则完成此步骤后直接到步骤(4)。首选分离器,用户可自设关联,一般是只能使用外部分离器,但是数目上限和排序方式对于不同播放机有可能不同。
(2),播放机调出此文件扩展名所相关的内部分离器序列并作出选择:序列有内容的话总是选择第一项,没有的话就进入下一步,否则完成此步骤后直接到步骤(4)。内部分离器,用户可自设关联,一般对于每种文件格式(扩展名),就只有一个内部分离器,用户只能选择是否开启。
(3),播放机调出此文件扩展名所相关的系统分离器序列并作出选择:序列有内容的话总是选择第一项,没有的话就停止播放、报错,否则完成此步骤后到步骤(4)。系统分离器序列里只有外部分离器,因为是对整个系统起效的,包括很多视频转换软件。外部分离器,用户可自设关联,但是设置比较麻烦,可以用一些工具软件,也可以在各过滤器自带的设置选项中绑定文件扩展名。数目上限和排序方式由操作系统决定。
(4),播放机用分离器分离出视频文件的视频流与音频流,甚至特定的字幕流(极少使用)。

3,视频流解码:
(1),根据此视频流所用编码名称(以 FourCC 判别),播放机调出与此编码所相关的首选解码器序列并作出选择:序列有内容的话总是选择第一项,没有的话就进入下一步,否则完成此步骤后直接到步骤(4)。首选解码器,用户可自设关联,一般是只能使用外部解码器,但是数目上限和排序方式对于不同播放机有可能不同。
(2),根据此视频流所用编码名称(以 FourCC 判别),播放机调出与此编码所相关的内部解码器序列并作出选择:序列有内容的话总是选择第一项,没有的话就进入下一步,否则完成此步骤后直接到步骤(4)。内部解码器,用户可自设关联,一般对于每种编码(FourCC),就只有一个内部解码器,用户只能选择是否开启。当然,一个解码器可能解几种编码。
(3),根据此视频流所用编码名称(以 FourCC 判别),播放机调出与此编码所相关的外部解码器序列并作出选择序列有内容的话总是选择第一项,没有的话就停止播放,报错,否则完成此步骤后到步骤(4)。系统分离器序列里只有外部分离器,因为是对整个系统起效的,包括很多视频转换软件。外部解码器,用户可自设关联,但是设置比较麻烦,可以用一些工具软件,也可以在各解码器自带的设置选项中绑定编码名称(FourCC)。数目上限和排序方式由操作系统决定。
(4),播放机用解码器将视频流转化为 YUV、RGB 之类颜色数据。若播放机有截图功能,就可以从这里获得图像数据;若此时视频硬解码成功开启,则输出数据有所不同,例如输出为“DXVA”数据。

4,图像过滤:
  播放机调用独立的滤镜将解码器送出的颜色数据进行过滤操作,最典型的例子就是外部字幕插件。

5,图像渲染:
  播放机调用操作系统或自身提供的渲染器,对之前处理完的数据进行渲染后成为正式图像输出到显示设备上。Windows 操作系统提供的 DirectShow 视频流渲染模式如下:
  Old Renderer:旧式渲染器,显示名为“Video Renderer”,Windows 98、Windows Me、Windows 2000 默认的视频渲染模式,在 Windows XP 及之后的系统上极力推荐不要使用。此渲染器优先使用 DirectDraw,并尽量运行于覆盖模式,如果显卡对 DirectDraw 的特性支持不够好,则会使用 GDI 来绘图。
  Overlay Mixer:覆盖合成器,一般与 Old Renderer 一起运行(此时 Old Renderer 只是一个视频窗口管理器),但是效果明显要好。总是渲染于覆盖模式,通常只允许 YUV 格式(不过可以输出 DXVA 数据),但它可直接被传输而不将色彩转为 RGB(起到了视频加速作用),是渲染模式中最快的,对硬件需求也不高,并且是 Windows XP 时代唯一可确定的激活全屏视频镜像到电视输出的渲染模式。缺点是因为软件过程没有产生 RGB 数据,所以播放机无法截图。
  VMR-7 (Windowed):Video Mixing Renderer Filter 7 Windowed,视频混合渲染器 7 窗口模式,Windows XP 默认的视频渲染模式,稳定且仅略慢于“Overlay Mixer + Old Renderer”,使用 DirectX 7 的 DirectDraw,并尽量运行于覆盖模式。Windows Media Player 9、10 可以设置自己在使用 VMR-7 (Windowed) 的时候是否启用覆盖。
  VMR-9 (Windowed):Video Mixing Renderer Filter 9 Windowed,视频混合渲染器 9 窗口模式,使用 DirectX 9 的 Direct3D。它具有与 VMR-7 (Windowed) 相同的能力,但使用 Pixel shader 而不使用覆盖。对于只支持 DirectX 7 或 DirectX 8 的显卡,使用此渲染模式速度会较慢;但对于完全支持 DirectX 9(Pixel shader 2.0)的显卡来说,效果会比使用 VMR-7 (Windowed) 更好。
  VMR-7 (Windowless):Video Mixing Renderer Filter 7 Windowless,视频混合渲染器 7 无窗口模式,和 VMR-7 (Windowed) 类似,但不加载窗口管理组件。这种模式适用于:播放机等应用程序正在播放的图像信息被另一个应用程序调用时,前者自身对视频的渲染。
  VMR-9 (Windowless):Video Mixing Renderer Filter 9 Windowless,视频混合渲染器 9 无窗口模式,和 VMR-9 (Windowed) 类似,但不加载窗口管理组件。这种模式适用于:播放机等应用程序正在播放的图像信息被另一个应用程序调用时,前者自身对视频的渲染。
  VMR-7 (Renderless):Video Mixing Renderer Filter 7 Renderless,视频混合渲染器 7 无渲染模式,操作系统的视频混合渲染器并没有自己来渲染,而是调用了播放机等应用程序指定的分配传输器(Allocator-presenter)完成渲染。这种模式下,播放机等应用程序可以自己创建和控制自己的 DirectDraw 表面。But by plugging in a custom allocator-presenter, an application can obtain direct access to the video bits and completely control the rendering process.  Media Player Classic 在 VMR-7 (Renderless) 下使用的分配传输器包含内部字幕插件,能在没有外部字幕插件的时候加载字幕。
  VMR-9 (Renderless):Video Mixing Renderer Filter 9 Renderless,视频混合渲染器 9 无渲染模式,操作系统的视频混合渲染器并没有自己来渲染,而是调用了播放机等应用程序指定的分配传输器(Allocator-presenter)完成渲染。这种模式下,播放机等应用程序可以自己创建和控制自己的 Direct3D 表面;VMR-9 不会自动加载自己的合成器组件。But by plugging in a custom allocator-presenter, an application can obtain direct access to the video bits and completely control the rendering process.  Media Player Classic 在 VMR-9 (Renderless) 下使用的分配传输器包含内部字幕插件,能在没有外部字幕插件的时候加载字幕。
  EVR:Enhanced Video Renderer,增强型视频渲染器,Windows Vista 时代出现的渲染器,分为 EVR media sink 和 EVR filter 两个版本,真正用于 DirectShow 渲染的是后者。EVR 支持 DXVA 2.0,不使用覆盖。
  常见的第三方视频渲染器有 Haali 视频渲染器与一些播放机自己集成的渲染器。有的渲染器被用于 OpenGL 环境下工作。

6,音频流处理
  在视频流经历着步骤3——5的同时,音频流也经历着类似的处理过程,只是音频解码后的过滤最常用到的是音频切换器(当同时从两个或两个以上音频流获得音频时,可以选择播放哪个或哪几个音频,注意,是音频流,不是声道)。DirectShow 的音频渲染模式不多。

 

  最后,圣堂总结一下两个最常见的问题。理论上要能播放某视频,播放机就要有对应的分离器、视频解码器、音频解码器,而且都要设置好;要做到正常播放,还要选好渲染模式。要想硬解码视频流,条件就更多了——系统或应用软件里有支持硬解码的 API,计算机安装了支持硬解码这些编码的显卡,挑好适合的显卡驱动并没有关闭硬件加速开关,使用了不会影响硬件加速(有硬件加速开关的话开着)的播放机,解码器设置好并能且开启硬件加速,显卡、播放机、分离器、解码器、附加过滤器、渲染模式都要互相完美兼容。