使用FFMpegFileWriter的grab_frame方法时子进程Figure参数报错
需要用复杂模拟生成的帧制作MP4文件,生成时无需显示画面,优先保证代码简洁而非性能。尝试用FFMpegFileWriter搭配grab_frame编写代码时出现报错:FFmpeg无法将"Figure(650x650)"解析为帧率,进而引发子进程调用错误。但FFMpegWriter配合FuncAnimation可正常运行,想知道是setup配置遗漏、安装问题还是存在bug?
代码如下:
fig, ax = plot.subplots(figsize=(6.5, 6.5)) assert(animation.FFMpegFileWriter().isAvailable()) writer = animation.FFMpegFileWriter(fig) writer.setup(fig, "test1.mp4",224) with writer.saving(fig,"test1.mp4", dpi=224): for i in range(len(frameSeg)): PlotFrame(i) writer.grab_frame() # writer.finish() print("done")
报错信息:
[image2 demuxer @ 0000021fab8c1000] 无法将选项值 "Figure(650x650)" 解析为视频帧率
[image2 demuxer @ 0000021fab8c1000] 设置选项 framerate 的值为 Figure(650x650) 时出错。
[in#0 @ 0000021fab8c1e00] 打开输入时出错:无效参数
打开输入文件 ... AppData\Local\Temp\tmpe19ci2wz\tmp%07d.png 失败。
打开输入文件出错:无效参数
subprocess.CalledProcessError: 命令 '['ffmpeg', '-framerate', 'Figure(650x650)', '-i', 'F:\Users\Kenne.DESKTOP-BT6VROU\AppData\Local\Temp\tmpe19ci2wz\tmp%07d.png', '-loglevel', 'error', '-vcodec', 'h264', '-pix_fmt', 'yuv420p', '-y', 'test1.mp4']' 返回非零退出状态 4294967274。
问题根源:参数传递混淆导致的错误。实例化
FFMpegFileWriter时传入fig,会让内部错误地将Figure对象当作帧率参数;同时setup方法的第三个参数应为dpi,但你之前的代码逻辑里把帧率的位置填成了dpi值,双重错误导致FFmpeg收到无效的帧率参数。修复后的代码:
import matplotlib.pyplot as plt import matplotlib.animation as animation fig, ax = plt.subplots(figsize=(6.5, 6.5)) # 实例化时指定帧率(比如10fps,根据需求调整) writer = animation.FFMpegFileWriter(fps=10) with writer.saving(fig, "test1.mp4", dpi=224): for i in range(len(frameSeg)): PlotFrame(i) # 假设PlotFrame是你定义的绘图函数 writer.grab_frame() print("done")
- 关键说明:
FFMpegFileWriter的构造函数不需要传入fig,而是通过fps参数指定视频帧率。writer.saving()上下文管理器会自动处理文件的初始化和收尾,无需手动调用finish()。FFMpegWriter配合FuncAnimation能正常运行,是因为FuncAnimation会自动完成帧率参数的正确传递,不会出现参数混淆。
内容的提问来源于stack exchange,提问作者GPU Programmer

