TTYREC到GIF转换器

pyttygif的Python项目详细描述


Pyttygif

(又一个)ttyrec到gif转换器,用python编写

通过播放ttyrec文件并截屏终端模拟器,为终端会话创建(优化)动画gif。

pyttygif demo

ttyrec是一个用来记录tty输出并允许稍后回放的工具(和同名格式)。也许,它的一个最流行的用途是录制流氓游戏会话(例如nethack)以便稍后播放。在大多数Linux发行版中,可以从repos轻松安装。

Pyttygif的开发考虑了几个目标:

    速度。虽然大多数ttyrec到gif转换器要么非常慢,要么有很长的后处理阶段,但pyttygif相当快。它将大部分繁重的工作委托给快速的命令行工具(如convert和gifsicle),并使用多处理并行化工作。
  • 内存使用量适中。pyttygif不会将大量未压缩的位图加载到ram中(至少在默认情况下不会)。它也不会创建巨大的千兆字节临时目录。生成的gif也经过了优化,不占用太多磁盘空间。
  • 准确度。因为它会截图正在运行的终端-您可以通过配置终端仿真器外观来精确控制输出gif的外观。另外,pyttygif合并的ttyrec帧太短,因此生成的gif看起来很自然。
  • 灵活。pyttygif已经有了正常的默认值,但是如果你想调整一些东西-有很多高级选项。您可以调整gif优化级别,或者权衡更多的ram以减少处理时间。
  • 几乎没有依赖关系。pyttygif是用纯python实现的,应该可以在任何带有x11和python 3的linux系统上工作。对于图像处理,它依赖于诸如xwd、convert(来自imagemagick)和gifsicle之类的工具,这些工具在大多数主流发行版的repo中都是可用的。

警告:不建议在录制gif时移动、调整大小、最小化、与其他窗口重叠或与终端模拟器交互。它可能会导致伪影,捕获重叠窗口的一部分,并对生成的gif图像产生其他不希望的效果。或者(如果窗口被最小化),转换可能会完全失败。

安装

首先,确保安装了所有必需的依赖项。也就是说,x11应用程序、imagemagick和gifsicle。

例如,在debian/ubuntu中,应该可以使用以下命令:

sudo apt-get install x11-apps imagemagick gifsicle

在基于redhat的发行版中,应该执行以下操作:

sudo yum install xorg-x11-apps ImageMagick gifsicle

如果缺少任何必需的工具,pyttygif会通知您。

然后,从pip安装pyttygif:

sudo pip3 install pyttygif

最后,您可以像这样转换ttyrec:

python3 -m pyttygif sample.ttyrec ./sample.gif

用法

usage: __main__.py [-h] [-s SPEED] [-l LOOP] [-L LASTFRAME] [-m]
                   [-o {0,1,2,3}] [-S] [-b MAX_BACKLOG] [-D] [-f FPS]
                   [-c DELAYCAP] [-x LOSSY]
                   input output

Convert ttyrec to GIF animation

optional arguments:
  -h, --help            show this help message and exit

Main options:
  input                 Path to the ttyrec file to convert
  output                Path to save the resulting GIF
  -s SPEED, --speed SPEED
                        Speed multiplier
  -l LOOP, --loop LOOP  Number of times to play the GIF (0 = infinity)

Advanced options:
  -L LASTFRAME, --lastframe LASTFRAME
                        How long to display the last frame
  -m, --no-conserve-memory
                        Use more RAM for speedup
  -o {0,1,2,3}, --optimize-level {0,1,2,3}
                        Optimize the GIF (levels 0-3)
  -S, --no-disable-screensaver
                        Don't disable screensaver during record
  -b MAX_BACKLOG, --max-backlog MAX_BACKLOG
                        In-RAM image backlog size (0 = infinite)
  -D, --dirty           Don't clear screen before record
  -f FPS, --fps FPS     How many frames to screenshot per second
  -c DELAYCAP, --delaycap DELAYCAP
                        Cap the display time of single frame (in seconds)
  -x LOSSY, --lossy LOSSY
                        Use gifsicle lossy GIF compression mode (0-100)

