FFmpegSource2

来自NMM Doc
跳转至: 导航搜索

使用ffmpeg打开源文件,运气好的能做到诸帧精确。源代码依照MIT许可证发布,点击 https://github.com/FFMS/ffms2 获得源代码。已编译好的二进制文件按照GPLv3许可证发布。如果你是开源信仰者,你可以把这个当成是基督的归来。

概 述
作者 FFmpegSource2项目
版本 310
下载地址 FFmpegSource2项目
分类 源滤镜
需求 AviSynth 2.5
授权 MIT协议


局限

  • 打开ogm或mpeg文件需要用到Haali媒体分离器(HMS)
  • Haali分离器要求ts文件的分割点在一个数据包的边界上。打开ts文件前可以用TsRemux修复一下。
  • 因为用到了LAVF的分离功能,绝大多数的原始数据流没有办发正常打开,比如h264原始数据流和其他一些mpeg视频流。
  • FFAudioSource()需要重新索引由FFVideoSource()索引过的文件,因此像
AudioDub(FFVideoSource(X), FFAudioSource(X))

的脚本,需要索引两次。这样做倒没什么问题,只是多花了一些时间。用下面的方法可以避免索引两次,一是先索引音频

A = FFAudioSource(X)
V = FFVideoSource(X)
AudioDub(V, A)

或直接用FFIndex()

FFIndex(X)
AudioDub(FFVideoSource(X), FFAudioSource(X))

已知问题

  • 解码ts封装的h264文件时画面可能会破损。
  • FFIndex()在索引时会静默的忽略解码错误。也就是说即使FFIndex()索引完毕了,对于某条视频轨或音频轨的索引有可能已经失败了。

兼容性

  • AVI、MKV、MP4、FLV:准确跳转
  • WMV:准确跳转(?),但是avformat似乎把关键帧定在了比较远的地方
  • OGM:准确跳转(?)
  • VOB、MPG:似乎有时会跳到指定帧前后的一到两帧
  • M2TS、TS:似乎有时会跳到指定帧前后的几帧
  • 图片:绝大多数文件,可以设置seekmode=-1打开,但不支持动画


FFMS2.dll里的函数

FFIndex (字符串 source, 字符串 cachefile = source + ".ffindex", 整数 indexmask = -1, 整数 dumpmask = 0, 字符串 audiofile = "%sourcefile%.%trackzn%.w64", 整数 errorhandling = 3, 布尔 overwrite = false)

用来索引的专门独立函数,有一些额外的选项,还能把音频轨以wave64格式存到硬盘里。能避免索引一个文件两次,而且当音频轨坏掉/不支持导致不能正常索引时也会有用。


FFVideoSource(字符串 source, 整数 track, 布尔 cache = true, 字符串 cachefile = source + ".ffindex", 整数 fpsnum = -1, 整数 fpsden = 1, 字符串 pp, 整数 threads = -1, 字符串 timecodes, 整数 seekmode = 1, 整数 rffmode = 0, 整数 width = -1, 整数 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "")

打开视频,如果没有现成的索引,则索引所有的视频轨。


FFAudioSource(字符串 source, 整数 track, 布尔 cache = true, 字符串 cachefile = source + ".ffindex", 整数 adjustdelay = -1)

打开音频,如果没有现成的索引或需要的音频轨原先没有被索引过时,则会去索引所有的音频轨。


FFPP(clip, 字符串 pp)

独立的后处理函数,其中包含了一些简易的反交错滤镜。因为FFVideoSource可以直接读出视频的量化值,所以尽量在FFVideoSource中使用pp参数,这个后处理能更好地适应打开的视频。


SWScale(clip, 整数 width = -1, 整数 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "")

一个缩放/色彩空间转换滤镜,没有什么特别之处。这个滤镜和AviSynth的做法不完全一样,有时会有点用。


FFSetLogLevel(整数 Level = -8)

设置FFmpeg的日志输出等级,默认设置成静默(-8),FFmpeg的默认等级是16。avutil/log.h文件里可以找到所有可设置的等级。


FFgetloglevel()

返回当前日志记录等级(整数)。

FFMS2.avsi里的函数

