理解了DirectShow播放原理

来源:互联网 发布:sql2000备份50g数据库 编辑:程序博客网 时间:2024/06/03 13:09

http://blog.sina.com.cn/s/blog_4137eb6101009oha.html


在这个“BT”的时代我们为什么“BT”,相信绝大多数人是为了看电影,要知道看电影可是我们当初下决心买电脑、装宽带的一个重要原因啊!可是“BT”下来的电影有些也非常BT:千奇百怪的格式还带有千奇百怪的问题。把人搞得都快要BT了,不过,只要我们能静下心来,研究其原理,分析其症结,平时注意积累经验,做一个播放电影的高手并不难。
一、打通任督二脉──从认识DirectShow起步

  “为什么我下载的电影放不了呢?”“为什么放电影时只声音没有图像?”“为什么放电影时只有图像没有声音?”“为什么我在播放电影时,图像异常呢?”“为什么播放的电影声音有杂音呢?”

  类似的问题在各个论坛里出现的频率非常高,对于这样的问题,如果排除掉电影文件本身的问题,我们需要从播放器和解码器两方去找原因。

1、了解播放器的类型

  播放器大至可分成二种类型:封闭型播放器和基于DirectShow播放器。前者有一套自己专用的解码器,播放器通过它们来进行播放;后者则依赖系统中的DirectShow解码器进行播放,这些解码器是通用的,一般是由发布该种媒体格式的组织所开发和提供的。封闭型播放器以超级解霸、Mplayer、Winamp、QuickTime Player为代表,优点是较少受系统的影响,很少出现兼容性的问题,缺点是不方便扩充对新媒体的支持;基于DirectShow的播放器的数量众多,Windows Media Player、Media Player Classic、BSPlayer、ZoomPlayer都是这一类播放器,他们的优点是支持的格式丰富,扩充方便,但易受系统的影响,尤其是某些多媒体软件会替换掉系统中的部分解码文件,造成某些格式不能播放,或者播放不正常。从目前的趋势看,基于DirectShow的播放器无疑占了主流,部分封闭型播放器也开始在一定程度上支持DirectShow播放。

  如果用封闭型播放器,发现不能播放的电影,一般没有太多的办法,除非开发者提供了新的播放插件(也有第三方的开发的插件)。而基于DirectShow的播放器要方便一些,只需要安装相应的DirectShow过滤器就行了,但实际情况是复杂的,特定的媒体解码所需的DirectShow过滤器有多种,其中任何一个环节出了问题都会导致播放出现异常。有些情况下某种格式的电影不能播放,或者播放异常,并不是简单的重装解码器就能解决的,所以,我们必需对DirectShow播放原理有一定的认识。

