首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ffmpeg-python中使用多输入过滤器

如何在ffmpeg-python中使用多输入过滤器
EN

Stack Overflow用户
提问于 2019-03-29 16:45:24
回答 1查看 851关注 0票数 3

我想用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

到目前为止,我得到的是:

代码语言:javascript
复制
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()

我检查过,如果我将其输出为png,调色板生成得很好。但是,我找不到如何通过多输入命令paletteuse使用它,因为过滤器在ffmpeg-python中只接受一个流作为输入。我尝试用ffmpeg.concat()将它们连接起来,这是我发现的从两个流中生成一个流的唯一方法,但我认为它是没有意义的(而且无论如何它都不起作用)。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-03-05 06:37:16

我遇到了同样的问题,这个问题是最热门的搜索结果之一。我最终想出了怎么做。

下面的函数接受一个流(例如stream = ffmpeg.input('input.mp4'))并对其进行重新缩放。然后,它拆分流。第一个拆分用于生成调色板。最后,将第二个拆分与调色板一起使用,以输出.gif。

代码语言:javascript
复制
# 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()
  )

根据需要调整分辨率、fps或添加其他滤镜。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55413497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档