转自: http://hi.baidu.com/cankyo/item/aeb8ed10740996423b176e6d
深入DIY,打造超苗条绿色REAL播放器
自从Real视频编码(RM和RMVB)出现后,就立刻以其优秀的播放效果和便于传递的特性风行全世界。可是,它的官方播放器——RealPlayer/RealOne Player却一直在走当年Winamp发展的老路:快速、小巧和占用资源少的特点正在失去,取而代之的则是软件变得臃肿、花哨,而且非常占用资源。特别是继推出RV9(即RMVB)编码格式以后,RealNetworks又推出了RV10+RA10编码格式,并且借着升级编码格式的风头,强行推出新的播放器。新的播放器(RealPlayer 10)的界面的确很漂亮,但是加载速度非常慢,还未播放就要占用将近40MB的内存,新增加的网上购买CD等功能对国内用户而言,完全就是花瓶……RealPlayer与我们“更小”、“更省”的软件使用思路背道而驰。对此,当然要发挥DIYer的精神,彻底摸透Real流媒体的播放原理,然后打造出使用系统自带的Windows Media Player 6.4(以下简称WMP 6.4)就能播放Real视频编码格式的播放器(见图1)!而且,千万不要认为我们做的这个播放器就是网上盛传的MyMPC,实际上它与MyMPC有本质的区别,而且占用资源比MyMPC更少,运行更流畅!好,下面就从RealPlayer的播放原理开刀吧!
一、探寻RealPlayer的播放原理毫无疑问的是,如果仅仅把RealPlayer安装目录中的文件拷贝出来,然后逐个删除以达到“减肥”的效果,那绝对是不可取的。一来直接拷贝出来的文件在新的系统中根本不能用,二来就算手动注册其中的DLL、OCX等文件,也无法让播放器缩小到1MB(总不能把主程序也删了吧)。因此就要转换思路,首先必须搞清RealPlayer是如何工作的,这又分为两个步骤:首先是把RealPlayer的关键文件全部找出来,然后再弄清这些关键文件是如何播放媒体文件的,从而寻找与WMP 6.4结合的切入点。
1.搜索RealPlayer的关键文件首先在一个“干净”的系统(Windows XP)中安装RealPlayer 10,看看它到底向系统中安装了哪些文件。通过比较后发现RealPlayer在系统System文件夹中访问或改写了10个文件,分别为:KERNEL32.dll、USER32.dll、GDI32.dll、comdlg32.dll、ADVAPI32.dll、SHELL32.dll、ole32.dll、pnCrt.dll、pnui3260.dll和VERSION.dll。这其中有一些是显而易见的Windows核心文件,那么除此以外,哪些才是RealPlayer的重要文件呢?用排除法去掉KERNEL32.dll、USER32.dll、GDI32.dll等系统进程后,很容易发现pnCrt.dll是最可疑的。根据RealNetworks官方网站对这个文件的注释,它实际上是“Real Networks C/C++ Runtime Library”(即Real运行库),主要用来控制屏幕显示,并且会调用pnui3260.dll来控制网络流媒体。而且,这些DLL插件基本处于RealPlayer安装目录中的“Plugins”或“Common”目录下,进一步证明了我的猜想。应用思路★一个软件应用高手至少应该知道必要系统进程的相关文件都有哪些,如系统内核KERNEL32.dll、用户资源USER32.dll、界面资源GDI32.dll等。这部分内容可以通过阅读本刊的“系统应用”栏目来补充,比如2004年第5期的《为有源头活水来——让系统资源不再短缺》就详尽地说明了USER32.dll与GDI32.dll的作用。★很多软件的安装目录中都具备一个“Plugins”文件夹,这里面的内容绝大多数都与软件功能相关。有的是重要功能,有的是次要功能,但可以肯定的是,在不影响程序稳定的前提下,增加插件可以丰富软件的功能,减少插件则可以提高软件的运行速度。
2.揭开RealPlayer媒体播放之谜接下来,我们要看看RealPlayer是怎么播放媒体文件,也就是如何解码的。找到RealPlayer的安装目录,会发现里面有一个“RealCodecs”目录,里面有一堆DLL文件如14_43260.dll、28_83260.dll等。通过排除法就可以确定就是这些文件来解码不同的Real压缩格式,比如一个用来解码RV10压缩格式,一个则用来解码RA10。除了解码目录外,还有形如“Plugins”之类的目录,很容易就可以证明这里面的动态链接库是用来支持网络Real流媒体的,对于这些文件,我们可以放心大胆地舍弃,因为我们的目标是使用WMP 6.4来打造最小的播放器,而WMP 6.4是不支持那些花哨插件的。到这里我们就可以基本上肯定Real播放器的播放流程了,正如下面的示意图所示:pnCrt.dll调用自己的接口来通知Real播放器,然后调用解码器和其他插件进行解码和合成,最后将最终结果发送到屏幕上(见图2)。
二、RealPlayer与Media Player整合计划在搞清楚了Real播放原理以后,我们的目标就放在WMP 6.4上了。谁叫它是最小、占用资源最少、又最稳定的播放器呢,正好符合我们DIYer“吝啬”的特征。在Windows 98/2000中,系统自带的播放器就是WMP 6.4;如果你用的是其他操作系统,又或者安装了高版本的Windows Media Player,WMP 6.4就会被更名为mplayer2.exe,放在\Program Files \Windows Media Player\目录下。首先,将Real的解码文件(RealCodecs目录)分离出来,放到自己规定的目录下,并且更改注册表中的指向,将其指到自己的目录下:[HKEY_CLASSES_ROOT\SOFTWARE\RealNetworks\Preferences\DT_Codecs]@="C:\\自定义目录\\RealCodecs"[HKEY_CLASSES_ROOT\SOFTWARE\RealNetworks\Preferences\DT_Common]@="C:\\自定义目录\\RealCodecs"[HKEY_CLASSES_ROOT\SOFTWARE\RealNetworks\Preferences\DT_Objbrokr]@=" C:\\自定义目录\\RealCodecs"其次,我们需要一个组件,能够接管pnCrt.dll的命令,同时又能够为MMP 6.4所调用。有这样的组件吗?当然有!在Media Player Classic(MPC)中,有一个仅125KB的控件RealMediaSplitter.ax。注册该控件后,在WMP 6.4调用自带的mediaplayer.ax不能解码Real文件的情况下,WMP 6.4就能够自动寻找到RealMediaSplitter.ax,由它来接管pnCrt.dll发出的请求了。所要说明的是,这个组件最好和pncrt.dll一起放在系统System32下才能起作用,因为这样注册和卸载起来才显得更简单,我们不妨把它写成批处理文件来执行。安装.batcopy RealMediaSplitter.ax %SystemRoot%\system32regsvr32 %SystemRoot%\system32\RealMediaSplitter.ax卸载.batregsvr32 RealMediaSplitter.ax /udel %SystemRoot%\system32\RealMediaSplitter.ax现在应该可以用Windows Media Player 6.4放RMVB文件了。为了更方便起见,我们将RMVB和WMP 6.4关联起来(在“文件夹选项”的“文件类型”下更改),这样系统默认就使用WMP 6.4来播放RMVB文件。怎么样,是不是很有成就感呢?我们的播放器非常小巧,包括解码文件在内,打包后才1MB大;又绿色,我们可以随时加载、随时卸载,也没有在注册表内写什么垃圾;占用资源又少,播放时才占用不到15MB内存,比RealPlayer 10未播放时占用的还少(见图3);同时还支持最新的RV10+RA10编码格式!你还在犹豫什么,赶快行动吧!