2、理解DirectShow播放原理

  DirectShow属于DirectX技术的一部分,它规定了用什么样的过滤器来处理媒体数据,过滤器主要有源过滤器(Source filter)、转换过滤器(Transform filter、表现过滤器(Renderer filter)三种。

(1)源过滤器用来从数据源(如摄像机、因特网、磁盘文件等)获取数据;

(2)转换过滤器用来获取、处理和传送媒体数据,它包括分离视频和音频的分离器(Splitter filter)、解压缩视频数据的视频解码器(Video Decoder filter)、解压音频数据的音频解码器(Audio Decoder filter);

(3)表现过滤器用来在硬件(如显示卡和声卡)上表现媒体数据,它包括用来显示图像的视频表现过滤器(Video renderer filter)、将音频数据送到声卡上去的音频表现过滤器(Audio renderer filter)。

  图表1~图表4是几种常见视频媒体的解码过程,对于其它媒体文件的处理流程,我们可以使用GraphEdit(下载地址:http://www.shooter.com.cn/?softid=graphedit&site=1)来查看。理解了DirectShow播放原理,意味着我们的已经打通了任督二脉,内力大增,接下来就要利用这些知识去解决播放中碰到的实际问题了。









二、练就乾坤大挪移──利用DirectShow分析解决问题

  了解了DirectShow播放原理,要判定故障就比较好办了。在源过滤器、转换过滤器、表现过滤器当中,最易出现问题的就是转换过滤器中的分离器及解码器,有些时候表现过滤器也会出现问题。对于过滤器的问题,我们依据可DirectShow的原理,使用乾坤挪移********这些过滤器进行加、减、换。

1、点穴不能播放的电影

  某种格式的电影无法播放,多数情况是下是系统没有安装相应的分离器,或分离器版本有问题。MKV Splitter、RealMedia Splitter、3ivx D4 Media Splitter是播放器实现对MKV、RM/RMVB、MOV视频回放的关键,不过这些分离器都已经包括在《暴风影音》工具包中了,出现了问题只需要重新安装就行了。

  一旦碰到一种比较少见的或全新格式的视频文件,你也只需要去发布这种格式的官方网站,下载并安装这种格式的分离器就行了。如《暴风影音》没有提供支持的MP4、MPC、XCD等封装格式。分离器的英文名称除了Splitter外,Parser、Demultiplexer也是其常见的名称。

2、化解无声无色的招术

  虽说大音稀声,大相无形,但播放电影时有图像没声音或者有声音没图像,却是让人心烦的事。出现这类问题多数是系统中缺乏相应的音视频解码器。出现了这种情况,可先用GSpot(下载地址:http://www.headbands.com/gspot/gspot221.exe)对视频文件进行分析,以确定视频文件中使用了哪种视频和音频编码。

  运行GSpot,导入要查看的媒体文件,媒体文件的视频及音频编码信息就会出现在相应的栏目中(图5),如编码类型、码率、分辨率等。如果想要了解Windows是怎样调用过滤器来处理媒体文件的,可以点击下面的“Render”按钮,详细的处理过程就会显示出来。


  对于播放时没有声音的视频文件可根据GSpot的提示安装相应的音频解码器,对于播放时没有图像的视频文件则安装相应的视频解码器。

3、破解图像异常的经验

  播放时图像可以出来,但出现闪烁或色彩异常的情况,这有可能是视频解码器或视频表现过滤器不正常造成的问题。这样的问题多出现播放DivX/XviD及MPEG文件时,因为这两种视频可使用多种解码器进行解码,并且MPEG文件对表现过滤器有较高的要求。

(1)DivX文件可使用ffdshow Decoder和DivX Decoder进行视频解码,XviD文件则可使用ffdshow Decoder、XviD Mpeg-4 Decoder及DivX Decoder进行解码,但如果系统中的解码器版本太老,或用于解码的解码器与系统中的硬件不兼容,就有可能出现闪烁、甚至黑屏等播放异常等情况,解决的办法一般是安装新版本的解码器,或更换不兼容的解码器。如果要更换解码器可使用《暴风影音》附加工具中的“DivX/XviD解码切换程序”。通过这个小工具你可以设置哪种编码用哪种解码器(图6)。


(2)MPEG文件播放时对视频表现过滤器有较高的要求,在系统目录System32文件夹下的quartz.dll文件即为表现过滤器,这个文件同时还是MPEG-1、Midi解码器,如果这个文件有问题,可能在播放MPEG文件时出现色彩异常的现象。这通常是由于quartz.dll文件损坏或被一些自作主张的软件替换了,解决的办法是从正常的系统中复制一个quartz.dll文件,将原文件替换掉。

4、故障判定的必杀技──GraphEdit

  虽然说了这么多,但实际情况是复杂的,有时候我们确实非常难以判定故障是由于什么原因造成的,这时候我们可以祭出我们的终极法宝──GraphEdit。

  GraphEdit是Microsoft的可视化DirectShow过滤器检测工具,如果播放时发现问题,可用来它来判定故障出现在解码当中的哪一个环节。下面我们以一个实际的故障为例讲解如何用GraphEdit来判定故障。故障现象是在播放MPEG文件时播放器出错退出。

(1)判定是解码器的问题还是播放器的问题

  在GraphEdit窗口的工具栏中选择“打开”按钮,在“打开”对话框中的“文件类型”处选择“所有文件”,并导入出现故障的电影文件。如果电影可顺利导入,说明相关的分离器、解码器齐全。文件导入成功后,你可以看到该文件的处理流程。此时可点击“播放”按钮,如果播放时影音均正常,说明问题与任何过滤器无关,需要从播放器找原因。但此时按下“播放”按钮后,刚弹出播放窗口GraphEdit即出错退出,显然在是过滤器的某个环节出现了问题。


(2)判定故障点

  再次运行GraphEdit,导入原来的文件,仔细检查文件的处理流程,你可以发现有两个过滤器不是必需的:“Bicubic Video Resizer(用于优化播放画面)”、“DirectVobSub”,可选中“Bicubic Video Resizer”框,按Del键将其删除,然后从“DirectVobSub”的“XForm Out”直接引一条连线至“Video Renderer”,再按“播放”按钮,发现能够播放,但声音不正常,出现周期性噪音。显然,MPEG音频解码还有问题。

(3)替换问题解码器

  从图中可以看出音频处理的流程比较简单,系统中使用的是Ligos的MPEG音频解码器,由于这一类解码器比较多,我们可以很方便的用其它的解码器来替换它。选择“Graph”菜单中的“Insert Filters”命令,打开过滤器选择对话框(图4)。在对话框中展开“DirectShow Filters”并选择其下的“MainConcept MPEG Audio Decoder”,单击“Insert Filter”按钮,将其加入到流程图中,删除原来的“Ligos MPEG Audio Decoder”,用“MainConcept MPEG Audio Decoder”替换它的位置。此时播放则一切正常。


  由此,我们找到故障发生的原因是“Bicubic Video Resizer”过滤器造成,而且发现了有问题的音频解码器。对于有问题的音频解码器,我们可重新安装正常的音频解码器并让它取得音频解码的控制权,而出故障过滤器本来就有点多余,可以将其卸载掉。

5、挪走问题过滤器

  卸载有问题的DirectShow过滤器可使用DXman(下载地址:http://www.analogx.com/files/dxmani.exe)。运行DXman,从过滤器列表中找到并选定要卸载的过滤器,单击“Remove”按钮,即可将其请出系统,并且将其中从注册表中清除。


三、精通十八般兵器──小问题一一破解

  练成了盖世的功夫,要在实战中获得较好的效果,还要精通十八般兵器,才能将各种问题一一化解。

1、影音不同步的破解对策

  造成影音不同步的原因可能有多种,不同的原因要用不同的对策。

(1)低配置的播放对策

  电脑硬件配置太低实在是很无奈的事,如果暂时没有条件升级,可使用Mplayer播放器。这个播放器对硬件相求相当低,在赛扬500这种档次的机器就可以流畅的播放高码率DVDRip了,关于这个播放器的介绍请看上期《电脑报》E 版。

(2)更换解码器

  如音频不流畅可以更换一种音频解码器,对于DivX、XviD视频可以考虑换一种兼容解码器,方法前面有介绍。

(3)整理磁盘碎片

  硬盘的碎片过多可能会导致播放不流畅,造成影音不同步。整理一下硬盘往往会有很好的效果

(4)解决设置不当的问题

还有一种同步是由于在VobSub字幕插件中设置了强制帧率造成的,可在播放时双击系统托盘中的VobSub图标,打开其属性对话框,在“同步”选项卡(图10)中,检查是否选定了“强制帧率”复选框,如果选定了可取消它。



(5)视频文件本身音视频不同步的处理

  有些电影是由于制作的原因而造成的影音不能同步,对于这样的文件,如果不想重新编码,可在使用Media Player Classic播放时进行调整。

  在播放时先估计好延时的时间,然后选择“查看”看菜单中的“选项”命令,打开“选项”对话框(图11),从中选择“音频切换器”,并在右边的选定“声音延迟时间”复选框,然后在后面的数值框中输入时间。


2、拨乱反正──字幕乱码的消除

  对于文本字幕出现的乱码,用VobSub简单的设置一下就可以消除,另外我们还可以用它设置字幕的字号、颜色、位置等。双击系统托盘区中的VobSub图标,在属性对话框中选择“主窗口”选项卡,单击“文本设置”栏中的字体按钮,即可弹出“类型编辑器”对话框(图12),选择字体栏中的按钮即可设置字幕的字体、字号,在字体下面的下拉列表中可设置字幕所使用的字符集,简体可使用GB2312或GBK,繁体使用BIG5。通常字幕显示为乱码时是字符集设置不对造成的,可在这里修改。


3、同声相应──字幕不同步的修正

(1)字幕不同步通常是由于字幕的版本与电影不配套,可先去下面这些网站寻找与之相配套的字幕:

射手网字幕库:http://www.shooter.com.cn

新视界字幕站:http://61.139.55.94/dvd/film.asp

TLF字幕站:http://tlfsubs.eastgame.net/

汉风中文字幕库:http://sub.hanstyle.org/

(2)如果没有找到合适的字幕可使用VobSub来修正字幕不同步的问题,在属性对话框中选择“计时”选项卡(图9),然后在“延迟”处的数值框中设置延时的时间,数值可以为负数,为负数的时候当然是将字幕提前。字幕不同步的问题通常要多次修正才会比较满意。


(3)也可以使用subresync(在Vobsub完全版中,下载地址:http://sc-http.skycn.com/down/vsfilter0308.zip)对修正字幕文件中的时间码,以便一劳永逸的解决问题。

  在subresync窗口(图10)中选择“Open”导入要修正的字幕,即可在窗口中看到每句字幕的时间码,选择第一句字幕,修改它的时间,其后的字幕时间会自动根据第一句进行修正。改好后,选择“Save As”保存即可。不过,一次很难达到理想的效果,可进行尝试。


4、面子大是播放器给的──画面不能全屏的修正

  画面不能全屏通常是播放器设置的问题,以Media Player Classic为例,若发现画面不能全屏,从菜单中选择“查看→视频框架→拉伸以填满窗口”问题即可消除。

5、左右逢源──双声道的切换

  很多播放器并没有直接提供VCD的左右声道切换功能,这样给唱卡拉OK带来不便,不过Media Player Classic可使用其自定义声道映射的功能来实现声道的切换。

  在播放VCD时,选择“查看”看菜单中的“选项”命令,打开“选项”对话框(图11),从中选择“音频切换器”,并在右边的选定“启用自定义声道映射”复选框,在其下的声道映射表中,可看到电影中有两个声道,可取消其中的一个声道(单击其中的勾号即可),然后单击“应用”按钮设定即可起效,如果不对,可换一个声道试试。


6、颠倒众生──修正反转画面

  部分老的AVI影片可能会出现画面颠倒的情况,这个问题可用VobSub来修正。鼠标右键单击系统托盘中的VobSub图标,在弹出的快捷菜单中选择“反转图片”,即可将颠倒的画面修正过来。

四、经验的总结

  从播放电影出现的故障来看,多数是由于DirectShow过滤器造成的,但许多人由于不明白原理,一出问题总是把原因推给播放器和音频视频解码器,一味的重装播放器和解码器,结果问题依旧,甚至搞到重装系统的地步。现在我们明白了原理,只要细心分析,同时借助各种工具,就可以把DirectShow过滤器造成的问题一一化解。

  从众多的DirectShow过滤器故障我们可以看到,DirectShow过滤器出现问题通常是因为我们装的视频类软件太多、太滥造成的,所以安装这类软件时一定要慎重,对于版本太老或我们不熟悉的软件能不装就不装。

  另外,有些故障完全是播放器和播放辅助软件设置不当造成的,所以作为一个电影迷应该精通一两款播放软件及常用的播放辅助软件,对其设置做到烂熟于心,自然就可以见招拆招,轻松应对。

  当然,我们这里所讲的没有过多的涉及到电影文件本身的问题,对电影文件本身的问题我们可以用各种方法进行修复,有关的介绍已经相当多了(参见《电脑报》软件版春节特刊),这里就不再重复了。

0 0
原创粉丝点击