FFmpegSource2(字符串 source, 整数 vtrack = -1, 整数 atrack = -2, 布尔 cache = true, 字符串 cachefile = source + ".ffindex", 整数 fpsnum = -1, 整数 fpsden = 1, 字符串 pp, 整数 threads = -1, 字符串 timecodes, 整数 seekmode = 1, 布尔 overwrite = false, 整数 width = -1, 整数 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "", 整数 rffmode = 0, 整数 adjustdelay = -1)

近似于1.x系列比较高版本的语法。atrack=-1可以方便同时载入视频和音频。注意如果没有载入第一条视频轨,而是其他的,可能需要自己调adjustdelay参数,指定合适的音频轨的延迟。


FFImageSource(字符串 source, 整数 width = -1, 整数 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "")

FFvideoSource的一种等价形式,选项都为读取图片优化过的。为了兼容性,关掉了缓存和seeking。


FFFormatTime(整数 ms)

一个辅助函数,把以毫秒记的时间转换成h:mm:ss.ttt(字符串)


FFInfo(clip c, 布尔 framenum = true, 布尔 frametype = true, 布尔 cfrtime = true, 布尔 vfrtime = true)

一个辅助函数,显示当前帧的一般信息。注意并不是所有的值都输出成了原模式,所以不会每次都显示所有的值。


函数参数

source:源文件

indexmaskdumpmask:索引哪条音频轨/把哪条音频轨写入硬盘。解码转存一条音频轨同时也做了索引,因为要干的活一样多。这个参数以二进制掩码记,比如设为7对应操作1~3号轨道(1+2+4 = 7),并且会忽略非音频轨。设为-1则把所有的音频轨写入硬盘。

audiofile:转存音轨的文件名。请确保有变量轨道号,以防止多文件同时写入产生的访问错误。变量对大小写敏感。变量如下:

%sourcefile% - 和参数source相同,音频轨从这个文件里解码。
%trackn% - 轨道号
%trackzn% - 轨道号前面加个0,变成两位数
%samplerate% - 采样率
%channels% - 声道数
%bps% - 采样深度
%delay% - 延迟,准确地讲是音轨所在的第一个时间戳

overwrite:即使索引已经存在,也重新索引一遍并覆盖原索引。在改变过trackmask或测试时可能有用。

track:分离器中对应的轨道号,从0开始。-1则是第一个匹配的轨道,但有可能不是识别出的第一条未索引过得视频/音频轨道,而是之后的一条轨道。

fpsunmfpsden:做VFR -> CFR用的,帧率的分子和分母。设fpsnum <= 0则是和源文件编码的帧数相同。

timecodes:输出的timecodes文件(tcv2)的文件名,如果存在就覆盖掉。

cache:写一个以后可能用得上的索引信息文件。设置这个参数会同时控制载入已存在的索引文件和写入新的索引文件。

cachefile:写入的cache信息的地址。

pp:完整信息请查看下面表格中的描述。留空则是不做后处理。建议尽量不要用根据q值自动处理的选项,因为现在处理的效果不明。

threads:设置解码线程数,默认值是Windows提供的逻辑核心数。如果用到的解码器没有此功能,lavc也会无视掉这个参数。

seekmode:控制如何处理跳转。对MKV文件和Haali分离器打开的文件无效,这些文件相当于自动设置seekmode = 1。

-1:线性转到而且不往回倒。如果每个这个请求的帧数比最后一个小,就会输出一个警告。只用来打开图片,但可能可以用在某些难得一见的视频格式
0:线性到达,会比较慢,但可以“打开”更多格式
1:安全模式,基于已知的关键帧位置判断跳转
2:非安全模式,和模式1一样,但是如果精确的目标位置要靠猜的,是不会跳出错误的
3:激进模式,如果没有比较接近的关键帧,则向前跳转。仅在测试和打开avformat无法正确返回关键帧位置的容器才有用

rffmode:控制如何处理视频流中的RFF旗标。

0:忽略
1:按照旗标处理
2:等价于Force Film

注意当视频流里根本没有RFF旗标时还设rffmode的话,会跳出错误。当设置这个参数后,也会输出CFR的视频,并禁用垂直方向上的缩放和色彩空间的转换。FFPICT_TYPE也无效,因为输出的一些帧是组合起来的。除此之外还有一些其他细微的设置调整。

