严格意义上的编码指的是将raw文件编码压缩(有损/无损)成某一种格式,对于音频raw是wav文件,而对于视频其中一种是yuv文件。比如wav->flac,wav->aacyuv->h264,yuv->xvid我们这里一般拿到的都是经过编码的视频文件,比如蓝光的m2ts,TV录制的ts格式等等,所以我们的第一步就是将它们分离解码成raw格式再进行编码。x264本身已经集成了ffmpeg,所以这一点我们不需要担心了。或者我们使用avs的话,其中的源滤镜那一步就相当于分离和解码了。那么我们编码压制的整个过程大概就是:分离解码视频源->编辑处理视频源->编码视频源->封装分离解码音频源->(编辑处理音频源)->编码音频源->封装
关于AAC的这几种编码模式,区别如下:
·HardCBR:nobit-reservoir,everyframe(21.5-43ms)hasthesamebitconsumption(e.g.-hard-cbrinOpus)·SoftCBR:smallbit-reservoir,forexampleonewiththesizegivenintheMPEGstandard(e.g.FraunhoferCBR)·ABR:largebit-reservoir,maybeuptoafewseconds.Entirelyuptothedeveloper(e.g.ABRinNero’sencoder)·CVBR:verylargebit-reservoir,maybeuptoaminute.Entirelyuptothedeveloper(e.g.CVBRinApple’sencoder)·TVBR:maximumbit-reservoir,everyframeandchannelmayusebetween~10and6144bits(e.g.Apple’sorFraunhofer’sVBR)
简单来说,ABR与CVBR的区别就是bit-reservoir的大小,其结果都是使编码结果的平均码率接近指定码率,但不一定相等,类似于x264的2pass模式。即中间的即时码率随着复杂度可高可低,但是最终结果的平均码率与指定的码率接近,限定了编码文件的最终体积。TVBR则是尽可能大的bit-reservoir,类似于x264的crf模式,指定一个qualitystep,来进行编码,目标文件的最终码率我们事先并不能知道。CBR模式则是简单粗暴许多,所有场景的码率都相同,复杂度高的场景与复杂度低的场景给予同样多的码率。一般来说,我们主要用的是CVBR和TVBR两种编码模式,因为这两种编码模式编码效果较好。
关于qaac的输入文件,根据我这里的测试,默认是支持wav,m4a,mp3的,如果使用上面我打包的版本的话,还支持flac和tak。大家可以使用命令
qaac--check11进行检查。
根据官方help,使用方式如下:
qaac-v256audio.wav-oaudio.m4a11或者
qaac--cvbr256audio.wav-oaudio.m4a11这里指定256Kbps作为目标码率,audio.wav是我们待压缩的音频文件,audio.m4a是编码出来的AAC文件。--cvbr256也是苹果iTunesPlus商店音乐的编码模式。
与CVBR不同,TVBR需要我们指定qualitystep,相当于一个码率因子。根据官方help,使用方式如下:
qaac-V109audio.wav-oaudio.m4a11或者
qaac--tvbr109audio.wav-oaudio.m4a11qualitystep的数值是0-127,数值越大,码率越高,质量越高。但是qualitystep的取值并非是0-127的全部数值,而是只有15个实际的qualitystep。分别是:
其他输入值则会选择一个最接近的值作为输入。至于如何选值,qaac的作者是这么说的:
63mightbeagoodplacetostartwith.Sinceit’spositionedatmidcenter,youmighttakeitas“midquality”.However,itstypicalbitrateforredbookformatisaround128kbpsorso,whichisusuallyconsideredtobegoodforAAC(rememberiTunesmusicstorehasbeenusing128kbpsABR,beforeiTunesplushascomeout).Ofcourse,nobobybutyoucandecidewhichsettingisappropriateforyou.Decidebyyourselfusingyourears.
一般来讲,我们对于视频的控制在于两个地方,一个是编码前,一个是解码后。编码前指的是我们在使用encoder重编码源视频前所做的对源的处理,就是我们这里的AVSPART,比如进行crop,resize,debanding,denoise等等。解码后指的是在播放的时候源经过解码器解码之后产生的YUV视频流对其进行后处理,包括反交错,IVTC,debanding等等。区别在于解码后的处理是随着播放实时的。我们通过AVS脚本实现对于源的处理,这里我们使用AvsPmod作为我们书写AVS代码的IDE。
源滤镜的任务是解码源并将其载入,不同的源滤镜对于不同的视频源解码能力不同。这里我们常用的源滤镜有L-SMASH-Works,FFMS2,DGDecNV(Non-free)…
L-SMASH-Works中有4个源滤镜,包括两个视频源滤镜和两个音频源滤镜。分别为LWLibavVideoSource和LSMASHVideoSource,LWLibavAudioSource和LSMASHAudioSource。我们这里主要使用的LWLibavVideoSource这个源滤镜。LWLibavVideoSource和LSMASHSource的区别:
LWLibavVideoSourceisbasicallyaFFmpegSourcealternative,whichcanbeusedwithoutanindexfile.(indexfilewillbecreatedifcacheissettotrue)LSMASHVideoSourceisamp4sourcefilter.
当我们的视频源的格式是mp4时,我们可以优先使用LSMASHVideoSource,这样既不用生成索引文件,同时结果更为准确。语法:
LWLibavVideoSource("E:\Movie\video.m2ts")11或
LSMASHVideoSource("E:\Movie\video.mp4")11然后在AvsPmod里面pressF5进行刷新,会出现假死的情况,这是在生成所需要的lwl引导文件。关于源滤镜的索引问题,这里引用06taro大大在NMM的一段话:
为什么要索引?
这么说吧,譬如我一个滤镜要请求文件的第1000帧,我如何知道这个第1000帧的数据在这个文件的什么位置?
如果格式头部自带index,要请求第1000帧,就可以从头部读取index,然后找到第1000帧的entrypoint,直接跳到那个位置,然后解码取出第1000帧
如果格式没有自带index,我该怎么办?根据文件总帧数和体积猜测到底在哪儿?甚至有些格式连总帧数都没有时怎么办?从头开始解码一直解码到第1000帧么?如果这样的话我突然要非线性请求第100000帧又怎么办?
理论上像mkv、mp4这种文件是不需要预先index的,直接从头部就可以读取entrypoint,像DSS2读取mkv或者LSMASHVideoSource读取mp4那样。ffms2能力有限不管啥东西都要index一遍是它自己的问题(DGNV读mkv/mp4也是一样)。就算是多个文件合并,只要知道每个文件的entrypointlist,跳到后面的文件只需要将需要的帧号计算出来就行了,同样不会产生index的需要。
我们后面不仅仅会遇到mkv,mp4这样格式的文件,我们可能还会遇到其他视频格式,比如ts,m2ts,avi,rm(vb)等等,为了保证对于文件解码的正确性,所以我们需要索引。
使用ffms2一般只有在LWLibavVideoSource失败的情况下才会试试,因为ffms2在读取ts/m2ts类的格式有时候会出问题,出现相应的帧数对应不准的情况,有时候解码的时候还会RP,尤其是在读取interlace的视频的时候。不过ffms2在做comparison的时候还是很有用的,它的FFInfo能够显示当前帧的类型和帧数。和LWLibavVideoSource一样会生成引导文件。
FFVideoSource("E:\movie\video.mkv")11Comparison
Source=Import("C:\Users\Nero\Desktop\Encode\Test\anime.avs").Subtitle("Source",y=37)Encode=FFVideoSource("C:\Users\Nero\Desktop\Encode\Test\anime.mkv").Subtitle("Encode",y=37)Interleave(Source,Encode)Spline36Resize(Dither_convert_yuv_to_rgb(),ffsar>1round(width*ffsar):width,ffsar<1round(height/ffsar):height)FFInfo(cfrtime=false,vfrtime=false)1234512345这样就可以做到源和压制后的视频交织在一起,便于做Comparison,同时可以适用于那些在压制的时候指定了sar的情况。
DGIndex是一个比较老的源滤镜了,只能用来读取MPEG文件,在DVDRip的时候还是非常有用的。DGIndex本身会读取视频内的一些softpulldownflag等信息,在解码的时候以及后续处理的过程,比如IVTC都比较有帮助。特别是TIVTC本身就支持DGIndex的d2v文件。比如有时候拿到一个ts文件,它带有softpulldown的flag,用LWLibavVideoSource读取的时候会读到一个介于23.976~29.970之间的一个帧数,逐帧查看既有帧帧交错,又有5烂2之类的,不好处理。而如果使用DGIndex进行读取,读出来的帧率会是29.970,以便后续的处理。DGIndex在MeGUI的tools文件夹下可以找到。
热爱生命,请远离DSS。DSS主要是播放器在播放时的源滤镜,意思就如其名,直接显示源。优点就是速度较快,且seek的时候响应较快,因为这些都是为播放的时候用户所care的东西。缺点也是明显的,seek的准确度不高,如果出现上面提到的文件格式没有index的情况下,DSS会“想方设法”地猜出seek的地址。同时依赖于系统的解码能力,如果没有事先安装过完整的解码包,例如完美解码,K-lite等等,在解码一些视频的时候会花屏。如果不希望后面的过程中出现崩溃等问题,就请不要使用DSS。
基于Haali的DSS。在走投无路的时候试试。
基于LAV的DSS2。在走投无路的时候试试。
那么关于源滤镜,我们一般可以这么选择。m2ts:LWLibavVideoSource,DGDecNVmkv:LWLibavVideoSource,ffms2mp4:LSMASHSourcets:DGIndex,DGDecNV
这里额外一点就是对于MPEG-2的片源,比如一些录制的ts源或者DVD,推荐优先使用DG系列的源滤镜,比如DGIndex,DGIndexNV等等,因为这些源滤镜可以正确读取文件的一些softpulldown的flag。我之前遇到过一个文件:堀江由衣-GoldenTime(M-ONMPEG2-TS1080i).ts它就包含softpulldown信息,mediainfo显示它的帧率是29.970,但是我用LWLibavVideoSource载入后发现帧率是25.547。后来在NMM看到mawen1250菊苣说过,LWLibavVideoSource在读这类文件时不能正确参考文件的softpulldown信息,会得到一个介于23.976-29.970之间的一个帧率,逐帧查看会发现既有帧帧交错,又有5烂2。而如果使用DG系的源滤镜的话,就会正确显示29.970。逐帧查看是5烂2,IVTC即可。
Crop(left,top,-right,-bottom)11四个主要的参数分别表示切边的像素值,需要注意的就是后面两个值必须得是负值。如果视频格式是YUV的,切边的像素值必须是2的倍数,RGB格式的则不受此影响。例如:
Crop(0,140,-0,-140)11表示对视频进行上下切140像素的黑边。
用法
Spline36Resize(1280,720,0,0,-0,-0)11一般的resize滤镜后面还有4个比较常用的参数用来表示在resize的同时需要切边的像素值,即切掉多少像素值同时resize到目标分辨率。但是这个切边与Crop的切边有点不一样。Crop的切边的像素值对于YUV必须是偶数,但是这里的这个切边却允许奇数值。Crop的切边可以认为是纯粹的切边,不改变视频中点对齐的方式。而resize的切边可以认为已经改变视频中像素点的对其方式。个人一般的做法是先做Crop,如果仍然需要切边,例如切掉奇数像素的黑边,则再在resize的时候指定。比如:
Spline36Resize(1280,720,0,1,-0,-1)11则表示在resize到720p的同时,切掉上下各1px的黑边。这种做法在片子周围有奇数黑边的时候比较有用。当然另外一种做法是修复黑边,即用除黑边外的最外面的扫描线来代替黑边,这样我们就看不到黑边了。这样的滤镜或者脚本有FillMargins,AutoDirtyLineFixer等。比如:
FillMargins(0,1,0,1)11就是表示修复上下1px的黑边。这里要注意的就是FillMargins的语法与Crop或者Resize不同,4个参数都是正数。Resize的计算,比如片源是1920×1080的分辨率,上下各132px的黑边,切除黑边后是1920×816的分辨率,那么resize到720p就是1280×(816÷1920×1280)=1280×544。如果是上下140px的黑边,那么切掉黑边之后是1920×800的分辨率,resize到720p就是1280×(800÷1920×1280)=1280×533.333333,结果是小数。如果结果是小数则要近似到最近的偶数,那么就是1280×534。但是这种情形与上面一种情形是显然不同的。第二种情况下,resize后的值并没有整除,我们人为做了近似,那么其实我们的resize影响了原本画面的比例。只不过是近似值较小,我们看不出来罢了。对于这种情形,我们也可以采取相应的方式进行补救,我们会在后面SAR部分提到。至此,对于一般国内PT小组的蓝光电影压制可以说基本就已经完成80%了。一个类似的avs脚本:
DGSource("E:\MV\[140129]TVアニメ「ニセコイ伪恋」OPテーマ「CLICK」/ClariS[PV1080P].dgi")#载入视频AssumeTFF.SeparateFields()#指定TFF,拆场1212这时候画面的宽度会变为原来的一般,拉丝也会消失,逐帧观看画面,观看是否有回退现象或者重复现象。在这里这段视频有回退现象,说明片子是BFF的。
一般片源质量很烂或者一般般,没必要上太好的滤镜,那就试试yadif,yadif这个滤镜速度快,但是效果也一般。yadif也用来实时播放过程中的反交错。主要的参数是mode和order。
mode=0:temporalandspatialinterlacingcheck(default).
=1:doubleframerate(bob),temporalandspatialinterlacingcheck.
=2:skipsspatialinterlacingcheck.
=3:doubleframerate(bob),skipsspatialinterlacingcheck.
order=-1:fieldorderasAvisynthassumes(default).
=0:Bottomfieldfirst.
=1:Topfieldfirst.
mode一般默认是0,单倍帧率,即反交错前后帧率不变。一般反交错的过程为了保证信息的完整性,帧率是会翻倍的。但是双倍帧率同时增加了编码过程和解码过程双方的压力,这个我想并不难理解,所以一般都是单倍帧率。但是单倍帧率下,对于yadif这种质量较差的反交错滤镜,就有可能出现鬼影的情况。所以需要使用双倍帧率。order通过官方文档以及我们之前的判断填写即可。用法:
“Placebo”·“VerySlow”·“Slower”·“Slow”·“Medium”·“Fast”·“Faster”·“VeryFast”·“SuperFast”·“UltraFast”·“Draft”
一般使用QTGMC的原则是使用看不出区别的最低参数。因为基于nnedi3的反交错质量比yadif要好的多,再高的参数其实意义不大,所以为了编码效率先从SuperFast开始。低于SuperFast则会调用yadif进行反交错。QTGMC反交错是补全所有信息的,所以帧率是会翻倍的。不过基于之前说过的原因,我们设定其中的FPSDivisor参数,设定单倍帧率。但是单倍帧率砍掉了一半的有效信息,所以我们还需要设定ShuttleBlur参数,搭配FPSDivisor动态融合两帧,这样效果会更好。还有一个Border参数,如果你的视频没有黑边,将这个开启为True,这样对于边缘的处理会更好。
QTGMC(Preset="SuperFast",FPSDivisor=2,ShuttleBlur=2,Border=True)#设定单倍帧率,动态融合两帧,片子没有黑边11IVTC反胶卷过带,推荐的滤镜是TIVTC。
降噪,基于不同的算法相应的滤镜也有好多。
去色带,主要的滤镜有皮神的f3kdb。
TAA,TAAmbk
"avs4x26x.exe""x264_64.exe"--output"movie.mkv""movie.avs"2>log.txt11保存为.bat文件,然后运行这个bat文件,没什么问题的话,压制就会开始了。
上面我们已经实现了压制,使用的是x264的默认参数。实际上,x264的默认参数的目标是中低还原程度的编码,质量比较差。所以我们需要设定一些参数。一般参数的设定根据片源,还有你的需求来设定。比如三次元真人电影和二次元动画的参数显然是不一样的。还有高质量的还原和中等质量的还原参数是不一样的。追求速度的编码参数也是不一样的等等。x264比较方便的一点就是有Preset和tune选项以供我们参考。Preset与之前QTGMC的类似,影响编码速度和编码质量。
较高的还原度:
--presetslower--tunefilm--crf17.0--keyint480--min-keyint1--bframes7--ref10--qcomp0.7--merange24--subme10--colormatrixbt709--output"movie.mkv""movie.avs"11首先指定presetslower和tunefilm,这样很多的针对电影的参数就设定了,如果嫌不够慢可以上presetveryslow。crf数值一般取16-17之间就可以了,这样的还原度就可以了。