搜索 社区服务 统计排行 帮助
  • 4037阅读
  • 1回复

[本作] RAR解码器(源滤镜)

楼层直达
级别: 新手上路
注册时间:
2013-12-15
在线时间:
3小时
发帖:
4
本过滤器用于帮助解决播放RAR压缩档案中的媒体文件,以文件源的方式导出给其它DirectShow分离器/解析器、以及带此类功能的解码器使用。
简单说,就是让你可以不用把RAR中的内容解压到硬盘,就可以播放其中的文件。

最新的MPC-HC早有对RAR档案的支持,但仅限于没有压缩比的文件。此过滤器插件没有这样的限制。

在任何情况下,此插件都不会创建文件来缓存解压数据,全部操作只在内存中完成。
也不会使用等空间的内存来存储解压文件,(在文件大小不超过某值的时候的确是这样),
根据实际的文件和档案特性来选择策略,后面有一个播放5G以上文件的测试截图,实际占用只有1/4。

本插件主要以MPC为准测试播放器,内部有针对MPC做了一此调整,比如额外的缓冲时间,预缓冲等,具体见后面的测试篇。

文中提到带有“本”或“此”开头的过滤器、插件、滤镜、分离器、解码器都是指同一个东西。
还有图中红色细框是作者手工用画图工具标上去的。

[配置说明]
操作系统:64位系统
内存需要:使用500M以上,建议至少4G。
   CPU  :根据具体情况而定
解压版本:2.9

在文件(解压以后的)大小小于150M时,或者此文件没有压缩比(即存储模式)时,无CPU要求。
除此以外,如果要流畅的同步播放,至少要求CPU双核以上,否则咱是不能保证你机器会有多卡的。
另外,在这种情况下,是通过CPU来换取内存耗用的,因此CPU慢的,需要更多的内存。反之消耗内存也少。
我这边的内存占用约为1/4文件大小,在文件不太大时这个值是不明显的,因为过滤器本身的缓存就有100M了。


[安装说明]
执行regsvr32命令,或者运行压缩包中的install.bat。

默认只配置有mp4播放,要增加其它播放的文件类型,请在解码器目录下创建PFileExt.ini文件,
然后将需要支持的文件后缀名加入到其中,一行一个,不带点号。如下

引用
mp4
mkv
avi
mp3


[版本说明]
当前版本是一个最简单的测试版本,
1. 没有配置界面
2. 支持内部文件选择列表
3. 不支持自动切换到下一个文件播放
4. 支持内部同名字幕挂载
5. 不支持内部同名音轨导出
6. 不支持加密档
7. 不支持固实档
8. 不支持压缩分卷
9. 不支持自解压档
10. 支持非.rar后缀名的RAR档案

后面版本的考虑
1,3,5仅作考虑,但此版本基本不会怎么变了,除非有大的BUG或有好的建议并且有一定的需求人数。
另外说明一下,这里的BUG必须是稳定的BUG,因个别(除MPC以外的)软件出现的兼容性问题是不会处理的。

[使用说明]
任何支持DirectShow回放框架的播放器都可以使用此插件。
如果你使用支持RAR档案的MPC播放器,可以考虑在配置界面中关掉原有的内建RAR支持(非必须),否则你在播放RAR文件弹出的文件列表时,点取消就行了。

如果你打开RAR无法播放,请确认有无以下原因:
1. 压缩文件是否有是固实(Solid)压缩选项。
2. 是否在PFileExt.ini中配置了要支持的文件扩展名。
3. 再次检查压缩文件是否有密码、有分卷信息、有自解压(SFX)选项。
4. 检查文件解压版本是否为2.9。
4. 检查此文件是否是真的RAR档案,而不是被重命名的zip/7z等文件。
除2以外,其余都可以从WinRAR的档案属性中去确认。


打开较大的文件时,需要一定的缓冲时间,这个缓冲时间是作者自己加上去的,其中一部分根据机器性能而定的缓存数据时间,另一部分是固定的交出CPU时间给
解压线程(1s/GB)。原因在于播放器需要同步视频和音频时间,而RAR可以看成是加密流,是不便于随机访问的,虽然本解压库实现了随机访问,但无法做到准实时,一旦视频流数据到达的时间慢了就会陷入无限追赶时间轴的窘境,造成的结果就是看视频很卡的样子。因此,大文件需要靠强大的CPU支持才行,也是这个原因。
第二个原因是MPC造成的,当MPC从源读取数据时,发现数据太慢它便自已到磁盘上去打开那个文件来缓冲数据,像下面这样

但这货根本不知道它读的是一个压缩包文件,而我(源过滤器)传给它的是里面的MP4(假设)文件流。这个情况很糟糕,严重时会笋尖耗掉机器内存,可能会使你正在运行的其它程序出错也说不定。
虽然插件中已做了延时的应对策略,但也无法完全保证这种情况不会出现。一旦发现MPC缓存数据,请果断右上角×掉它。