widthheight:缩放到的宽度和高度。设成小于或等于0相当于指定输入视频的尺寸。

resizer:选择对色度平面和普通缩放使用的缩放算法。可选择的方法有:FAST_BILINEAR、BILINEAR、BICUBIC、X、POINT、AREA、BICUBLIN、GAUSS、SINC、LANCZOS和SPLINE。

colorspace:转换到的色彩空间。名称有YV12、YUY2、RGB24、RGB32。留空相当和输入视频的色彩空间一致。

errorhandling:控制当遇到音频解码错误是如何处理。

0:退出索引
1:清理掉遇到问题的音频轨,然后继续
2:停止索引此音频轨,但索引过的内容保留
3:什么都不管直接继续解码

adjustdelay:设置合适的音频轨延迟。默认-1,绝大多数情况都会得到正确结果。

-3:不调延迟
-2:相对0时刻调整延迟
-1:相对于第一条视频轨调整延迟,如果没有视频轨,则相对于0时刻调整


输出给的AviSynth变量

FFSAR_NUMFFSAR_DENFFSAR:由容器指定的播放高宽比。FFSAR_NUM和FFSAR_DEN是组成比例的分子和分母,FFSAR则只是方便无法计算的情况而已。

FFCROP_LEFTFFCROP_RIGHTFFCROP_TOPFFCROP_BOTTOM:容器指定的播放时切边参数

FFCOLOR_SPACE:输出的色彩范围

0:未知/未指定
1:有限范围
2:全范围

FFPICT_COLOR:被请求的最接近帧的帧类型,输出一个ascii数字,下面列出了所有对应情况。在AviSynth里用[Chr()|字符串函数]转换成字符。AviSynth的条件运行脚本需要设after_frame = true才能得到正确结果。rffmode=0时才能用。 FFmpeg各字符原始定义:

I:I帧
P:P帧
B:B帧
S:MPEG4的VOP
i:SI帧
p:SP帧
b:FF_BI_TYPE (现在没有合适的解释)
?:未知

用法举例:

ScriptClip("""subtitle(chr(FFPICT_TYPE))""",after_frame=true)

FFVFR_TIME:当前帧实际时间,以毫秒计。没有做任何CFR转换时才有用(即rffmode和fpsnum都保持默认)


PP字符串格式

后处理滤镜:

滤镜 选项
简称 长名称 简称 长选项 描述
* * a autoq 根据CPU能力选择
c chrom 处理色度
y nochrom 不处理色
n noluma 不处理亮度
hb hdeblock (2个阈值) 水平方向deblocking滤镜
1.差异因子:默认32,调高相当于更强的deblocking
2.平滑度因子:默认39,调低相当于更强的deblocking
水平和垂直的deblocking滤镜共用这两个值,不能单独设置
vb vdeblock (2个阈值) 垂直方向deblocking滤镜
ha hadeblock (2个阈值) 水平方向deblocking滤镜
va vadeblock (2个阈值) 垂直方向deblocking滤镜
h1 x1hdeblock 实验性水平deblocking滤镜
v1 x1vdeblock 实验性垂直deblocking滤镜
dr dering deringing滤镜
al autolevels 自动调节亮度对比度
f fullyrange 把亮度拉伸到(0..255)
lb linblendeint 线性Blend反交错
li linipoldeint 线性插值反交错
ci cubicipoldeint 三次方插值反交错
md mediandeint 中值反交错
fd ffmpegdeint ffmpeg反交错
l5 lowpass5 FIR低通反交错
de default hb:a,vb:a,dr:a
fa fast h1:a,v1:a,dr:a
ac ha:a:128:7,va:a,dr:a
tn tmpnoise (3个阈值) 时间降噪
1. <= 2. <= 3. 数值大 -> 降噪效果强
fq forceQuant <量化值> 强制量化

用法:

<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...

长参数名示例:

vdeblock:autoq/hdeblock:autoq/linblenddeint
default,-vdeblock

短参数名格式:

vb:a/hb:a/lb
de,-vb

其他例子:

tn:64:128:256