MoviePy在Amazon ECS Docker容器中运行时出现音频读取错误
MoviePy在ECS环境生成视频失败,本地Docker正常的问题排查
问题背景
开发了一个基于MoviePy的视频生成脚本,打包在Docker容器中。本地Docker环境运行正常,但部署到Amazon ECS后,出现音频文件读取失败的错误。
错误信息
/tmp/334.mp31boi_q7b: Invalid data found when processing input Here are the file infos returned by ffmpeg: ffmpeg version 4.2.2-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8 (Debian 8.3.0-6) libpostproc 55. 5.100 / 55. 5.100 libswresample 3. 5.100 / 3. 5.100 libswscale 5. 5.100 / 5. 5.100 libavfilter 7. 57.100 / 7. 57.100 libavdevice 58. 8.100 / 58. 8.100 libavformat 58. 29.100 / 58. 29.100 libavcodec 58. 54.100 / 58. 54.100 libavutil 56. 31.100 / 56. 31.100 configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg OSError: MoviePy error: failed to read the duration of file /tmp/334.mp31boi_q7b.
关键代码片段
音频拼接代码:
audio_concat = concatenate_audioclips(audio_clips)
视频生成代码:
with tempfile.NamedTemporaryFile(prefix=video_path, suffix='', delete=False) as data: video.write_videofile(data.name, fps=24, codec="libx264", ffmpeg_params=['-f', 'mp4'], threads=multiprocessing.cpu_count())
Dockerfile
FROM ubuntu:latest ENV DEBIAN_FRONTEND noninteractive WORKDIR /video_composer COPY requirements.txt /video_composer/requirements.txt RUN apt-get update && apt-get install -y software-properties-common gcc && \ add-apt-repository -y ppa:deadsnakes/ppa RUN apt-get update && apt-get install -y python3.11 python3-distutils python3-pip python3-apt RUN apt-get -y update RUN apt-get install -y ffmpeg RUN pip install -r /video_composer/requirements.txt RUN python3 -m certifi COPY . /video_composer/ EXPOSE 8003 CMD ["uvicorn", "video_composer:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "8003"]
已尝试的无效方案
- 排查MoviePy读取文件时长的常见问题(如文件路径、权限、格式)
- 参考MoviePy官方仓库相关issue的解决方案
可能的原因及解决建议
1. 临时文件命名异常
错误中的临时文件名/tmp/334.mp31boi_q7b后缀混乱,ECS上的ffmpeg对文件名格式更敏感,无法识别非标准后缀的音频文件。
解决:给tempfile.NamedTemporaryFile指定正确的suffix参数,比如音频文件用.mp3,视频用.mp4:
# 视频生成代码修改 with tempfile.NamedTemporaryFile(prefix=video_path, suffix='.mp4', delete=False) as data: video.write_videofile(data.name, fps=24, codec="libx264", ffmpeg_params=['-f', 'mp4'], threads=multiprocessing.cpu_count())
2. ECS临时目录权限问题
ECS容器的/tmp目录权限可能比本地严格,导致ffmpeg无法读写临时文件。
解决:在Dockerfile中显式设置/tmp目录权限:
RUN chmod 777 /tmp
或者通过环境变量指定MoviePy使用自定义临时目录:
ENV MOVIEPY_TEMP_DIR /video_composer/temp RUN mkdir -p /video_composer/temp && chmod 777 /video_composer/temp
3. ffmpeg版本差异
本地Docker安装的ffmpeg与ECS上的4.2.2-static版本存在兼容性差异,新版本对异常文件的容错性更好。
解决:统一Docker镜像中的ffmpeg版本,比如使用与ECS相同的静态编译版本:
# 替换原apt安装ffmpeg的步骤 RUN wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz && \ tar xvf ffmpeg-release-amd64-static.tar.xz && \ mv ffmpeg-*-amd64-static/ffmpeg /usr/local/bin/ && \ mv ffmpeg-*-amd64-static/ffprobe /usr/local/bin/ && \ rm -rf ffmpeg-*-amd64-static ffmpeg-release-amd64-static.tar.xz
4. ECS任务资源不足
ECS任务配置的内存或磁盘空间不足,导致临时文件写入不完整,ffmpeg读取时发现数据损坏。
解决:调整ECS任务的资源配额,增加内存和磁盘空间分配。
5. 临时文件写入未完成
在ffmpeg读取临时文件前,文件可能未完全写入磁盘,导致数据不完整。
解决:确保文件句柄关闭后再进行处理,或手动刷新写入缓存:
import os with tempfile.NamedTemporaryFile(prefix=audio_path, suffix='.mp3', delete=False) as f: f.write(audio_data) f.flush() os.fsync(f.fileno()) # 强制写入磁盘
内容的提问来源于stack exchange,提问作者Giba
相关产品推荐
相关产品推荐

