推荐强大的外挂解码方案-LAV Filters 解码电影无压力

2020-03-13 09:54发布

在介绍这个东西之前,先简介一下一般影音档在DirectShow架构的播放器播放时的运作过程,首先是读取档案的File source(读取滤镜),将其读取的内容传给Splitter(分离器),前面两者又可合称Source filters(源滤镜)。然后Splitter会将其分离为视讯编码跟音讯编码,将视讯编码传给Video decoder(视讯解码器)做解码,将音讯编码传给Audio decoder(音讯解码器)做解码,然后解码完的视讯内容传给Video renderer(渲染器)渲染后交由显卡输出,解码完的音讯内容则交给音讯装置输出(预设是DirectSound Device )。

若是播放DVD,则源滤镜会使用win内建的DVD Navigator,其他则大同小异。

而今天要介绍的主角LAV Filters,则是一个包含分离器/视讯解码器/音讯解码器三者的外挂解码方案,内容有LAV Splitter、LAV video decoder、LAV audio decoder三者,由DOOM9论坛上的nevcairiel所开发,档案格式支援性高,完整支援各种10bit编码,亦支援DVD及BD的解码(BD的选单则尚不支援),BUG少,功能强大但又实用而不花俏。


以往在MKV档的播放上,也有人推荐Haali Media Splitter这款分离器,可惜其似乎已停止开发,而LAV Splitter在不断改进下,其功能已不输给Haali Media Splitter,而我在预设的状态下去测试也发现LAV在拉动时间轴时的反应时间要快得多,所以我认为现在已可舍Haali Media Splitter而将LAV Splitter做为预设的分离器。

在解码器方面,LAV比MPC-BE内建的更具优势之处个人认为至少有以下几点:

  1. 强大的硬解支援能力,MPC-BE内建的解码器硬解只支援微软标准的DXVA,而LAV video decoder除了支援DXVA外亦支援NV卡的CUVID解码,及Intel的QuickSync解码,此外还支援DXVA -copy back,以及D3D11解码(0.71版加入),这个后面会再介绍。

  2. 10bit、16bit color space的输出支援,可以直接输出如P010、P016等等这些解码完的10bit、16bit color space的内容给渲染器处理,MPC内建输出就只有NV12、YV12、YUV2这些8bit的color space 。(新版本的MPC-BE已能支援P010等等输出了)

  3. 若让LAV直接输出RGB讯号,其内建的Dithering算法亦有极高的转换品质。

  4. 多声道降混频可自由设置Center、Surround及LFE三者的混合比例。

  5. 具备MKV Edition/Ordered Chapters/Segment linking 章节连结/选择功能(0.56版后加入)

上面废话讲了那么多,还是赶快来介绍安装及设置,首先一样到官方讨论页下载最新的版本安装:

http://forum.doom9.org/showthread.php?t=156191

一路点下去就好


安装完后打开MPC-BE,到设定里的"内部筛选器"里,把Source Filters、Video Decoders、Audio Decoders三个分页所有的格式全部取消勾选(依情形也可勾选一些格式与LAV做互补利用)

到"外部筛选器"里,新增图示里的三个,LAV Splitter Source的优先权不更动,其余两个设为"偏好"(Prefer)


在LAV Splitter上点两下可打开设定页,预设如下:

Audio和Subtitles可设定让其优先选择的音轨跟字幕轨(如有需要的话),左下角的Enable System Tray Icon是会让影片播放时在右下角工作列出现一个小图示,右键点一下小图示可选择视讯/音讯/字幕串流切换(影音档内封),也可随时打开这个设定页。


在LAV video decoder上点两下打开设定页,预设如下:

