输出成图片
gui = ti.GUI('Ball', (512, 512))
ts = 0 # 定义一个变量
while gui.running:
ts += 1 # 循环一次加一
for k in range(100):
compute_force()
update()
gui.clear(0x112F41)
gui.circles(position.to_numpy(), color=0xfff000, radius=radius)
gui.line([0.8, 0.2], [0.1, 0.2], color=0xFFF000, radius=1)
gui.show(f'frame/{ts:04d}.png') # 将每一帧保存下来
# gui.show()
上面这段代码给出了将结果输出成图片形式。其中最主要是这一句:gui.show(f'frame/{ts:04d}.png')
,它会输出图片到 frame 文件夹,4位数字顺序编号,格式为png。
转成视频
先下载FFmepg
- 进入https://www.gyan.dev/ffmpeg/builds/
- 选择其中一个下载
- 解压存档到指定文件夹中,比如, “D:/YOUR_FFMPEG_FOLDER”;
- 关键步骤: 添加路径 D:/YOUR_FFMPEG_FOLDER/bin 到环境变量 PATH 中;
- 打开 Windows 下的 cmd 或 PowerShell ,然后输入这行命令
ffmpeg -version
来测试你的安装是否成功。 如果 ffmpeg 已经正确安装完毕,那么它的版本信息就会被打印出来。
使用ti video 转换成MP4
参考 :https://docs.taichi.graphics/lang/articles/cli_utilities#converting-pngs-to-video
在cmd中进入保存图片的文件夹,然后输入 ti video -f40
,然后得到video.MP4,40FPS
如果提示No module named PIL
,那么 pip install Pillow
使用FFmepg转成MP4
在命令行中输入:ffmpeg -framerate 60 -i ./frame/%04d.png -c:v libx264 -r 30 out.mp4
- 这里的 -framerate 指读取时的帧率,这里输出为 -r 30,所以相当于 60/30=2 倍加速。
论坛的 gif 大小限制 < 4MB,一定的加速和缩小分辨率有助于减小 gif 大小。 - -i ./frame/%04d.png 输入文件。
frame/%04d 和 python 里的统一就行 - -c:v libx264 x264 编码
- -r 30 输出 30 fps
- out.mp4 输出文件名
这样会在项目文件夹中得到一个out.mp4视频
转成gif
使用ti gif转成gif
得到视频之后,在当前文件夹输入 ti gif -i video.mp4 -f40
,然后就得到一个40FPS的gif
使用FFmpeg转成gif
ffmpeg -ss 00:00 -t 5 -i out.mp4 -vf "fps=25,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 out.gif
- -ss 00:00 -t 5 从 00:00 开始,剪辑 5 秒
- -i out.mp4 输入文件
- -vf -filter:v 的缩写,视频过滤器,后面的字符串是指定的参数
- fps=30
- scale=320:-1 等宽高比缩放到宽 320;lanczos 缩放算法
- split[s0][s1] 将视频分为两个流 s0, s1
细节参见 FFmpeg Filters Documentation - [s0]palettegen[p] 视频流 s0 生成调色板 p
- [s1][p]paletteuse 视频流 s1 通过调色板 p 进行下采样
- -loop 0 gif 无限循环;-1 不循环(只播放一遍)
- out.gif 输出文件
这样会在项目文件夹中得到一个out.gif的动图
师姐用的方法
新建一个.py文件:
import imageio
import os
# def export_gif():
gif_images = []
dirs = os.listdir("F:\\pythonProject1\\frame")
for d in dirs:
# if d[0:2] == "00":
gif_images.append(imageio.imread("F:\\pythonProject1\\frame" + "\\" + d)) # 读取多张图片
imageio.mimsave("hello.gif", gif_images, fps=40) # 转化为gif动画
-------------end----------
参考:https://forum.taichi.graphics/t/homework-0-new-shader-ffmpeg-gif/469