Ben*_*ois 3 python ffmpeg ffmpeg-python
我想用 ffmpeg-python 模仿以下 ffmpeg 命令
ffmpeg -y -i in.mp4 -t 30 -filter_complex "fps=10,scale=-1:-1:flags=lanczos[x];[0:v]palettegen[y];[x][y]paletteuse" out.gif
到目前为止,这就是我所得到的:
in_stream = ffmpeg.input(src, ss=start_time, t=(stop_time-start_time))
scale_input = in_stream
if fps >= 1:
stream = ffmpeg.filter(in_stream['v'], 'fps', fps)
scale_input = stream
stream = ffmpeg.filter(scale_input, 'scale', output_width, output_height, 'lanczos')
palette = ffmpeg.filter(in_stream['v'], 'palettegen')
#stream = ffmpeg.filter(stream, palette, 'paletteuse') ???
stream.output(dst).run()
Run Code Online (Sandbox Code Playgroud)
我检查过,如果我将其输出为 png,调色板会生成得很好。但是,我找不到如何通过多输入命令使用它paletteuse,因为过滤器仅将一个流作为 ffmpeg-python 的输入。我尝试将它们连接起来,ffmpeg.concat()这是我发现的从两个流中创建一个流的唯一方法,但我认为这是没有意义的(而且无论如何它都不起作用)。
任何想法?
小智 6
我遇到了同样的问题,这个问题是最热门的搜索结果之一。我最终想出了如何去做。
以下函数接受一个流(例如stream = ffmpeg.input('input.mp4'))并重新缩放它。然后它分割流。第一个分割用于生成调色板。最后,第二个分割与调色板一起使用以输出 .gif。
# stream: input stream
# output: name of output file
def output_lowres_gif(stream, output):
split = (
stream
.filter('scale', 512, -1, flags='lanczos') # Scale width to 512px, retain aspect ratio
.filter('fps', fps=12)
.split()
)
palette = (
split[0]
.filter('palettegen')
)
(
ffmpeg
.filter([split[1], palette], 'paletteuse')
.output(f'{output}.gif')
.overwrite_output()
.run()
)
Run Code Online (Sandbox Code Playgroud)
根据需要调整分辨率、帧率或添加其他过滤器。
| 归档时间: |
|
| 查看次数: |
2495 次 |
| 最近记录: |