【问题标题】:Cutting out a portion of video - python剪掉一部分视频 - python
【发布时间】:2021-12-12 03:37:18
【问题描述】:

我有每个长度约为 25 分钟的视频,我希望从一开始就使用 python 剪辑几秒钟。

搜索它,我偶然发现了 python 的 moviepy 包。问题是,即使是单个视频也需要大量时间。以下是我用来从单个视频开始截取 7 秒的代码 sn-p。写入过程消耗大量时间。有没有更好的方法来使用 python 剪切视频?

from moviepy.editor import *
clip = VideoFileClip("video1.mp4").cutout(0, 7)
clip.write_videofile("test.mp4")

如果我遗漏了任何细节,请告诉我。

感谢任何帮助。谢谢!

【问题讨论】:

  • 写入视频可能意味着库必须对其进行重新编码,从而导致质量下降和性能下降。 可以在不重新编码的情况下从 MP4 视频流中剪切出来,但这并不像您想象的那么简单,而且您不能在任意点剪切(仅在关键帧之前)。我也不知道moviepy能不能做到这一点。
  • 我同意@cemper93。 MoviePy 总是解码你的帧(到 Numpy 数组)并在写入时重新编码它们,这需要时间。在不重新编码的情况下进行剪切的最简单方法是使用 FFMPEG 从 mp4 中提取正确的片段。您可以直接在命令行中执行此操作,也可以从 Python 中使用子进程库调用 ffmpeg。
  • @Zulko:你能把它写成答案并添加更多解释吗?我不知道 FFMPEG 和您正在谈论的子进程库。 ://

标签: python video moviepy


【解决方案1】:

试试这个,告诉我们它是否更快(如果可以,它将直接使用ffmpeg提取视频,无需解码和重新编码):

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
ffmpeg_extract_subclip("video1.mp4", start_time, end_time, targetname="test.mp4")

如果这没有帮助,请查看code

【讨论】:

  • t1,t2的最小时间单位是多少?
  • 如果我不想剪切非关键帧会怎样?我可以用这段代码剪切任何地方吗?
  • 这是否适用于 mkv 等其他视频格式?还是会有不良影响?我是在 mkv 上完成的,它可以工作,但是当文件在 vlc 中启动时,它会出现半秒故障
  • 有没有办法使用重新编码标志运行?我认为故障可能是由于视频在哪里插入了关键帧?
  • from moviepy.editor import * // video = VideoFileClip("myHolidays.mp4").subclip(50,60) // 这一行来自他们的页面pypi.org/project/moviepy,并且是最新的。
【解决方案2】:

如果您是 moviepy 的新手,您应该按照以下步骤操作。

安装:

pip install --trusted-host pypi.python.org moviepy
pip install imageio-ffmpeg

旧系统的安装(在您的 virtualenv 中)版本:

pip install --trusted-host pypi.python.org moviepy
python
import imageio
imageio.plugins.ffmpeg.download()

执行这些命令后,您的软件要求最低。

用法

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
# ffmpeg_extract_subclip("full.mp4", start_seconds, end_seconds, targetname="cut.mp4")
ffmpeg_extract_subclip("full.mp4", 60, 300, targetname="cut.mp4")

【讨论】:

  • 顺便说一句,如果您希望禁用 ffmpeg_extract_subclip 的输出,则当前版本无法实现。你应该从git repo 安装moviepy,因为他们实际上最近添加了该选项。
【解决方案3】:
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
ffmpeg_extract_subclip("video1.mp4", t1, t2, targetname="test.mp4")

此代码中的t1 和t2 表示修剪的开始时间和结束时间。 t1 之前和 t2 之后的视频将被省略。

【讨论】:

    【解决方案4】:

    对于某些视频,ffmpeg_extract_subclip 没有为我生成正确的结果。来自 link 的以下代码仍然有效。

    # Import everything needed to edit video clips
    from moviepy.editor import *
    
    # loading video gfg
    clip = VideoFileClip("geeks.mp4")
    # getting only first 5 seconds
    clip = clip.subclip(0, 5)
    # showing clip
    clip.ipython_display(width = 360)
    

    然后你可以按如下方式保存剪辑:

    clip.write_videofile("clip.mp4")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2018-11-08
      相关资源
      最近更新 更多