You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:34:59