世界を動かす技術を、日本語で。

Lazycut: FFmpegを使用したシンプルなターミナル動画トリマー

概要

lazycut は、ターミナル上で動作する 動画トリミングツールキーボード操作 でイン・アウトポイントの設定と クリップ出力 が可能。 アスペクト比制御 にも対応。 macOSWindows でインストール方法が異なる。 ffmpegchafa などの依存関係あり。

lazycut:ターミナル動画トリミングツール

  • ターミナル上 で動画の トリミングクリップ出力 を実現
  • インポイント/アウトポイント をキーボードで簡単に指定
  • アスペクト比 の調整機能
  • ffmpeg を利用した高品質な動画処理
  • クロスプラットフォーム対応 (macOS/Windows)

インストール方法

  • macOS
    • Homebrewで独自タップを追加
      • brew tap emin-ozata/homebrew-tap
      • brew install lazycut
  • Windows
    • Releasesページから最新バイナリをダウンロード
      • 例: lazycut_X.X.X_windows_amd64.zip
      • 解凍後、 PATHに追加 または直接実行
  • 依存関係
    • ffmpegwinget install ffmpegまたはffmpeg.orgで入手
    • chafa :Scoopで scoop install chafa
  • ソースからビルド
    • git clone https://github.com/emin-ozata/lazycut.git
    • ディレクトリ移動:cd lazycut
    • ビルド:go build
    • 実行例:./lazycut video.mp4

基本的な使い方

  • コマンド実行例
    • lazycut <video-file>
  • 主なキーボードショートカット
    • Space:再生/一時停止
    • h / l:±1秒シーク
    • H / L:±5秒シーク
    • i / o:イン/アウトポイント設定
    • Enter:クリップ書き出し
    • ?:ヘルプ表示
    • q:終了
  • リピート回数 指定に対応
    • 例:5l=5秒進む

まとめ

  • lazycut はターミナルだけで 直感的な動画編集 ができるツール
  • シンプルな操作性多機能性 の両立
  • ffmpeg/chafa の導入が必要
  • macOS/Windows で簡単インストール可能
  • CLI動画編集高速なクリップ作成 に最適

Hackerたちの意見

これが実際のターミナルビデオプレーヤーの初めての例だと思う。めっちゃ楽しい!

mplayer、mpv、あとVLCもできると思うよ。ちゃんとした出力ドライバーの設定(libcacaとか他の選択肢)を使えばね。

これめっちゃクールだね。クリスマスの頃に自分でも作ったんだ。Claude Codeなら数回のプロンプトで組み立てられるよ(これでtmuxを使ってTUIをテストする方法もわかった)。完成品はこれより全然洗練されてないけど、ffmpegにどの引数を渡すかを考えるのが大変だったのが印象的だった。こういうのがあると意外と便利で、私はスクリーンキャプチャを修正するのに使ってる。これやってた時は自分がすごくバカなことしてると思ってたから、全然狂ってないってわかって嬉しい。

AIを使ってffmpegの引数を考えることもできるよ。でも、全体を動かすのはFFmpeg CLIの一回の呼び出しだけみたいで、すごいね。 ffmpegCmd := exec.Command("ffmpeg", "-ss", fmt.Sprintf("%.3f", position.Seconds()), "-i", p.path, "-vf", strings.Join(filters, ","), "-vframes", "1", "-f", "image2pipe", "-vcodec", "bmp", "-loglevel", "error", "-", )

ffmpegで動画をトリミングするのは特に難しくないと思うよ。基本的には just-ss xx -to xx -c copy で済むし。メディアプレーヤーを使ってタイムスタンプを取得する必要があるけど、たぶんもう持ってるからそれは問題じゃない。難しいのは、動画を複数のクリップに分けることかな。一つのクリップが別のクリップの終わりから始まることもあるけど、必ずしもそうじゃないし。

ファイルを人と共有するのはそんなに難しくないと思うよ。FTPにログインして、他のユーザーにアカウントを渡すだけだから。 - OneDriveについてコメントしてる人

mpvでプラグインを使ってやったんだけど、もう見つからないんだ。スタートとエンドをマークするのにキーを押すだけで、. と , を使えば秒単位じゃなくてキーフレーム単位でできたんだよね。

参考までに、ビデオカメラで撮った複数の動画ファイルを結合してトリミングするためのシンプルなコマンドラインユーティリティを紹介するよ。 https://metacpan.org/dist/App-fftrim/view/script/fftrim

簡単なことなんてないよ。ちょっとした例を挙げるね。

緑から赤に毎秒切り替わる6秒の動画を作る。

ffmpeg -f lavfi -i "color=red[a];color=green[b];[a][b]overlay='mod(floor(t),2)*w'" -t 6 master.mp4;

150フレームを25fpsで作成。

0秒から始まる1秒のクリップを作ってみて。全部緑のはず。

ffmpeg -ss 0 -i "master.mp4" -t 1 -c copy "clip1.mp4";

27フレームをエクスポート。赤が見える。

ffmpeg -ss 0 -t 1 -i "master.mp4" -c copy "clip2.mp4";

27フレームをエクスポート。赤が見える。

ffmpeg -ss 0 -to 1 -i "master.mp4" -c copy "clip3.mp4";

27フレームをエクスポート。赤が見える。

