Julia中如何将多幅独立Figure合成动画?帧重复问题求助
问题原因及解决方法
问题原因
你的代码中,record函数一开始就绑定了传入的第一个fig对象(即figs[1])。在do块里对局部变量fig重新赋值,只是改变了这个局部变量的指向,完全不会影响record正在录制的初始Figure对象,所以最终动画只会重复显示第一帧。
解决方法
CairoMakie的record更适合动态更新同一个Figure内容的场景,针对你已生成100个独立Figure的情况,有两种可行方案:
方案1:将每个Figure的内容复制到同一个录制用的Figure中
复用一个空的Figure,每次循环把对应figs[frame]的内容复制进去,让record持续录制这个复用的Figure:
using CairoMakie frames = 1:100 fps = 20 # 创建一个空的录制用Figure record_fig = Figure() # 用一个轴容器来承载每个帧的内容 ax = Axis(record_fig[1,1]) record(record_fig, "test.mp4", frames; framerate=fps) do frame # 清空当前轴的所有内容 empty!(ax) # 获取当前帧的Figure current_fig = figs[frame] # 把当前帧Figure里的所有绘图内容复制到录制用的轴上 for elem in current_fig.content if elem isa Axis for plot in elem.plots copy!(ax, plot) end # 同步轴的范围、标签等属性 ax.xlabel = elem.xlabel ax.ylabel = elem.ylabel ax.xlims = elem.xlims ax.ylims = elem.ylims end end # 强制更新Figure record_fig.scene[] = record_fig.scene[] end
方案2:先导出所有Figure为图片,再用ffmpeg合成视频
如果方案1的复制操作有兼容性问题,更稳妥的方式是先把每个Figure导出为图片,再用ffmpeg合成动画:
using CairoMakie # 第一步:导出所有Figure为png图片 frames = 1:100 for frame in frames save("frame_$(lpad(frame, 3, "0")).png", figs[frame]) end # 第二步:用ffmpeg合成视频(需要系统已安装ffmpeg) run(`ffmpeg -framerate 20 -i frame_%03d.png -c:v libx264 -r 20 -pix_fmt yuv420p test.mp4`) # 可选:删除临时图片文件 for frame in frames rm("frame_$(lpad(frame, 3, "0")).png") end
内容的提问来源于stack exchange,提问作者yanscha
相关产品推荐
相关产品推荐

