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

PythonAnywhere部署Telegram Bot遇MoviePy视频帧读取错误求助

问题:PythonAnywhere部署Telegram Bot后MoviePy无法读取视频文件

本地运行Python Telegram Bot脚本完全正常,但部署到PythonAnywhere平台后,执行视频生成操作时触发错误:MoviePy无法读取视频文件/home/AlisterK/video_clips/Video 2023-01-10 18 45 07.mp4的第一帧,提示可能文件损坏或FFmpeg版本过时。已尝试更新FFmpeg和MoviePy的多个版本,且确认视频文件未损坏,但问题仍未解决。

相关代码如下:

def generate_video(audio_path):
    input_folder = '/home/AlisterK/video_clips'  # Replace with your folder path
    output_file = '/home/AlisterK/output_combined_video.mp4'
    clip_duration = 3  # Duration of each clip in seconds
    num_clips = 10     # Number of video clips to select and combine

    width = 1080  # Replace with your desired width
    height = 1920  # Replace with your desired height

    video_clips = random_files_in_folder(input_folder, '.mp4', num_clips)

    clips = [VideoFileClip(os.path.join(input_folder, clip_file)).subclip(0, clip_duration) for clip_file in video_clips]
    standardized_clips = [clip.resize((width, height)) for clip in clips]  # Ensure consistent resolutions

    final_clip = concatenate_videoclips(standardized_clips)

    final_audio = AudioFileClip(audio_path)
解决方向
  • 手动指定FFmpeg路径:PythonAnywhere上MoviePy可能无法自动识别FFmpeg位置,在代码开头添加路径配置:

    from moviepy.config import change_settings
    change_settings({"FFMPEG_BINARY": "/usr/bin/ffmpeg"})
    

    可通过控制台执行which ffmpeg确认FFmpeg实际路径。

  • 处理文件名空格:视频文件名含空格可能导致路径解析异常,可重命名文件去掉空格,或用shlex.quote()处理路径:

    import shlex
    clips = [VideoFileClip(shlex.quote(os.path.join(input_folder, clip_file))).subclip(0, clip_duration) for clip_file in video_clips]
    
  • 转码视频到兼容编码:本地支持的编码在PythonAnywhere环境中可能不兼容,用FFmpeg将视频转码为H.264标准编码:
    控制台执行命令:

    ffmpeg -i "/home/AlisterK/video_clips/Video 2023-01-10 18 45 07.mp4" -c:v libx264 -crf 23 -c:a aac "/home/AlisterK/video_clips/converted_Video_2023-01-10_18_45_07.mp4"
    

    之后用转码后的文件测试。

  • 添加错误调试信息:在代码中加入异常捕获,打印详细错误和FFmpeg执行信息:

    import traceback
    try:
        clips = [VideoFileClip(os.path.join(input_folder, clip_file)).subclip(0, clip_duration) for clip_file in video_clips]
    except Exception as e:
        for clip_file in video_clips:
            try:
                VideoFileClip(os.path.join(input_folder, clip_file)).subclip(0, clip_duration)
            except Exception as clip_e:
                print(f"读取视频失败: {clip_file}")
                print(f"错误详情: {str(clip_e)}")
                print(traceback.format_exc())
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:51:06