gpt4 book ai didi

python - 在连接文件、不匹配的音频、编码时,MoviePy 较小的剪辑拆分会导致故障

转载 作者:行者123 更新时间:2023-12-04 09:25:48 26 4
gpt4 key购买 nike

我的代码如下。 断路器文件:

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip

splits = [[1, 2], [5, 6], [7, 10]]

for i, split in enumerate(splits):
start, end = split
ffmpeg_extract_subclip("video.m4v", start, end, targetname="clips/{0}.mp4".format(i))
此断路器代码有效并成功地将剪辑分成适当的长度。打开它们时,我收到以下错误:
  • 在 VLC 中打开子剪辑时出现故障撕裂 (example)
  • 与实际观看时长相比,视频时长不正确
  • 例如在维加斯,每个子剪辑的音频比视频短
  • 当尝试将这些视频连接成一个更大的视频(下面的代码)时,当剪辑加入时,“过渡”会在播放新剪辑之前重复上一视频的最后几分钟几秒钟

  • 连接代码:
    from moviepy.editor import *

    clips = []
    for i in range(1, 3):
    clips.append(VideoFileClip("{0}.mp4".format(i)))

    concat = concatenate_videoclips(clips)
    concat.write_videofile("output.mp4")
    这也有效,但在打开时我收到了上面第 (4) 点中写的错误。
    额外的信息:
  • 我使用了同一个视频的两个原始版本,一个是原始视频 (2.42gb),另一个是我通过 Handbrake 的编码运行的版本,以确保这不是问题。
  • 我也对输出进行了编码,以防万一这是问题(再次手刹)并且问题保持不变。
  • 昨天运行这两个代码位时这不是问题,从那时起我所做的唯一操作是尝试重新安装 MoviePy( pip uninstall moviepy -> pip install moviepy==1.0.1 ,我目前在版本 1.0.3 - 如果我在 Python 的默认安装中缺少某些东西,请告诉我)
  • 该问题与语法错误无关,我已对代码进行了解释以使其更易于阅读

  • 这是拉斯维加斯单独查看这些文件的屏幕截图(我没有剪切它们,这只是我将它们直接粘贴到拉斯维加斯):
    image of sony vegas with this moviepy issue
    更新:我试过下载 FFMPEG 的 exe并为我的拆分直接调用它(不使用 Python 下载版本//FFMPEG 的电影链接),问题仍然存在。我的想法来自 this Stack post .
    更新:我已经尝试了很多方法来排除原始文件被拆分为问题的可能性,但我开始相信这个问题在串联文件中得到了高度重视。将尝试寻找此功能的旧版本。
    更新:对于我更改 MoviePy 的每个版本,都会发生一些令人反感的变化。在 2.0.0 ,子剪辑的结尾被卡住,而没有音频播放。在 1.0.0剪辑的开始出现故障。在 1.0.1-2 ,剪辑的末端在移入新剪辑时会出现故障。极度迷茫。
    更新:我无法确定从哪个角度来解决这个问题。例如:我尝试了一个不同的视频,在第一次运行时它是半可行的(扔进维加斯,移动它以获得正确的时间,将其渲染为一个合格的视频)但是一旦我做出改变(比如尝试在剪辑时添加一两秒钟)就好像一切都只是不同步并放弃了。一旦我恢复到之前的正常剪辑(这是可行的),剪辑就根本无法预测,并且完全不同步。我现在正在寻找的只是卸载和重新安装的东西,或者替代方法。

    最佳答案

    故障是因为您可能没有指定时间戳的关键帧。因为非关键帧编码与最近关键帧的差异,它们只显示与前一个关键帧的差异,这就是为什么它们非常节省内存,但不一致。类似的理论也适用于音频,并且取决于编解码器/格式 ofc!
    在核心moviePY也使用ffmpeg工具,这是API引用的官方页面,以及引擎盖下的详细信息,
    https://zulko.github.io/moviepy/_modules/moviepy/video/io/ffmpeg_tools.html
    使用 mp4 容器,无需使用编辑列表重新编码即可在非关键帧处进行剪切 (Problem about edit list) .换句话说,如果 3s 之前最近的关键帧是 0s,那么它将复制从 0s 开始的视频并使用编辑列表告诉播放器不是在 3 秒而是从 0s 开始播放,因为它最近的关键帧其余帧被丢弃.这就是为什么有时音频播放和视频图像挂起,但时间线继续运行的原因。
    你所做的,它不会重新编码原来的东西!它只是在最近的关键帧处拆分为您指定的开始/结束时间,并且它们的间隔不相等,因此最终结果的长度不等。
    不要这样做:
    即使它是最快和最好的 ffmpeg 方式,我已经弄清楚了,这就是我认为您的方法正在做的事情:

    ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4
    但下面的东西将剪切并重新编码:
    ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
    重新编码时,您可能还希望包含其他编解码器选项,然后使用它:
    ffmpeg -ss 00:03:00 -t 00:00:05 -i test.wmv -acodec libmp3lame -vcodec libx264 1.mp4

    But swami Whats the difference?

    We are not using the -c copy parameter. hence not just dumping the raw I/O stream. but re encoding it again, more cpu work required!



    此外,-t 选项指定持续时间,而不是结束时间。上面的命令(第二个代码片段)将从 3s 开始编码 8s 的视频。要从 3 秒开始到 8 秒结束,请使用 -t 5(第三个代码段)。
    注意:如果您使用的是 ffmpeg 的当前版本(我猜是 2015 年以上),您还可以在上述命令中将 -t 替换为 -to 以在指定时间结束。

    关于python - 在连接文件、不匹配的音频、编码时,MoviePy 较小的剪辑拆分会导致故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63013453/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com