看来你不太了解avisynth
avisynth在打开时就要求每一个滤镜都必须输出固定的帧数,固定的长度,固定的fps。avisynth要求最后一个滤镜返回第n帧,然后这个滤镜又根据这个n计算出应该需要上一个滤镜的第a帧,第b帧...以此类推直到源滤镜。一般源滤镜工作时要把这个n转化成时间,然后在视频中定位。当然像dss这样的定位的结果可能根本不是视频真正的第n帧,不过avs不会去管的。
而dedup显然在跑完所有帧前是无法知道最后会输出多少帧的,所以第一遍只能记录,第二遍根据上一次记录的信息就知道哪些帧保留哪些帧丢弃了,或者说知道n对应上一级滤镜的第几帧了。
如果avisynth并不要求固定的帧数和固定的fps,而是像dshow一样只要求每一帧有一个时间戳,那每一个滤镜只需要实现seek功能和获得下一帧的就可以了。avisynth需要某个时间t的某一帧,每个滤镜根据t计算上一级滤镜需要定位的时间,同时每个滤镜返回最后输出帧的实际时间戳。这样dedup就可以1pass工作了。