Rust製ターミナル操作GIF録画ツールt-recの紹介
コマンド出力の説明をするときなど、ターミナルでの操作を動画で記録・共有したいときがあります。
この手のサービスはasciinemaが有名ですね。
しかし、asciinemaで共有された動画はasciinemaのサイト上で再生するのが基本です。
以下のようにGitHubのREADME上では再生することができませんし、(現時点では)Zennにも埋め込めません。
そうなると、単純な操作例であればGIF動画で記録するのが便利です。
今回は、Rust製のt-recを紹介します。
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、その他多くのサイトで埋め込み可能です。
簡単な操作を記録・共有したいときに使ってみてください。
Discussion
便利ですが仕組み的にちょっとキツイところが有りますね
任意のアプリをターミナルだと解釈しているというかキャプチャ対象のプロセスが画面に表示してるウィンドウに対して定点キャプチャを掛けて最後に繋げてキャプチャ停止時にImageMagickのconvertコマンドでアニメーションGIFに変換してる感じの挙動でした
なのでキャプチャ中にtmpフォルダ配下にGIF変換する前の定点キャプチャされた画像が大量に保存されていきます
この画像ファイルは画面に動きがある度に増えていきましたデフォルトが4fpsってREADMEに書いてあったんでキャプチャ対象の解像度と画面の動き次第ですがFHD解像度でキャプチャすると録画中に最大秒間35MB以上消費されていくと思います(1分で2G超える)なのでキャプチャ対象のウィンドウの解像度と録画時間によっては録画中にディスクが枯渇してしまう可能性がありますtmp溢れると起動できないアプリとか出てきますし結構危険ですね
また仕組み上仕方ないことですが純粋なCUI上ではこのコマンドは動作しないのでそういうときは変わらずscriptやasciinemaコマンドに頼るしか無いと思います
まだ鋭意開発中みたいなんでこの辺上手いこと解決してほしいですね
個人的には圧縮率の高い高画質のビデオエンコードを掛けたファイルを一時ファイルにしてそこからffmpegでアニメーションGIFに変換するような挙動をパラメータ指定で追加してくれたらいいなと思います
おお、なるほど…コメントありがたいです(全然そのあたりの仕組みを見てなかった)
確かにこれは危険なことになる可能性もありますね
現在はまだバージョン0.6.0なので、今後どう発展していくかって感じでしょうか