多处理友好动画

pympanim的Python项目详细描述


多处理动画

摘要

这个库帮助用python从图像构建电影。特别是 打算允许多个线程生成粘在一起的图像 与ffmpeg一起看电影。

用例

这可以用于在使用 MatplotLib动画。ffmpeg将使用多线程将图像编码为 然而,如果你有 有很多可用的内核。因此,这将大大减少 生成matplotlib动画。

这也可以用于生成场景 PIL

这个图书馆的目标是首先使生成视频尽可能简单, 然后在这些简单的技巧中尽可能快的进行。这给了快速 对于许多项目来说都有足够的性能,并且有巨大的好处 可以在这个问题上投入更多的硬件。直接使用ffmpeg 多线程图像生成不会扩展到更多硬件。

性能

在理想的设置下,图像的生成速度应该是 不填充ffmpeg进程输入管道。这将确保图像 以尽可能快的速度生成。

默认情况下,此库将尝试查找完成此操作的设置 任务。这需要一点时间来完成,所以最终的设置是公开的 当重新运行大致相同的任务时,使用它们会很有帮助。这个 正确的设置将取决于生成图像所需的时间以及 对它们进行编码需要很长的时间,这些编码根据图像的统计信息而变化。

安装

pip install pympanim

依赖关系

这取决于正在安装的ffmpeg。可以安装 here。其他python依赖项将是 由PIP自动安装。

用法-acts

动机

很多时候,你有一些东西能够呈现一些潜在的 以一致的方式陈述,你想要制作的视频是由 操作发送到渲染器的状态的部分。这个用例 由pympanim/acts.py专门处理。

小结

定义完全描述如何在 子类pympanim.acts.ActState。然后创建可以渲染的对象 图像的给定状态(通过rgba字节或枕头图像描述)。

准备好后,创建(一个或多个)Scenes,即 操纵刚刚创建的状态。一个场景有一定的持续时间,并且必须 能够将状态设置为与场景中的特定时间相对应。

这个库将提供场景的常见操作-非线性时间 操作、裁剪、反转和排序。充分利用 这些操作、场景应该尽可能简单。

多个动作可以以几乎相同的方式组合。见用法-框架 发电机详情如下。

要生成视频,请使用pympanim.worker.produce,创建帧生成器 使用pympanim.acts.Act

样板

importPIL.Imageimportpympanim.workeraspmawimportpympanim.actsasactsimportpympanim.frame_genasfgimportosclassMyActState(acts.ActState):passclassMyActRenderer(acts.ActRenderer):@propertydefframe_size(self):return(1920,1080)# in pixelsdefrender(self,act_state:MyActState)->bytes:returnfg.img_to_bytes(self.render_pil(act_state))defrender_pil(self,act_state:MyActState)->PIL.Image:# By default, render_pil delegates to render. It is shown reversed# here for completeness.returnPIL.Image.new('RGBA',self.frame_size,'white')classScene1(acts.Scene):@propertydefduration(self):return1# 1 millisecond; allows you to treat time_ms as % progressdefapply(self,act_state:MyActState,time_ms:float,dbg:bool=False):# dbg is passed across the scene heirarchy and will be false when# rendering the video. you may find it helpful to print some debug# information when it is truepassdef_scene():scene=Scene1()return(acts.FluentScene(scene).dilate(lambdax:x**2)# any easing works here. see# pympanim.easing and pytweening.time_rescale(1/10000)# 10s of real time corresponds to# 1ms of scene time.build())def_main():os.makedirs('out',exist_ok=True)act_state=MyActState()act_renderer=MyActRenderer()pmaw.produce(acts.Act(act_state,renderer,[_scene()]),fps=60,dpi=100,bitrate=-1,outfile='out/video.mp4')if__name__=='__main__':_main()

对于方法级文档,使用内置的help命令,即

>python3
>>> import pympanim.acts
>>> help(pympanim.acts)
Help on module pympanim.acts in pympanim:
.. (omitted for readme brevity) ..

用法-帧生成器

动机

这个库中最新颖的部分是生成视频的样板文件,其中 图像生成本身是多线程的。这是以一种原始的方式暴露出来的 尽可能使用pympanim/frame_gen.py,它仅由 pympanim/acts.py。本节讨论如何使用此库 抽象。

小结

创建pympanim.frame_gen.FrameGenerator的子类,它需要 定义持续时间、以像素为单位的帧大小和generate_at函数 可以生成视频中给定时间的图像。

这个库提供了常见的视频操作,您可以将 视频,如裁剪、时间膨胀、反转时间和组合 帧生成器的。

到P制作视频,使用pympanim.worker.produce。其他事情都处理好了 对于您,包括对性能设置和运行时的合理猜测 性能调整。

样板

importPIL.Imageimportpympanim.frame_genasfgimportpympanim.workeraspmawimportosclassMyFrameGenerator(fg.FrameGenerator):@propertydefduration(self):return1# 1 ms, allows you to treat time_ms as % progress@propertydefframe_size(self):return(1920,1080)# in pixelsdefgenerate_at(self,time_ms):# by default generate_at_pil delegates to generate_at. we show the# reverse for completenessreturnfg.img_to_bytes(self.generate_at_pil(time_ms))defgenerate_at_pil(self,time_ms):# this from white to red, you can do whateverreturnPIL.Image.new('RGBA',self.frame_size,f'#{int(time_ms*255):02x}0000')def_fg():base=MyFrameGenerator()# random example of the stuff you can doreturn(fg.FluentFG(base).time_rescale(1/10000)# 10s long.then(# after currentfg.FluentFG(base)# play again.time_rescale(1/10000)# also 10s long.reverse()# but this time in reverse.build()).build())def_main():os.makedirs('out',exist_ok=True)pmaw.produce(_fg(),fps=60,dps=100,bitrate=-1,outfile='out/video.mp4')if__name__=='__main__':_main()

示例

示例/文件夹包含以下示例的源代码:

python3 -m examples.redsquare

产生https://gfycat.com/digitalmaleflyingfish

python3 -m examples.mpl_line

产生https://gfycat.com/wickedpracticalattwatersprairiechicken

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在JavaFX TableView中设置行高   java生成范围内的随机数   ProcessBuilder或DefaultExecutor启动的“RunAs”子进程的java读取标准输出   java ExoPlayer播放多个视频   基于匹配器的java Mockito ArgumentCaptor捕获条件   java正在创建更新程序。更新/下载部分   java请求。getAttribute()在servlet中不起作用   java Android Http请求:我不理解以下代码:   java ArrayList Failfast ConcurrentModificationException   if语句Java/LWJGL Pong AI问题   使用Oracle 10g长字段填充Grails域对象时的java空指针   当用户触摸屏时,java按钮不从左上角移动到右下角   未捕获javasocket读取IOException?   用Java绘制一段圆的几何图形?