You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MoviePy write_videofile中途无报错停止的原因与调试修复方案

MoviePy执行write_videofile停滞问题排查与修复

使用MoviePy拼接无音频视频时,脚本执行write_videofile()中途停滞,无崩溃无异常,仅打印若干缺失帧警告后卡在某一帧,CPU占用骤降,长时间无响应。

问题代码

from moviepy import *
import os

def video():
  folder_path = "vid"
  output_path = "vid/videowithoutaudio.mp4"
  clips = []
  for filename in os.listdir(folder_path):
      if filename.lower().endswith(('.mp4', '.avi', '.mov')):
          filepath = os.path.join(folder_path, filename)
          clip = VideoFileClip(filepath)
          if clip.audio is None:
            print(f"Warning: {filename} has no audio.")
            clips.append(clip)    
      if not clips:
        print("module check")


  final_clip = concatenate_videoclips(clips, method='compose')   
  final_clip.write_videofile(output_path, codec='libx264', audio_codec='aac')

警告信息示例

UserWarning: In file vid\video4.mp4, 4907520 bytes wanted but 0 bytes read at frame index 49 (out of a total 49 frames), at time 2.04/2.06 sec. Using the last valid frame instead.


可能原因

  • 源视频文件损坏:从警告信息来看,部分视频存在帧读取失败的情况,说明文件本身有损坏、截断或编码异常。MoviePy会尝试用最后一帧替代,但后续遇到无法恢复的错误时,会陷入无限等待。
  • 视频编码兼容性问题:待拼接的视频分辨率、帧率、像素格式差异过大,concatenate_videoclips的compose模式在统一格式过程中出现阻塞。
  • FFmpeg进程异常:MoviePy底层依赖FFmpeg处理视频,若FFmpeg因文件问题卡住,上层Python进程不会主动终止,表现为脚本停滞。

调试与修复方案

1. 排查并修复损坏的源视频

  • 用FFmpeg检查可疑视频:执行以下命令,查看是否有明确的错误信息:
    ffmpeg -i vid/video4.mp4 -v error -f null -
    
  • 重新编码损坏视频:对报错的视频进行转码修复,替换原文件后再运行脚本:
    ffmpeg -i vid/video4.mp4 -c:v libx264 -crf 23 vid/fixed_video4.mp4
    

2. 统一视频格式后再拼接

在添加视频到clips列表前,强制统一分辨率和帧率,避免compose模式处理时出错:

clip = VideoFileClip(filepath).resize(newsize=(1920, 1080))  # 统一分辨率为1080P
clip = clip.set_fps(30)  # 统一帧率为30FPS

如果所有源视频格式一致,可改用method='chain'模式拼接,减少格式转换的开销和风险。

3. 添加异常捕获与详细日志

在读取视频和写入文件时添加日志与异常捕获,定位具体出错的视频片段:

import logging
logging.basicConfig(level=logging.INFO)

def video():
  folder_path = "vid"
  output_path = "vid/videowithoutaudio.mp4"
  clips = []
  for filename in os.listdir(folder_path):
      if filename.lower().endswith(('.mp4', '.avi', '.mov')):
          filepath = os.path.join(folder_path, filename)
          try:
              clip = VideoFileClip(filepath)
              logging.info(f"成功读取视频: {filename},时长: {clip.duration:.2f}s")
              if clip.audio is None:
                print(f"Warning: {filename} has no audio.")
                # 统一格式
                clip = clip.resize(newsize=(1920, 1080)).set_fps(30)
                clips.append(clip)
          except Exception as e:
              logging.error(f"读取视频{filename}失败: {str(e)}")
              continue
      if not clips:
        print("module check")

  final_clip = concatenate_videoclips(clips, method='compose')   
  final_clip.write_videofile(
      output_path,
      codec='libx264',
      audio_codec='aac',
      verbose=True  # 开启FFmpeg详细输出,监控实时处理状态
  )

4. 升级依赖版本

过时的MoviePy或FFmpeg可能存在已知bug,执行以下命令升级MoviePy:

pip install --upgrade moviepy

同时确保FFmpeg为最新稳定版,可从官方渠道下载替换旧版本。


内容的提问来源于stack exchange,提问作者Kilian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:07:05