创建动画手的工作流程

我想创建YouTube视频,类似于白板动画。

Tldr问题:如何使用ffmpeg将包含alpha通道的无损rgb视频格式编码为?

更详细:我目前的工作流程如下所示:

我在Inkscape中绘制幻灯片,将所有要一次绘制的路径(一个场景如此说)分组,并将幻灯片存储为svg。 然后我运行一个自定义的Python脚本。 它按照https://codepen.io/MyXoToD/post/howto-self-drawing-svg-animation中描述的方式对幻灯片进行动画处理。 每个帧都以svg格式导出,转换为png格式并传送到ffmpeg以从中制作视频。

对于每个场景(绘制几条路径,每张幻灯片有几个场景),我创建一个自己的视频文件,然后我还存储一个包含该视频最后一帧的png文件。

然后我使用kdenlive将它们结合在一起:一个包含第一个场景绘制的视频,然后是一个png,它在我谈论绘图时保存视频的最后一个图像,然后是下一个动画,然后是下一个静止图像我继续说话等等。 我使用这些中间图像,因为冻结最后一帧在kdenlive中是乏味的,我有大约600个场景。 我在这里进行编辑,调整静止图像的持续时间并呈现最终视频。

视频的背景是一张永不变化的黑板照片,笔画是带有滤镜的路径,使其看起来像粉笔。

到目前为止,一切都很顺利。

我的问题是:无论何时在动画和静止图像之间存在转换,它都会在最终结果中可见。 我尝试了几种方法来完成这项工作,但没有任何缺陷。

我的第一个方法是将动画编码为mp4,如下所示:

p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'png', '-r', str(fps), '-i', '-', '-vcodec', 'libx264', '-crf', '21', '-bf', '2', '-flags', '+cgop', '-pix_fmt', 'yuv420p', '-movflags', 'faststart', '-r', str(fps), videofile], stdin=PIPE)

这是YouTube推荐的。 但是,在视频和静止图像之间有一点亮度差异。

然后我用png编解码器试着mov:

p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'png', '-r', str(fps), '-i', '-', '-vcodec', 'png', '-r', str(fps), videofile], stdin=PIPE)

我认为这会将每一帧编码为视频中的png。 它会创建更大的文件,因为每个帧都是单独编码的。 但是没关系,因为我可以使用透明度作为背景并存储粉笔笔画。 但是,有时我想要将滑块上的部分粉笔滑过,这是通过在背景上绘制背景来实现的。 如果存储在视频中的叠加动画背景块与背景中的底层png完全一样,那么这将起作用。 但事实并非如此。 它稍微模糊一些,我相信颜色也会变化很小。 我不明白,因为我认为视频只是存储了一系列PNG ......有没有我想念的质量设置?

然后我阅读了关于ProRes4444并尝试:

p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'png', '-r', str(fps), '-i', '-', '-c:v', 'prores_ks', '-pix_fmt', 'yuva444p10le', '-alpha_bits', '8', '-profile:v', '4444', '-r', str(fps), videofile], stdin=PIPE)

这实际上似乎工作。 然而,动画文件比它们包含的一堆png文件大,可能是因为这种格式每个通道存储12位。 这并不可怕,因为只有中间的视频变大了,最终的结果还是可以的。

但理想情况下,会有一个无损编解码器,它在rgb色彩空间中存储每通道8位,8位alpha并仅考虑与前一帧的差异(因为帧与帧之间的所有变化都是一小笔粉笔画)。 有这样的事吗? 另外,我也可以没有透明度,但我必须将背景存储在每个场景中。 但是,如果只有一个场景中帧之间存储的变化是可以管理的。

或者我应该在工作流程中完成一些根本性的改变?

对不起,这是相当漫长的,我感谢任何帮助。

干杯!

链接地址: http://www.djcxy.com/p/56957.html

上一篇: Workflow for creating animated hand

下一篇: SVG symbol currently not displaying in chrome