moviepy调用write_videofile在Linux远程主机报FFMPEG编码器错误如何解决
问题修复方案
原因分析
该报错核心是Linux环境下的FFmpeg无法初始化输出流,OSError: [Errno 32] Broken pipe是FFmpeg进程异常退出后写入管道中断导致的,常见触发原因有3种:
- 服务器FFmpeg是裁剪版本,缺少H.264编码支持
- 合成后的视频宽/高为奇数,H.264编码器默认不支持奇数分辨率
- 输出参数未指定兼容的编码器和格式
修复步骤
第一步:安装带H.264支持的完整版FFmpeg
大部分轻量Linux镜像预装的FFmpeg做了功能裁剪,缺失libx264编码器,执行对应命令安装完整版本:
Debian/Ubuntu系服务器:
sudo apt update && sudo apt install ffmpeg libx264-dev -y
CentOS/RHEL系服务器:
sudo yum install epel-release -y && sudo yum install ffmpeg ffmpeg-devel -y
安装完成后执行ffmpeg -encoders | grep h264验证,输出包含libx264即为安装正常。
第二步:修改代码适配编码器规则
主要做两处调整:一是强制将视频分辨率修正为偶数,适配H.264编码要求;二是写文件时明确指定兼容的编码参数,修改后代码如下:
import random import moviepy.editor as mp import requests def video_watermark(url): corners = [("right", "top"), ("left", "top"), ("right", "bottom"), ("left", "bottom")] response = requests.get(url) with open("media/videos/raw_video.mp4", "wb") as file: file.write(response.content) video = mp.VideoFileClip("./media/videos/raw_video.mp4") # 修正分辨率为偶数,适配H.264编码要求 if video.size[0] % 2 != 0: video = video.crop(width=video.size[0]-1, x1=0) if video.size[1] % 2 != 0: video = video.crop(height=video.size[1]-1, y1=0) logo = (mp.ImageClip("./media/bold_logo.png") .set_duration(video.duration) .resize(height=50) .margin(right=8, top=8, opacity=0) .set_pos(random.choice(corners))) final = mp.CompositeVideoClip([video, logo]) # 明确指定编码参数,避免FFmpeg自动匹配出错 final.write_videofile( "./media/videos/ready_video.mp4", codec="libx264", audio_codec="aac", ffmpeg_params=["-pix_fmt", "yuv420p"] ) video_watermark("url")
第三步:检查目录读写权限
确保Linux服务器上./media/、./media/videos/目录有读写权限,可执行以下命令赋权:
chmod -R 755 ./media
内容的提问来源于stack exchange,提问作者HadiH2o
相关产品推荐
相关产品推荐

