【问题标题】:How to efficiently extract specific sections of a video (Python/FFmpeg)?如何有效地提取视频的特定部分(Python/FFmpeg)?
【发布时间】:2022-02-23 00:08:20
【问题描述】:

我有一堆视频,我想为其提取特定部分(视频或帧)。我从 .json 文件中获取特定部分,其中开始和结束帧根据标签存储,例如“视频中的猫”、“视频中的狗”。我在 Python 中有一个使用 opencv 的现有方法,使用提到的方法 here 但我发现了一个使用 ffmpeg 的单行器,它比我的 Python 脚本更快、更高效,除了我必须手动填写开始和结束此命令中的帧。

ffmpeg -i in.mp4 -vf select='between(n\,x\,y)' -vsync 0 frames%d.png

我阅读了一些关于working with .json files in a shell scriptpassing arguments to a batch script 的问题,这些问题看起来很复杂,可能会破坏我的系统。由于我不熟悉在 shell/批处理脚本中使用 .json 文件,我不知道如何开始。谁能指出我如何制作一个可以从 .json 文件中读取变量并将其输入到我的 ffmpeg 命令中的批处理脚本的正确方向?

【问题讨论】:

    标签: python video ffmpeg


    【解决方案1】:

    既然你已经熟悉Python,我建议你用它来解析JSON文件,那么你可以使用ffmpeg-python库,它是Python的ffmpeg绑定。它还有一个crop 函数,我认为这是你需要的。

    另一种方法是使用 Python 脚本中的 os.system('ffmpeg <arguments>') 调用,它允许您从脚本运行外部工具。

    【讨论】:

      【解决方案2】:

      Python 原生支持 JSON 及其内置 json package

      至于在 python 中执行此操作,这是一种替代方法,您可以尝试我的 ffmpegio-core 包:

      import ffmpegio
      
      ffmpegio.transcode('in.mp4','frames%d.png',vf=f"select='between(n\,{x}\,{y})'",vsync=0)
      

      如果视频是恒定帧速率,则将开始和结束时间戳指定为输入选项可能会更快:

      fs = ffmpegio.probe.video_streams_basic('in.mp4')[0]['frame_rate']
      ffmpegio.transcode('in.mp4', 'frames%d.png', ss_in=x/fs, to_in=y/fs, vsync=0)
      

      如果您不知道帧速率,则您正在为每个文件调用 ffprobe 和 ffmpeg,因此需要权衡。但是,如果您的输入视频很长,那么它可能是值得的。

      但如果速度是您的主要目标,直接调用 FFmpeg 总是最快的。

      ffmpegio GitHub repo

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 2021-12-17
        • 2021-06-11
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 2021-02-26
        相关资源
        最近更新 更多