简单介绍一下几个功能,右上角的Hardware Acceleration即是关于硬体解码的设置,预设是不使用(即软解),要开硬解的话则在下拉式选单选择要用的模式:

  1. NVIDIA CUVID,顾名思义是N卡才能用的硬解模式,使用N卡的CUDA视讯解码API,XP及WIN7之后作业系统皆可使用

  2. Intel QuickSync,为Intel内显的硬解API,当然是Intel内显才能使用

  3. DXVA2(copy-back),为微软DXVA2标准的硬解模式,而copy-back指的是将显卡解码完的内容从显卡记忆体中抓回主记忆体,此为较新的模式,好处是能在解码器跟渲染器中间插入后处理滤镜(如ffdshow raw video filter或是xy-vsfilter这类),就如同软解一般。但缺点是CPU占用率仍较传统型硬解(DXVA2(native))高一点,且反应速度会慢一点。这个模式A/I/N三家显卡都能使用,不过因为是DXVA2,所以不能在XP下使用(XP只支援DXVA1) LAV在0.64版之后对DXVA2(copy-back)做了一些改动,当解码→输出格式为NV12→NV12或P010→P010或P010→NV12时这三种情形时会自动套用一个DXVA2 Copy-Back Direct mode,这个模式下解码效率大幅增进,逼近DXVA2(native)的水准。选择此模式时底下的下拉式选单"Hardware Device to use"可以指定解码的显卡,但必须是有启用状态的显卡(可能必须连接萤幕),选择Automatic则是自动挑主显卡解码。

  4. DXVA2(native),微软DXVA2标准的传统型硬解API,是最常见的模式,效率仅次于D3D11 (native),CPU占用极低,A/I/N三家显卡都能使用,XP下不能用。缺点是不能在解码器跟渲染器中间插入任何后处理滤镜,此外,N卡在使用此模式时会有一些chroma的画质损失(copy-back模式则无此问题),解HDR影片也会有一些banding问题。

  5. D3D11,上面的DXVA2是使用D3D9介面,这个则是使用较新的D3D11介面,是目前效率最好的硬解模式(指D3D11 native),而且可以确保得到跟软解完全相同的画质,不会有上面DXVA2(native)提到的一些画质损失状况。但由于D3D11在win7下无法输出NV12跟P010,也就是说这个模式必须win8之后的系统才能使用。这个模式一样有分native跟copy-back,这边的下拉式选单"Hardware Device to use"选择Automatic则是使用native,选择任一显卡则是使用copy-back,但注意native模式必须要渲染器支援才能使用,目前只有madVR有支援,如果不是搭配madVR使用的话都会自动切换成copy-back。而native模式目前madVR也尚未支援硬体去交错,要播interlaced影片的话建议选择任一显卡让它变copy-back就能做硬体去交错。

效率比较:D3D11 native >= DXVA2(native) > D3D11 copy-back >= DXVA2(copy-back)

选择硬解模式时,右方也可选择要让其执行硬解的格式,没勾选的就是使用软解,Resolutions是指要让其硬解的解析度,把UHD勾选的话则对4K解析度(3840*2160)的档案也可进行硬解(要N卡VP5以上、A卡UVD5以上跟I卡IVB以上才支援)。

这边也要澄清一个观念,硬解画质并没有比较好或比较差(除了上面提到的DXVA2-native的某些状况),纯粹只是把解码工作由CPU转交给显卡去做而已,而且必须完全符合标准规范的格式才能硬解,自己压制的,如果参数比较奇怪,或是像10bit h.264编码这些都是不能硬解的。对比较旧的显卡来说,如果CPU能力还不差的话建议还是使用软解,原因在于软解能力虽然也会因CPU等级不同而有差别,但不像硬解受硬体影响那么大(各世代显卡硬解能力不同,驱动也会影响),比较稳定不容易出问题,至于效率上,以A卡来说的话,就算UVD4这代,效率还是比软解慢很多,测试同一个影片用硬解跟软解,快速拉动时间轴,去比较其反应时间应该可以明显地感觉出来。
不过同样情形在N卡跟I卡上并不成立,N卡VP4效率普遍比软解慢,但N卡到VP5这一代跟软解的效率则互有高下,视CPU能力而定,以Intel i5 -2400来说在CPU解得动的场合下普遍还是比VP5快一些。而在I内显跟N卡VP6之后(Maxwell架构之后的N卡)和A卡UVD5之后(GCN 3rd gen架构之后的A卡)的场合则完全颠倒过来,硬解是压倒性的比软解快(用DXVA Checker跑分可以很明显比较出来,但因为软解已经很快了,所以有时候这种快在播FHD影片不一定有感就是了,要在4K影片的场合比较有感觉),如果是这些架构之后的显卡就很推荐使用硬解!


要知道自己的显卡硬解模组是哪一个世代的可参考维基
http://en.wikipedia.org/wiki/Unified_Video_Decoder
http://en.wikipedia.org/wiki/Nvidia_PureVideo

再来介绍左上角的Settings for Interlaced Streams,这是针对交错扫描的片源所做的选项(如电视录制下来的1080i档案或是标准DVD的输出格式皆为此类),关于交错扫描相关的知识实在太过长篇大论,请自行GOOGLE,这边不再赘述。Field Order是指场序,Deinterlacing Mode是指解码器判断交错片源的方式,一般让其保持Auto即可,不过有时会遇到判断错误的情况则必须进行手动设置。像影像进行去交错时,如果画面抖动严重通常就是场序弄错了。

Deinterlacing Mode选Auto有时候也会遇到该去交错而没有去交错的情况......

Deinterlacing Mode除了Auto外还有三个选项,Agressive是指影像串流中有侦侧到交错式的画格则全部进行去交错处理,Force是指不论内容一律进行去交错处理,Disabled是指不论内容一律当作循序扫描影像(不进行去交错)。