对于最基本的用法,只需要指定所需的位置参数(输入ttyrec文件路径和输出gif文件路径)。您还可以指定-s通过(浮点)速度乘法器来加速或减慢输出gif,并指定播放gif的次数(0=无穷大)。

还提供了许多高级选项。

  • ttyrec格式不定义最后一帧的显示时间。但是,可以使用-l选项(浮点数)更改gif最后一帧的显示时间。默认为5秒。
  • pyttygif默认为尝试减少ram使用。如果您想加快转换速度,可以尝试使用-m标志(告诉gifsicle将帧保留在ram中)和-b选项,该选项调整ram中要排队的最大帧数,并默认为机器中的逻辑核心数。不推荐设置为小于核心数。您也可以将其设置为0(不受限制),但也不建议这样做,因为如果您的计算机无法及时处理所有帧,它可能会以足够长的ttyrec吃掉所有可用的ram。
  • gifsicle optimization level默认为2,但是您可以使用-o选项覆盖它,并将其设置在0-3的范围内(其中0根本不是优化,倾向于创建巨大的gif,3是最大值,但可能较慢)。
  • 默认情况下,pyttygif会尝试禁用屏幕保护程序(这样您就不必在录制gif时移动鼠标来阻止屏幕锁)。但是,如果出于某种原因(或者没有安装xdg屏幕保护程序),您可能需要用-s标志覆盖它。
  • pyttygif在录制前清除屏幕。但是,如果要捕获以前的终端内容,可以传入-d标志。
  • pyttygif没有任何方法可以同步到终端仿真器(而且它还希望尽可能多地与终端无关),因此解决此问题的唯一方法是在每个显示的帧之后睡眠一段固定的时间,以便给终端仿真器一些时间来呈现内容。pyttygif的默认安全值或多或少为25 fps(即每帧后0.04秒的睡眠时间)。但是,根据计算机的不同,您可能需要覆盖此选项,例如,使用60 fps。您可以使用-f选项指定fps。但是,请注意不要将此值设置得太高-pyttygif可能会实际捕获上一帧,这将导致输出gif中出现口吃和帧跳过。
  • 如果输入ttyrec中存在过长的延迟(例如当用户离开键盘时),则可以通过传递-c选项并指定帧可以占用的最长时间(以秒为单位)(浮点数)来限制此类延迟。如果任何帧超过指定的时间,则在该时间强制限制。它默认为正无穷大,即无上限。
  • 如果您有Gifsicle 1.92或更高版本,则可以使用有损压缩模式,该模式允许通过传递-x选项来生成更小的Gif,并指定压缩级别(0-100),其中更高级别会生成更小的Gif,代价是生成更多的伪影。

许可证

gplv3

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

推荐PyPI第三方库


热门话题
java根据选择随机设置图标   java如何将Android Studio与本地服务器数据库SQL server 2008连接?   java在点击鼠标后绘制一个椭圆形   java选项窗格相对于其父项的位置   java如何在Android中的switch case中使用String[]输入?   安卓无法从“15.0.1”确定java版本   如果满足特定条件,java是否重置计时器?   java是一个实体类,可以在OOAD中返回其他实体实例吗?   bash将对jar文件| cut | awk和java程序的调用集成到一个统一进程中   Spring安全更新身份验证成功时的最后登录日期   数据库身份验证中基于Java控制台的客户端服务器登录应用程序错误   java Selenium junit测试失败,驱动程序过早获取URL   java LibGdx多点触摸事件混淆   带扫描仪的java打印空间   来自旧版应用程序的java springcloudsleuth头   java如何实现模板设计模式?   java如何比较具有多个值的键的两个映射?   读取时R中的java MemoryError。xlsx