还有一种情况是,用MPC打开文件后,发现总时间是0,也就不会播放文件了。这种情况通常出现于TS/VOB等类型的文件,因为它们无法确定总共的视频时间,能读多少算多少,而且在RAR中播放这类文件时,时间轴总是错误的,MPC并不会即时的去更新总时间。虽然如此,但是MPC是可以让你拖进度条的,拖的时候却能按当前总时间的百分比来定位,但显示的时间还是原来错的那个。
这种情况我现在已经找不到了,所以就没法截图了。


[相关测试]
1. 某5G以上压缩文件的播放,这种文件不太好找,之前随便找了个Miku39的Live,大小是达到了,但是由于2pass的AVC对rar来说,根本没有压缩比。要知道rar对于没有压缩比贡献的文件会采用直接存储的方式,这样就达不到这里测试的目的了。咱很蛋疼的2个小时等了一场梦TAT。
这里选的是TH2VAD里的某BDISO中拽出来的m2ts文件,通常这类文件是肯定会有压缩率的,但很多好像是切成了小片(BDISO接触不多,不是太确定)。

打开文件大概花了20秒,播放RAR时,MPC显示的视频大小是rar文件的大小,图中2、3是相同的。真实视频文件的大小是1处左边的那个。
播放过程中,内存会不断增长,CPU持续高占用,此图中显示的是CPU稳定后的大小。稳定后内存占用也基本稳定,此后再怎么也不会卡的了。

2. 某内封字幕,只要把视频文件和字幕文件打包在一个压缩包内,并保持相同文件名即可。

仅支持ASS/SSA的字幕格式。支持无BOM编码。

3. 格式支持,本插件没有格式限制,只需在配置文件(PFileExt.ini)中配好后缀名就可以了,剩下的工作就是播放器和其它解码器的事情了。
其实本作品在决定之前,此功能库是为了另一个需要而去搞的,因为本身对视频文件的压缩效果并不会有多好,而且尺寸大码率高多流,再加上MKV这样带字幕轨的,将大大增加文件随机访问的频度。相比之下EAC档案则没有这此顾虑,而且rar作为固有的EAC的档案容器,其原因并不在于它是否有多高的压缩比,而是在于rr后面的那个数字。残念的是,每次都得从中解压出来播放,这让吾等EAC狂人燃起了必攻略之的决心。
在解决了RAR问题之后,其实路还有很长,比如CUE如何应用,这个在作为解码器插件的角度来看不太容易搞定。不仅如此,吾等还想直接就能看到Cover,甚至浏览到BK。这个,我想除了自已搞定播放器没有其它办法了吧。(嗯,就这么愉快的决定了,,,)

当前的版本已经可以从RAR中播放无损档了,但要注意的是,MPC本身是不支持的,即使是RAR中的WAV格式它也不认。你必须安装一个支持raw输入流的分离器,好在目前的LAV Filter全部都支持了。


[补充说明]
先来科普一下吧
    固实的压缩文件,所谓固实,就是结构紧凑的意思。RAR固实档案即是将所有文件的内容全部拼起来,当一个文件去压缩。这种格式的压缩档,如果要解压其中一个文件,就要从第一个文件开始,一个一个解完才能找到你要解压的文件在哪。好处在于增加了文件内容的关联性,有可能提高压缩率。因为这种结构,使得在RAR固实档中定位变得相当困难,所以这种格式的RAR档案不可能被支持。
    很多人会因为名字的原因,把RAR固实档理解成更加可靠,更加安全。同样的,RAR压缩中有一个“保存文件安全数据”的选项,有些人看到也会瞎点。这里的安全数据是指一种与文件权限有关的文件属性,用于限制一台机器上不同用户对文件访问,跟文件内容也搭不上干系。对于普通个人用户,这个选项除了增加点压缩包的体积外,别无用处。真正能起到可靠安全作用的,RAR中只有恢复记录。

    然后是标题,“本作”的意思是本人所作,由于个人10分讨厌“原创”两个字,故用此代之。
    最后,说明一下本作品保留发布x86版本的原因,主要是因为32位系统的内存是受其地址空间限制的,最大4G(嫑跟我扯PAE),在Windows中32位程序通常只被分到2G的用户空间。而此过滤器主要就依赖较多的进程内存和前期的CPU消耗,这允许你在一个比较大的压缩包中尽快的浏览视频和音频,如果不是为了这个,一般MPC自带的RAR源已经能应付一些了,再者不大的文件直接从RAR中解压出来也用不了多长时间。如果说32位内存限制可以通过文件缓存来解决,那我肯定不会这么去做,因为本过滤器承诺的是零写入(writeless),如果要通过文件的话就意味每次播放都要往磁盘上解压一遍,这样对硬盘比较伤,我宁愿先解压一份放在边上,空间不够再删。因些,它在32位上并不实用。其实前面也说了本身对视频也不太实用,并且绝大多数视频都不会用RAR包来发布,咱主要用来看看MAD什么的。嘛,就做到这了。。

没有上传权限T_T,各位有需要的,请来这边下吧:
  1. http://forum.doom9.org/showthread.php?t=169855

方便的话,还请管理给个上传权限,或者帮忙下了传一下也行。

级别: 新手上路
注册时间:
2013-12-15
在线时间:
3小时
发帖:
4
只看该作者 1楼 发表于: 2013-12-17
保留
他用
快速回复

限150 字节
上一个 下一个