Mitchie M氏の「FREELY TOMORROW」のMVが影絵風のモーショングラフィックスで、これはモノクロ化してTMG1で再生したら映えるのでは……と思い立ったのがきっかけです。実際にやってみたら思わぬ壁にぶつかり、その解決のために作ったツールが半日で公開までできてしまいました。
AIのおかげでツール作成が短時間でできるようになったので、思い立ったが吉日とはこのことですね。
まずは実機で再生した様子をどうぞ。
背景:一律変換だとディテールがつぶれる
TMG1はESP32+SSD1306向けの1bpp動画コーデックです。1bppということは、各ピクセルは白か黒かの2値しかありません。カラーやグレースケールの動画をこの2値に落とし込むには、ffmpeg でモノクロ2値化(monob 相当の処理)をかけるわけですが、ここで問題が出ました。
「FREELY TOMORROW」のMVは影絵風とはいえ、シーンによって描画の細かさが大きく違うんですね。大きくはっきりしたシルエットが動くシーンもあれば、細かい線が密集するシーンもある。これを動画全体に一律の閾値・ディザ設定で変換すると、あるシーンではきれいに出るのに、別のシーンではディテールが完全につぶれてしまう、ということが起きました。
動画全体で最適な設定は一つに定まらないことが多いです。
作ったもの:区間ごとに設定を変えて分割エンコード
そこで、こう考えました。動画を区間ごとに分けて、それぞれに最適な変換設定を割り当てて、最後に連結すればいい、と。
これを手作業で ffmpeg を叩いてやるのは骨が折れるので、支援ツールとして tmg1-studio を作りました。ざっくりした処理の流れはこんな感じです。
flowchart TD
A["入力動画"] --> B["区間に分割"]
B --> C1["区間1<br/>設定A で変換"]
B --> C2["区間2<br/>設定B で変換"]
B --> C3["区間3<br/>設定C で変換"]
C1 --> D["連結"]
C2 --> D
C3 --> D
D --> E["RAW / TMG1 で出力"]
区間ごとに閾値やディザ設定をプレビューしながら調整して、最終的に連結したものを RAW または TMG1 形式 で書き出せるようにしました。
1bpp化した映像を他の用途に使いたい場合にも流用できます。
半日で公開までできた
面白かったのはここからで、思い立ったが吉日ということで、仕様だけ書き出してClaude Codeに渡したら、即日で完成して公開までできてしまいました。ツールの構想からリポジトリ公開まで、半日ほどの出来事です。
技術スタックには Rust + Tauri 2.0 を採用しました。これが想像以上に快適で、
- 動作が軽量:ネイティブなので起動も処理もキビキビ動く
- 容量が軽量:ビルド成果物が小さい
- UIをCSSでデザインできる:見た目の調整が非常に容易
- クロスコンパイルがあっさり通った:特に苦労なくマルチプラットフォーム対応できた
正直、この体験をすると「Electronは淘汰されていくのかな」と思ってしまいますね。
Tauri 2.0 とは
軽く紹介しておくと、TauriはWebフロントエンド(HTML/CSS/JavaScript)でUIを作り、バックエンドをRustで書けるデスクトップアプリのフレームワークです。
Electronとよく比較されますが、大きな違いはアプリ本体にブラウザエンジンを同梱しない点です。ElectronはChromiumを丸ごと抱え込むためアプリが数百MB級になりがちですが、TauriはOS標準のWebViewを使うので、成果物が非常に軽量になります。
2.0ではデスクトップに加えてモバイル(iOS / Android)もサポート対象になり、プラグインシステムやIPC周りも刷新されました。「Webの資産でUIを作りつつ、中身はRustで固めたい」という用途にはかなり相性が良いです。
まとめ
- TMG1向けにモノクロ動画を作るとき、一律変換ではシーンによってディテールがつぶれる問題があった
- 区間ごとに設定を変えて分割エンコード→連結するツール
tmg1-studioを作って解決した - RAW出力もできるので、TMG1以外の用途にも使える
- 仕様を書いてClaude Codeに渡したら半日で公開まで到達した
- Rust + Tauri 2.0 は軽量・クロスコンパイル容易・UIがCSSで組めると三拍子そろっていて、開発体験が非常に良かった
リポジトリはこちらです。

以上!



コメント