FFmpeg python:fps 更改和插值后长度不同

FFmpeg python: different length after fps changed and interpolated

对于我的应用程序,我将 ffmpeg-python github 中的代码改编为 tensorflow streaming.

它基本上解码输入的每一帧,让您用 python 处理它,然后再次编码。

为了优化我在输入端添加一个 fps 过滤器以获得一半的 fps,所以我只能处理一半的帧,然后在编码器中插入帧minterpolate 得到原始 fps。

我的解码器是这样的:

def decoder(in_filename):
args = (
    ffmpeg
    .input(in_filename)
    .filter('fps', fps=30/2)
     (... more filters in between ...)
    .output('pipe:', format='rawvideo', pix_fmt='rgb24')
    .compile()
)
return subprocess.Popen(args, stdout=subprocess.PIPE)

我的编码器在用 python 处理帧后:

def encoder(out_filename, width, height):

args = (
    ffmpeg
    .input('pipe:', format='rawvideo', pix_fmt='rgb24', s='{}x{}'.format(width, height))
    .filter('minterpolate', fps=30)
    .filter('fps',fps=30)
    .output(out_filename, pix_fmt='rgb24')
    .overwrite_output()
    .compile()
)
return subprocess.Popen(args, stdin=subprocess.PIPE)

之后我将原始输入与处理后的视频水平堆叠

subprocess.run("ffmpeg -i {} -i {} -filter_complex hstack=inputs=2 -pix_fmt yuv420p -c:v libx264 {}".format(in_filename,out_filename,"out.mp4"))

问题在于:“处理过”的视频速度更快,并且比原始视频先结束。就像它们遵循相同的时间戳,但它从未实际插入帧。我做错了什么?

编码器 .input() 必须指定其帧速率以匹配解码器帧速率 (15 frames/s)。目前它使用 rawvideo 编码器的任何默认帧率。

在FFmpeg中,也就是使用-r 15 input选项。不确定它在 ffmpeg-python 中是什么,但可能只是 r=15 关键字参数。

P.S., .filter('fps',fps=30) 多余.