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)
多余.
对于我的应用程序,我将 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)
多余.