右下角的Software Deinterlacing是指软体去交错,一般渲染器如果能正常呼叫显卡执行硬体去交错(Hardware Deinterlacing)的话则不需要勾选此选项,不过如果想使用软体去交错也可勾选,软体去交错对CPU负担较大,效果的话个人觉得跟硬体去交错差异不大。另外需注意DXVA2 Copy-Back Direct mode在YADIF启用时无法作用。

右边中间是N卡专用的Hardware Deinterlacing,N卡可勾选,不过N卡跟其他家显卡亦可由渲染器透过DXVA呼叫硬体去交错功能,所以不一定要勾,个人比较喜欢交给渲染器呼叫。

建议设置如下(win8以上),输出格式可以全勾:


"Format"这个分页,维持预设即可


如果要看影像播放时有无启用硬解,除了上一篇提到的MPC-BE右下角的GPU小灯号外,也可在影像播放时右键>筛选器,点开LAV video decoder,看看右上角的硬解模式是否为Active

此为有启用硬解,跑native模式

此为有启用硬解,跑copy-back direct模式


此为无法启用硬解,使用软解


在软解4K HEVC编码的影片时,x64版本的LAV效率远大于x86,故有软解4K HEVC的需求我会建议用x64版本的LAV搭配x64播放软体。

硬解的话x86和x64效率上差别就很小了

NV卡的Kepler和Maxwell架构之后,以及Intel Haswell之后的内显,更新到最新的驱动后都能使用HEVC硬解

Intel官方的网页:
https:/ /communities.intel.com/thread/59216

须注意的是,这种硬解并不是我们传统意义上的硬解,而是属于混合硬解(Hybrid HW decoder)

混合硬解大部分是利用显卡shaders来解码,效率比较低,CPU使用率也会比较高,
而且解码能力直接跟显卡效能成正比,也就是说遇到帧数高一点的流量高一点的4K HEVC,
显卡效能不够的话解起来就可能会顿,我自己的750ti测试起来,HEVC硬解效率就十分低落,远不如x64软解.

而传统意义的纯硬解(fixed function HW decoder),利用显卡里固有的解码模组,
效率高很多且解码能力不会受到显卡效能影响,以现有的NV卡和I内显来说H.264、VC-1、Mpeg-2都属此类......

以NV卡来说GTX 970和980以及比他们更早出的显卡 HEVC解码都是混合硬解,而且都只有支援到8bit HEVC,10bit HEVC不支援

至于Intel内显来说,Haswell、Broadwell的HEVC解码也都是混合硬解,
只是Haswell支援到8bit,而Broadwell可以支援到10bit HEVC
而Skylake,支援8bit HEVC的纯硬解,但10bit HEVC只支援混合硬解
2017年发表的Kaby Lake架构之内显才有HEVC 8bit/10bit全面的纯硬解支援

世界上第一张支援HEVC"纯硬解"的独显是2015年1月22日发表的NV的GTX 960(解码模组VP7),10bit HEVC(main@10)也有支援,在其之后发表的N卡有VP7以上模组的也都有支援HEVC 8bit/10bit纯硬解了
而AMD则是在2016发表的Polaris(RX 4xx系列)之后的显卡有HEVC 8bit/10bit的纯硬解支援

拥有HEVC纯硬解能力的显卡,使用LAV开启硬解时就会自动用显卡里固有的解码模组来解码,如同H.264那样,而不会再使用混合硬解。


另外就是VP9编码的部分,这个是Google主推的编码格式,主要是用在线上串流,像Youtube就是其大宗。要测试VP9硬解的部分可用MPC-BE直接来播Youtube的影片(设定里选择WebM优先)。VP9 profile0(8bit),NV也是从GTX 960(解码模组VP7)开始有支援纯硬解;而VP9 profile2(10bit)的纯硬解,至2016年底为止只有GTX 1050/1050 Ti有支援。
AMD的部分则到2016年底为止的卡都尚未支援VP9纯硬解(但RX 4XX似乎有支援VP9混合硬解,但目前无法用正规方式开启)
Intel内显的部分,Skylake只支援VP9 8bit的混合硬解,Kaby Lake才有支援VP9 8bit/10bit的纯硬解

接下来介绍LAV audio decoder的设置,一样点两下进入设定页,以下为预设设置:

如果跟我一样是两声道喇叭或耳机的话,可将设定改成这样:


第1页的"Convert Output to Standard Channel Layouts"是在透过HDMI做声音输出时,如声道数未达标准5.1/6.1/7.1声道则会自动添加静音声道补足。当然一般两声道的类比输出是不用勾选的。

第二页的Enable Mixing勾选的话,在解多声道的讯号时就会将其降混成两声道输出(其他也可降混成单声道/4.0/5.1/6.1/7.1,但注意只能多变少不能少变多)我设置的数值是ITU规范里多声道降混到立体声的建议混音比例,若不喜欢也可设置成自己喜爱的数值。

