🦖

Rust製ターミナル操作GIF録画ツールt-recの紹介

2021/07/19に公開2

コマンド出力の説明をするときなど、ターミナルでの操作を動画で記録・共有したいときがあります。
この手のサービスはasciinemaが有名ですね。
https://asciinema.org/

しかし、asciinemaで共有された動画はasciinemaのサイト上で再生するのが基本です。
以下のようにGitHubのREADME上では再生することができませんし、(現時点では)Zennにも埋め込めません。

https://github.com/asciinema/asciinema

そうなると、単純な操作例であればGIF動画で記録するのが便利です。
今回は、Rust製のt-recを紹介します。

https://github.com/sassman/t-rec-rs

Rust製ツール、blazingly fast[1]って言いがちですね。実際速い。

導入

MacであればHomebrewでインストール可能です。
なお、GitHubのリポジトリ名はt-rec-rsとなっていますが、ツール自体の名前はt-recです。

❯ brew install t-rec

使用法

t-recで起動し、そこからのターミナル操作が記録されます。

❯ t-rec

起動するとシェル画面がclearされ、[t-rec]: Press Ctrl+D to end recordingという説明が表示されます。

説明の通り、Ctrl+Dで録画を終了し、自動的にGIFとして出力されます。
出力先は同ディレクトリ、ファイル名はt-rec.gif[2]となっています。

ツールの操作説明などに使用する場合、[t-rec]: Press Ctrl+D to end recordingの説明が邪魔に感じますが、--quietオプションで消すことができます。
ほかにも、--end-pause 3sのようにして動画の終わりに3秒の待機時間を入れたり、--videoオプションでmp4形式で出力することもできます。
Blazingly fastを名乗るだけあって、なかなか軽快です。

help内容
❯ t-rec --help
t-rec 0.6.0
Sven Assmann <sven.assmann.it@gmail.com>
Blazingly fast terminal recorder that generates animated gif images for the web written in rust.

USAGE:
    t-rec [FLAGS] [OPTIONS] [shell or program to launch]

FLAGS:
    -h, --help          Prints help information
    -l, --ls-win        If you want to see a list of windows available for recording by their id, you can set env var
                        'WINDOWID' to record this specific window only
    -n, --natural       If you want a very natural typing experience and disable the idle detection and sampling
                        optimization
    -q, --quiet         Quiet mode, suppresses the banner: 'Press Ctrl+D to end recording'
    -V, --version       Prints version information
    -v, --verbose       Enable verbose insights for the curious
    -m, --video         Generates additionally to the gif a mp4 video of the recording
    -M, --video-only    Generates only a mp4 video and not gif

OPTIONS:
    -b, --bg <bg>                     Background color when decors are used [default: transparent]  [possible values:
                                      white, black, transparent]
    -d, --decor <decor>               Decorates the animation with certain, mostly border effects [default: shadow]
                                      [possible values: shadow, none]
    -e, --end-pause <s | ms | m>      to specify the pause time at the end of the animation, that time the gif will show
                                      the last frame
    -s, --start-pause <s | ms | m>    to specify the pause time at the start of the animation, that time the gif will
                                      show the first frame

ARGS:
    <shell or program to launch>    If you want to start a different program than $SHELL you can pass it here. For
                                    example '/bin/sh'

また、上で紹介したGIF自体がこのツールで録画したものです。
t-recでの録画中に更にt-recを実行することで、「t-recで録画して出力する操作をt-recで録画して出力」しています。
これ、ちょっと面白い挙動だと思いました。あまりやりすぎると録画中なのかわからなくなるので注意です[3]

ターミナル以外も録画可能

なんとターミナルではない一般のアプリケーションも録画可能です。

環境変数TERM_PROGRAMに対象のアプリケーションを設定して、ターミナル録画と同様にt-recを実行するだけです。任意のアプリをターミナルだと解釈しているということ…?

❯ TERM_PROGRAM="sidekick" t-rec
[t-rec]: Press Ctrl+D to end recording

終了時はt-recを実行したターミナルにフォーカスを移したうえでCtrl+Dです。

複数ウィンドウが開いている場合はアクティブな一つが対象になるようです。

おわりに

Rust製のGIF録画ツール、t-recの紹介でした。
動画ファイルではないので、GitHub、Zenn、その他多くのサイトで埋め込み可能です。
簡単な操作を記録・共有したいときに使ってみてください。

脚注
  1. またはblazing fast ↩︎

  2. 既に存在する場合はt-rec_1.gifのように番号がつく ↩︎

  3. クリストファー・ノーラン監督の『インセプション』っぽい ↩︎

Discussion

坦々狸坦々狸

便利ですが仕組み的にちょっとキツイところが有りますね

任意のアプリをターミナルだと解釈しているというかキャプチャ対象のプロセスが画面に表示してるウィンドウに対して定点キャプチャを掛けて最後に繋げてキャプチャ停止時にImageMagickのconvertコマンドでアニメーションGIFに変換してる感じの挙動でした

なのでキャプチャ中にtmpフォルダ配下にGIF変換する前の定点キャプチャされた画像が大量に保存されていきます

$ ls -lh /tmp/.*/*tga
-rw-rw-r-- 1 dev dev 8.8M  720 15:51 /tmp/.tmpKtAEQU/t-rec-frame-000000250.tga
-rw-rw-r-- 1 dev dev 8.8M  720 15:52 /tmp/.tmpKtAEQU/t-rec-frame-000000511.tga
-rw-rw-r-- 1 dev dev 8.8M  720 15:52 /tmp/.tmpKtAEQU/t-rec-frame-000000777.tga
-rw-rw-r-- 1 dev dev 8.8M  720 15:52 /tmp/.tmpKtAEQU/t-rec-frame-000001051.tga
-rw-rw-r-- 1 dev dev 8.8M  720 15:52 /tmp/.tmpKtAEQU/t-rec-frame-000001312.tga
-rw-rw-r-- 1 dev dev 8.8M  720 15:52 /tmp/.tmpKtAEQU/t-rec-frame-000001574.tga
-rw-rw-r-- 1 dev dev 8.8M  720 15:52 /tmp/.tmpKtAEQU/t-rec-frame-000001836.tga
〜略〜

この画像ファイルは画面に動きがある度に増えていきましたデフォルトが4fpsってREADMEに書いてあったんでキャプチャ対象の解像度と画面の動き次第ですがFHD解像度でキャプチャすると録画中に最大秒間35MB以上消費されていくと思います(1分で2G超える)なのでキャプチャ対象のウィンドウの解像度と録画時間によっては録画中にディスクが枯渇してしまう可能性がありますtmp溢れると起動できないアプリとか出てきますし結構危険ですね

また仕組み上仕方ないことですが純粋なCUI上ではこのコマンドは動作しないのでそういうときは変わらずscriptやasciinemaコマンドに頼るしか無いと思います

まだ鋭意開発中みたいなんでこの辺上手いこと解決してほしいですね

個人的には圧縮率の高い高画質のビデオエンコードを掛けたファイルを一時ファイルにしてそこからffmpegでアニメーションGIFに変換するような挙動をパラメータ指定で追加してくれたらいいなと思います

kawarimidollkawarimidoll

おお、なるほど…コメントありがたいです(全然そのあたりの仕組みを見てなかった)
確かにこれは危険なことになる可能性もありますね
現在はまだバージョン0.6.0なので、今後どう発展していくかって感じでしょうか