使用MoviePy转换EXR序列为MP4时-apply_trc参数报错如何解决?
解决MoviePy中EXR转视频时
-apply_trc参数报错的问题 问题原因
-apply_trc是FFmpeg的输入处理参数,需要放在输入文件路径(-i)之前,用于处理EXR的线性颜色空间转换。而你在MoviePy中通过ffmpeg_params传递该参数时,MoviePy会默认把这些参数传给输出编码环节,FFmpeg会误认为这是输出编码器的选项,因此报错。
解决方案
方案1:直接调用FFmpeg命令(推荐,速度最快)
既然手动运行FFmpeg命令能正常工作,直接在Python中通过subprocess执行该命令即可,完全复用已验证的参数:
import subprocess # 替换为你的EXR序列路径和输出路径 subprocess.run([ "ffmpeg", "-y", "-apply_trc", "iec61966_2_1", "-i", "folder_to_my_exrs/input_%d.exr", "-vcodec", "mpeg4", "output.mp4" ], check=True)
方案2:用MoviePy的VideoFileClip读取序列并指定输入参数
如果需要后续用MoviePy做剪辑操作,可以用VideoFileClip直接读取EXR序列,将-apply_trc作为输入参数传入:
from moviepy.editor import VideoFileClip # 读取EXR序列时指定FFmpeg输入参数 clip = VideoFileClip("folder_to_my_exrs/input_%d.exr", ffmpeg_params=["-apply_trc", "iec61966_2_1"]) # 写入视频,无需再传递颜色转换参数 clip.write_videofile("output.mp4", codec="mpeg4")
方案3:手动转换EXR颜色空间后生成Clip
如果需要对单帧做额外处理,可以手动加载每个EXR文件,将线性RGB转换为sRGB(对应iec61966_2_1的传递特性):
import cv2 import numpy as np import glob from moviepy.editor import ImageSequenceClip def convert_exr_to_srgb(exr_path): # 读取EXR线性RGB图像(OpenCV默认读入为BGR) img = cv2.imread(exr_path, cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH) # 转换为RGB格式 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 线性RGB转sRGB的标准公式 srgb_img = np.where( img_rgb <= 0.0031308, 12.92 * img_rgb, 1.055 * np.power(img_rgb, 1/2.4) - 0.055 ) # 转换为8位视频兼容格式 return (srgb_img * 255).astype(np.uint8) # 获取排序后的EXR文件列表 exr_files = sorted(glob.glob("folder_to_my_exrs/*.exr")) # 批量处理所有帧 frames = [convert_exr_to_srgb(file) for file in exr_files] # 创建剪辑并输出视频 clip = ImageSequenceClip(frames, fps=24) clip.write_videofile("output.mp4", codec="mpeg4")
内容的提问来源于stack exchange,提问作者0xbadf00d
相关产品推荐
相关产品推荐