-tと-toは制限を超えたら止まるから、フレームを1つ引かなきゃ。でもそれだと26になっちゃう...

だから、開始時間をオフセットしてフレーム#0が0.04になるようにする? ffmpeg -itsoffset 0.04 -ss 0 -i "master.mp4" -t 0.96 -c copy "clip4.mp4";

25フレームをエクスポート、全部緑、時間=1.00。成功。

2秒から始まる別の1秒のクリップを作ってみて。全部緑のはず。

ffmpeg -itsoffset 0.04 -ss 2 -i "master.mp4" -t 0.96 -c copy "clip5.mp4";

75フレームをエクスポート、時間=1.08、赤-緑-赤が見える。

開始をオフセットせずに、最後に2を落とす?

ffmpeg -ss 2 -i "master.mp4" -t 0.92 -c copy "clip6.mp4";

75フレームをエクスポート、時間=1.08、緑-赤が見える。

ffmpeg -ss 2 -t 0.92 -i "master.mp4" -c copy "clip7.mp4";

75フレームをエクスポート、時間=0.92、緑-赤が見える。

違うことを試してみる...

ffmpeg -ss 2 -i "master.mp4" -c copy -frames 25 "clip8.mp4";

動画が壊れてる。

ffmpeg -ss 2 -i "master.mp4" -c copy -frames 25 -avoid_negative_ts make_zero "clip9.mp4";

25フレームをエクスポート、全部緑、時間=1.00。成功?

同じ方法で赤い動画をエクスポートしてみて。

ffmpeg -ss 3 -i "master.mp4" -c copy -frames 25 -avoid_negative_ts make_zero "clip10.mp4";

ああ、全部緑だ!

先週くらいから長いmp4動画から正確なクリップを切り取ろうと頑張ってて、たくさん学んだよ。最初はコマンドラインでffmpegを使ってたけど、正確なタイムスタンプやキーフレーム/エンコーディングの問題があって、簡単じゃなかった。自分のニーズには非常に正確な開始フレームが必要で、最高の結果は最初に高品質で再エンコードしてから、LossLessCutでマーク&バッチ処理して、最後にクリップを希望の品質にダウンコーディングすることから得られた。 それでも手動での確認や修正が必要だった。難しいわけじゃないけど、決して簡単ではないよ。 https://github.com/mifi/lossless-cut

これ使ってるんだけど[0]、小さくて速いし、今のところすごくうまく動いてるよ。 [0]https://github.com/wong-justin/vic

聞いて嬉しいよ!作るときの考えたことをいくつか挙げるね:

  • まだ音声サポートは実装してないけど、あったらいいなと思ってる。
  • --dry-runが好き。
  • TUIウィジェットライブラリは使わなかったけど、今はUIをリファクタリングしたり、もっと見栄え良くするのが面倒なところまで来ちゃった。
  • OPのタイムラインウィジェットが好き。
  • スタティックバイナリに集中したかった。Linux用にchafaのスタティックリンクはうまくいったけど、まだffmpegをバンドルしてない。ライセンスのことを思い出させるね。 -- chafaとffmpegはLGPLだったはず。
  • 初期の頃のメモもいくつかあるよ: https://wonger.dev/posts/chafa-ffmpeg-progress

ffmpeg、gzip、tarコマンドを呼び出すのは、LLMにとって逆チューリングテストみたいなもんだね。

このウェブサイトにアクセスするには、altタブを使わずに有効なtarコマンドを作成しなければならない。10秒以内に従ってね。

MacOSではスペースを押してFinderでトリミングしてるよ。再圧縮も避けられるしね。

3日前にこのツールについて聞いたんだけど、HNって魔法の場所だね! https://news.ycombinator.com/item?id=47363432

メインの動画プレーヤーを離れたくないなら、MacのIINAはスクリプトが使えるから、ショートカットキーでスタート/エンドのインジケーターをスクリプトに送って、タイムスタンプでffmpegを実行してるよ。他の動画プレーヤー、例えばVLCもこれに対応してると思うけど、VLCのAPIはあんまり使えなかったな。

mpvにはこれ用のプラグインがあるよ。例えば、https://github.com/serenae-fansubs/mpv-webm

デスクトップやウェブアプリが何十年も続いた後に、ターミナルアプリが人気になってるのが面白いね。チャットAIに話しかけることで、プロンプト画面に慣れてきたのかな?それともシンプルさと無駄がないからかな?

真のクロスプラットフォームであることが、私にとっては大きな魅力だね。一度どこかのプラットフォームで動けば、他のターミナルがあるプラットフォームでも大体動くから。今、どこでも同じ環境を持ちたくて、メインエディタをneovimに切り替え中なんだ。vscodeみたいなIDEは「クロスプラットフォーム」だけど、デスクトップでしか動かないし、Android用のIDEっぽいエディタもあるけど、デスクトップでは使えないんだよね。意外と、AndroidやTermuxのneovimは、IDEアプリよりも使いやすい。自分のミニプログラムやスクリプトを書くときは、全部キーボードベースだから。Flutterみたいに、一度書けばどこでも動くっていうのが基本だけど、何かをまとめるのにかかる時間は数時間で済むし、PythonやBashを使ってfzfやtextualでインタラクティブな部分を作るから、過剰にならないんだ。

最高だね!前にこのアイデアを思いついたことがあったけど、実装する時間がなかったんだ。やってくれてありがとう!