另外请注意,如果喇叭或耳机没有良好的低频响应,LFE这项还是维持预设的0会好一点

右上角有一个"Clipping Protectiom",一些等级较低的喇叭遇到动态范围较大的音源可能会产生破音,这时可将这个选项勾选,它会适时调整声道的动态范围让其不会破音,效果有点类似"Normalize Matrix"但不会像其损失那么多音量。

至于Matrix Encoding,是用在PC输出给有Dolby Pro Logic解码能力的扩大机才有作用,它的作用是能把立体声拓展成多声道,Pro Logic支援拓展到4声道,Pro Logic II支援到5.1声道。如果没有此类设备的话请选择None。

"Formats"分页,维持预设即可,"WMA"相关格式无勾选,会自动交给DMO解码

设定完成,最后在播放影片时检查一下是否成功调用了



2013/02/15新增:

LAV Splitter的语言(字幕)偏好设置说明

先声明一点,LAV Splitter的选择逻辑,只对内封的字幕跟音轨有效(像封在MKV档里面的字幕档),外挂的字幕档跟音轨则不在LAV Splitter的管辖范围内。

使用时要先取消MPC-BE内建的预设轨道,否则会覆写LAV的设定


以下图为范例来说明

在Subtitle Selection Mode的选单里有四种模式可以选择,下面逐一说明(其实大多是翻译一下原文说明而以)

  • "No Subtitles"顾名思义,不载入任何字幕

  • "Only Forced Subtitles",只选择有强制轨(forced track)标记的字幕,被选择的字幕遵守语言偏好设定(在Subtitles的栏位中填入语言的3个英文字代码,如英文"eng"' 、中文"chi",则该语言会被优先选择)

  • "Default",有强制轨(forced track)或是预设轨(default track)标记的字幕会被选择,被选择的字幕遵守语言偏好设定

  • "Advanced",此模式可透过在Subtitles的栏位中填入特定的语法来编写自己的语言选择逻辑,以下介绍其所使用的语法

其语法是由一组音轨跟一组字幕轨组成,由分号隔开,例如"eng:ger"即代表"读取到一个英文的音轨时,选择德文的字幕"
另外有两个特殊的指令
"*"代表"全部"
"off"代表"不选择"
例如"*:eng"代表"任何音轨下都选择英文字幕",也可以反过来用,"eng:*"代表"读取到英文音轨时选择任何字幕"
"eng:off"则代表"读取到英文音轨时,不选择任何字幕"

另外还有以下四种标记
"d"代表有预设轨(default track)标记的字幕
"f"代表有强制轨(forced track)标记的字幕
"h"代表听障人士用字幕(hearing impaired),此在美国及日本电视节目较常见
"n"代表一般串流(normal streams )字幕,即没有以上三种标记的字幕
以及否定标记"!",例如"!h"则代表"非h",也就是"dfn",依此类推

标记的用法,是在上面提到的语法中,用"|"这个符号附加在后面,例如"*:*|f",则代表"读取到任何音轨时,选择任何有强制轨标记的字 幕"


例如以下这个逻辑"eng:eng|f eng:ger|f eng:off *:eng *:ger",它代表的是"如果音轨是英文时,选择有强制轨标记的英文字幕,没英文字幕时就选择有强制轨标记的德文字幕,都没有时就不选择字幕,如果音轨不是英文时,选择英文字幕,没英文字幕时选择德文字幕"

不过对中文使用者来说,还是有一些问题就是了,在于中文有简体字跟繁体字两种区别,但是在内封轨的代码中(以MKV来说)不管简体字幕跟繁体字幕都是"chi"(Chinese),有些字幕组则是全部都封成und(未知),也就是说,上面的逻辑并没有办法区分出繁体字幕跟简体字幕

而以我上面那张范例图来说,我设定的"*:chi|!d *:und |!d *:*|d *:*"这个逻辑的意思是
"读取任何音轨时,选择任何不是预设轨的chi字幕,没非预设轨chi字幕的话选择任何不是预设轨的und字幕,没非预设轨und字幕的话选择任何预设轨字幕,没预设 字幕的话选择任何字幕"
这样设定是因为有些对岸的字幕组出的简繁内封档会把简体中文字幕设为预设轨,因此我这样设置就能让其自动读取繁体中文的字幕档,但是如果遇到预设轨是繁体中文字幕的,或是里面有封超过两个的chi或und字幕档,这种设定方式有时候也是破功,还是勤劳一点手动选择吧!
(或是干脆用播放器内建的字幕轨偏好选择,它辨识tag的能力还不错)


此外,个人实测发现,对于ts档而言,MPC-BE内建的延迟最短支援度也高,故建议ts档以MPC-BE内建做为分离器

内部筛选器source filter那边勾选"MPEG PS/TS/PVA"


到Priority这项,保持预设即可

赞赏支持