matplotlib 动画电影:电影质量随时间下降

17 投票
2 回答
15063 浏览
提问于 2025-04-18 16:32

我正在尝试使用 animation.FuncAnimation 函数在 matplotlib 中制作一个动画电影。这个动画在互动时看起来很好,但当我用以下命令保存它时

anim2.save('somefilm.mp4',codec='mpeg4', fps=15)

开始的时候还不错,但之后就变得模糊了(无论是用 QuickTime 还是 vlc 播放,所以我觉得问题出在电影本身,而不是播放器)。

我尝试过使用 blitting,因为我觉得可能是画布没有重新绘制,但没有效果。增加比特率也没有帮助。

设置 dpi=500 确实改善了电影的质量,但这样一来,播放时就会反复卡顿,这让观看变得困难。

我只是想知道,这是不是能做到的最好效果,还是我漏掉了什么?

2 个回答

11

我之前在给大约3500帧的水流动画制作时也遇到了同样的问题,最后我找到了解决办法。我一直在尝试在anim.save的设置中调整比特率,但动画后面还是模糊不清。最后我发现,应该在定义写入器的时候设置比特率:

plt.rcParams['animation.ffmpeg_path']='C:/ffmpeg/bin/ffmpeg.exe'
writer=animation.FFMpegWriter(bitrate=500)
anim.save('T:/baysestuaries/USERS/TSansom/Tiltmeters/testdeployment/tilt2.mp4',
          writer=writer,fps=8)

如果我把比特率设置得低于500,动画还是会模糊。bitrate=-1codec='libx264'对我来说都没用。希望这能帮到你!

20

要深入了解这个问题,首先要明白视频文件通常是经过高度有损压缩的,而互动显示则没有压缩。常见的电影压缩方式在处理图形时往往效果很差,这主要与压缩参数有关。

你可以尝试以下四种方法:

  • 设置图像分辨率(通过 dpi),但这可能会让输出的视觉效果更差,因为问题通常不在于像素不足。

  • 设置图像比特率(通过 bitrate);比特率越高,视频质量就越好。你可以尝试设置 bitrate=-1,让 matplotlib 自动选择最佳比特率。

  • 更改编码格式(例如,使用 codec="libx264")。

  • 给编码器添加额外参数(例如, extra_args=['-pix_fmt', 'yuv420p'])。

不过,这些选项实际上依赖于视频编码器,这通常是一个第三方程序(一般是 ffmpeg),还取决于你的视频用途和平台。我建议你先试试添加参数 bitrate=-1,看看是否能改善情况。

如果你还是无法解决问题,请提供一个完整的(但尽量简单)示例,说明如何创建一个效果不好的文件。这样更容易找到问题所在!

撰写回答