LosslessCut:ロスレスな動画・音声編集のスイスアーミーナイフ
(github.com/mifi)- LosslessCutは、動画、音声、字幕などのメディアファイルを非常に高速にロスレス処理するためのクロスプラットフォーム FFmpeg GUI
- 中核機能は、カメラ、GoPro、ドローンなどから出力された大きな動画ファイルを、遅い再エンコードなしで大まかに切り取り、良い部分だけを残して大量のデータを捨てるロスレストリミング/カット
- ほとんどの作業はFFmpegベースのほぼ直接的なデータコピーで処理され、広告除去、セグメントの並べ替え、同一コーデックパラメータのファイル結合、トラックの抽出・置換・削除といった作業をサポート
- Chromium HTML5動画プレイヤーを使用するため、ネイティブ再生可能なフォーマットとコーデックには制約があるが、FFmpeg支援再生で低品質プロキシを作成して開き、実際のカット/エクスポートは元ファイルに対してロスレスに実行できる
- macOS、Windows、Linux向けの手動ダウンロードは無料で、Mac App StoreとMicrosoft Storeでのインストールは、セキュリティ、簡単なインストール、自動の安定アップデートを提供する支援方法として案内されている
LosslessCutが解決する問題
- LosslessCutは、動画、音声、字幕、および関連メディアファイルに対して高速でロスレスな作業を提供するクロスプラットフォーム FFmpeg GUIを目指している
- 主な用途は、大きな動画ファイルから必要な区間だけを素早く抽出し、残りのデータを捨てること
- ビデオカメラ、GoPro、ドローンなどで撮影した大容量ファイルを大まかにカットして、容量を節約できる
- 遅い再エンコードを行わないため、品質劣化を避けられる
- 非常に高速なのは、FFmpegが処理を実行し、LosslessCutがほぼ直接的なデータコピーを活用する構造によるもの
主な編集機能
- ほとんどの動画・音声フォーマットに対するロスレスカットをサポート
- 動画・音声の一部区間をロスレスに切り出せるため、広告除去のような作業に利用できる
- 動画・音声セグメントの順序をロスレスに並べ替えられる
- 任意ファイルのロスレスな結合・連結をサポートするが、同じカメラから出力されたファイルのように同一のコーデックパラメータが必要
- Smart cutは実験的機能として提供される
トラック、メタデータ、コンテナ作業
- マルチトラック/ストリーム編集をサポート
- 複数ファイルから任意のトラックを組み合わせ、映像に音楽や字幕トラックを追加できる
- 不要なトラックを削除できる
- 一部のトラックだけを置換または再エンコードできる
- 動画、音声、字幕、添付ファイルなど、すべてのトラックを個別ファイルとして抽出できる
- すべてのトラックの技術情報を確認し、ファイルメタデータ、トラック別メタデータ、トラック別dispositionを編集できる
- 再生する動画・音声トラックを選択でき、複数の音声トラックを同時に再生できる
- 動画・音声を別のコンテナファイル形式へロスレスremuxできる
- 動画の回転・向きメタデータを変更できる
- MKV/MP4内蔵チャプターマーク編集と字幕表示をサポート
タイムラインとワークフロー
- 高速な複数ファイルワークフローを提供するが、大量・バッチエクスポートはまだない
- キーボードショートカット中心のワークフローとカスタムショートカットをサポート
- カット地点の時刻を手動入力できる
- ファイル別タイムコードオフセットの適用と、ファイルからのタイムコード自動読み込みをサポート
- タイムライン拡大、フレーム/キーフレームジャンプ、動画サムネイル、音声波形を提供
- プロジェクトファイルにカットセグメントを保存できる
- 実行された最後のFFmpegコマンドログを確認し、直近のコマンドを修正してコマンドラインで再実行できる
- 元に戻す、やり直しをサポート
- 高度なセグメント照会と変形のためのJSベースの式言語を提供
- カットセグメントにラベルを付け、タグで注釈を付けられる
画像抽出、検出、セグメント生成
- 動画からフル解像度のスナップショットをJPEG/PNGで抽出できる
- 動画フレーム範囲を画像としてエクスポートできる
- n番目のフレームごと、秒単位、シーン切り替わり基準、最適サムネイル方式などをサポート
- 選択した時間範囲、つまりセグメントからのみエクスポートできる
- 画像ファイル名に元のタイムスタンプを含められる
- 黒画面検出、無音音声検出、シーン切り替わり検出をサポート
- タイムラインを長さL、サイズX MB、N個のセグメント、またはランダムなセグメントに分割できる
- すべてのnon-keyframeを非常に高速に除去でき、timelapseのような用途に利用できる
インポート・エクスポートと自動化
- セグメントのインポート/エクスポートをサポート
- MP4/MKVチャプターマーク
- テキストファイル
- YouTube
- CSV
- CUE
- DaVinci、Final Cut Pro用XML
- その他の形式
- 基本的なCLIとHTTP APIを提供
- HTTP経由で動画をロスレスにダウンロードでき、例としてHLS
.m3u8が示されている - DJI内蔵GPSトラックを地図上に表示できる
使用例
- 録画したテレビ番組から広告を切り取り、TSからMP4へ形式を変換できる
- ファイルから音声トラックを削除できる
- 映像から音楽トラックを抽出し、必要な長さにカットできる
- 映像に音楽を追加したり、既存の音声トラックを置換したりできる
- 別録りした音声と動画トラックを結合できる
- 外部字幕を動画に埋め込める
- H264/H265 MKV動画を、iPhone再生用のMOVまたはMP4へ素早く変換できる
- 他のツールで作成したEDL、CSVのようなカット時刻リストをインポートし、LosslessCutでカットを実行できる
- カット時刻リストをCSV EDLとしてエクスポートし、他のツールで処理できる
- MP4/MKVチャプター基準でファイルを素早く切り分けられる
- YouTube videoを、チャプターやコメント内の音楽時刻基準で素早く切り分けられる
- 音声・字幕トラックの言語を変更できる
- 外部JPEGファイルやタイムラインフレームから、カバーアート・サムネイルを動画・音声に添付できる
- 映像の作成者、タイトル、GPS位置、録画時刻を変更できる
- 誤った向きフラグが設定された動画の回転を修正できる
- 再エンコードなしで動画・音声クリップをX回素早く繰り返せる
- 動画全体または一部をX個の画像ファイルに変換できるが、この作業はロスレスではない
- シーンごとに1つのファイルになるよう、動画をロスレス分割できる
- 音声・動画から無音区間を切り取れる
- Twitterの140秒制限のような条件に合わせて、動画をセグメントに分割できる
- 各セグメントに1つ以上のタグを付け、タグをセグメント整理や出力フォルダ構造の生成に利用できる
- 追加例はRecipe cookbookにある
ダウンロードと支援方法
- Mac App StoreとMicrosoft Storeでのインストールは、セキュリティ、簡単なインストール、自動の安定アップデートを提供する方法として案内されている
- Linuxの代替手段としてSnapcraftとFlathubが提供されている
- 実行ファイルの手動ダウンロードは引き続き無料で提供される
- macOS:Intel、Apple Silicon DMGを提供し、PKGは動作しない
- Windows:7zipを提供し、Windows 7、8、8.1はv3.50.0以降サポートされない
- Linux:x64 tar.bz2、x64 AppImage、arm64 tar.bz2、Raspberry Pi armv7l tar.bz2を提供
- Windows APPXとmacOS PKGは動作しない
- More releasesとLatest nightly builds 🧪が提供されている
- LosslessCutは1人でメンテナンスされており、常に無料のオープンソースであり続けると述べている
- ユーザーはプロジェクトを支援したり、FFmpegに寄付したりできる
対応フォーマットと再生上の制約
- LosslessCutはChromium HTML5動画プレイヤーを使用するため、すべてのフォーマットとコーデックがネイティブ対応されるわけではない
- 一般に動作するファイルフォーマットは
MP4、MOV、WebM、Matroska、OGG、WAV - 対応音声コーデックは
FLAC、MP3、Opus、PCM、Vorbis、AAC - 対応動画コーデックは
H264、AV1、Theora、VP8、VP9、ハードウェアデコーダーがあるH265 - リストにないコーデックやフォーマットも、
Fileメニューから対応フォーマット・コーデックに変換して開ける- まずFastest: FFmpeg-assisted playbackオプションを試すよう案内されている
- この場合、ファイルの低品質版が作成され、プレイヤーで開かれる
- 実際のカット/エクスポート作業は元ファイルに対して行われるためロスレス
- FFmpegがデコードできるファイルは、潜在的に開くことができる
ドキュメントとデモ
- 公式ウェブサイトはLosslessCut.app
- はじめ方、FAQ、使用ドキュメントはGetting started, FAQ and usage documentationにある
- トラブルシューティング、既知の問題、制限事項はTroubleshooting and known issues and limitationsにある
- コントリビューション案内はContributingにある
- 動画デモでは、共通機能、MP4サムネイル・カバーアート追加、多言語音声追加を扱っている
1件のコメント
Hacker News のコメント
昔の Windows メディア PC 時代に使っていた VideoReDo という魔法のようなアプリの、オープンソースの競合のように見える
残念ながら VideoReDo は個人開発者が作ったプロプライエタリソフトウェアで、その開発者は最近亡くなった
「ロスレス」動画編集がどういうものかピンと来ない人向けに説明すると、通常の動画編集ソフトは動画/音声クリップを取り込み、Pitivi/Premiere/Final Cut のようなアプリ固有の形式でタイムラインを保存したうえで、完成版を MP4/MOV などの出力形式に書き出す際に全体を再エンコードする
そのため、1時間の動画から30〜90秒だけ切り出す場合でも、1時間全体を再エンコードする必要があり、元のエンコードと再エンコード設定が合っていないと、意図しない画質・音質の変化が起きる
一方、このような ロスレス編集ソフト は全体を再エンコードせず、バイトレベルで該当区間だけを「切り取る」ように処理する
昔の MP3 初期に、96kbps のファイルをダウンロードして 320kbps に再エンコードし、「音質を改善」しようとしていたことを思い出す
デコードと再エンコードが必要になるのは、フレーム内容を変更する場合や、動画ストリーム構造を互換性のある形に組み直す必要がある場合だけ
ほとんどの動画形式は、順番にデコード・表示しなければならない デルタエンコードされたフレーム のストリームだ。1フレームだけ戻ろうとしても最初から再デコードする必要があり、1フレームが壊れると映像を失う
そのためエンコーダはキーフレームを入れて、動画ストリームを定期的に再開できるようにしなければならない。同じコーデックと解像度なら、外部の動画ストリームにも実質的にどこにでもキーフレームを挿入することは有効
まともなノンリニア編集ソフトは、知る限りこうした方法は使わない。ほとんどのカットは単純な GOP[0] カットの小技では近似しにくく、多くの人が最終配布フォーマットにエンコード済みのクリップを編集しているわけでもない
プロの現場では多くの人が ProRes で収録するが、ProRes は意図的にデルタエンコードを行わない[1]。デルタエンコードはノンリニア動画編集には実際かなり不向きだから
[0] Group of Pictures - 1つのキーフレームと、次のキーフレームまでのすべてのデルタエンコードフレーム
[1] そのためサイズがとてつもなく大きい
1分を切り出すのであれば、エンコードするのは 1分ぶん だ。元動画は1分より多くデコードしなければならない場合があるが、1時間全体をデコードしなければならないことはまれ
「ロスレス」と聞いて、最初は ProRes、MJPEG2000、HuffYUV のような本当のロスレス形式の編集を思い浮かべた
しかし、このツールが結局やっているのは、元のコンテナを新しいコンテナに再パッケージしつつ、基礎となるストリームには手を触れないことだ。つまり再エンコードはない
重い処理を FFmpeg に任せているのは驚きではないが、コミュニティがこの処理が実際にどう動いているのかを理解する価値はある
簡単に言えば、mp4、mov、avi、ts のような現代的な動画形式は、結局のところ複数の動画・音声トラックを格納できるコンテナの拡張子だ。これらのトラックはエレメンタリストリーム(Elementary Stream、ES)と呼ばれ、H264/AVC、H265/HEVC、AAC などのコーデックでそれぞれエンコードされる
その後 muxing の過程でこれらがコンテナにまとめられ、各サンプル/フレームにタイムスタンプが付いて ES 同士が同期される
ES はエンコードされているため、シーク時にフレーム単位の精度を得るのは難しく、完全にデコード可能なフレームは I フレームだけだ。後続の P/B フレームは I フレームの情報をもとにデコードされる。このような IPPBPPB... というシーケンスを GOP と呼ぶ
興味深いのは、ストリームをデコードしなくても NAL(Network Abstraction Layer)ユニットのヘッダを見ればフレームタイプが分かることだ。例えば H264 の I フレームのフレームタイプバイトは 0x07 のような値で、ヘッダは 0x000001 だ
これらを総合すると、ES ビットストリームをのぞき込み、デコードせずに GOP 境界を見つけられる。ただし GOP の真ん中をそのまま切ることはできないため、1秒未満の誤差を受け入れるか、通常30フレーム程度の GOP 全体をデコードしてから出力に I フレームを挿入すればよい
つまり結局やっていることは、非常に高速なビット操作とコンテナ間コピーに近い。元動画を断片に切り分けることが目的なら、この処理が非常に効率的な理由だ
関連記事:
LosslessCut: lossless video/audio editing - https://news.ycombinator.com/item?id=33969490 - Dec 2022 (153 comments)
Lossless-cut: The swiss army knife of lossless video/audio editing - https://news.ycombinator.com/item?id=24883030 - Oct 2020 (10 comments)
LosslessCut – Save space by quickly and losslessly trimming video files - https://news.ycombinator.com/item?id=22026412 - Jan 2020 (1 comment)
Show HN: LosslessCut – Cross-platform GUI tool for fast, lossless video cutting - https://news.ycombinator.com/item?id=12885585 - Nov 2016 (33 comments)
参考までに、ffmpeg でカットを作るときに使う bash スクリプトがある。Stack Overflow のかなり有用な提案をベースにしていて、入力は開始/終了時刻を秒単位で1行ずつ書いたファイル。
映像に音声がなければ、atrim/outa の部分を外すだけでほぼ同じように動作する。複数の区間を
trim、atrim、setpts、asetptsで切り出し、concatフィルタでつなぎ合わせるというやり方。-c copyや-c:v copy -c:a copyはどこにあるの?これが 100MB を超える Electron アプリだという不満が出そうなので先に言っておくと、AVIDemux はネイティブアプリで、ほぼ同じことをしてくれる。
先週このアプリを見つけたが、ものすごく便利だった。
プールサイドの小さなカメラで飛び込み大会全体を撮影していて、各飛び込みシーンごとのクリップに分けたかった。
LosslessCut では好きなだけ高速に再生でき、選手間の空白を音で判別するには 300% を少し超える速度が、自分に扱える上限だった。
各飛び込みの得点が発表されるたびに
Bを押し、すべての飛び込みについて終えたあとエクスポートをクリックした。3時間の大会を、1時間もかからずに各選手やコーチへ共有できる、きれいに名前の付いたクリップへ分割できた。LosslessCut が大好きで、ほぼ毎日使っている。
主に画面録画の切り出しや編集に使っているが、無劣化なので編集した動画の保存がほぼ即座に終わる。
実質的には ffmpeg 用 GUI に近い。
再圧縮が必要なら Permute を使い、エフェクトを入れたり非可逆編集が必要なら Davinci Resolve を使う。
Handbrake や単に ffmpeg を直接呼び出すのと比べて、何を追加で提供しているのか気になる。有料アプリに見えるけれど、既存の無料の選択肢より本当に良いならソフトウェア代を払うのは問題ない。
GitHub では GPL-2.0 ライセンス、Snap Store では MIT ライセンス、Mac App Store では 19ドル。
リモートサーバーから映像を 無劣化でダウンロードしながら切り出す ことが可能なのか気になる。
今は Stack Overflow で見つけた ffmpeg 用の bash スクリプトで、YouTube などから映像の一部だけをダウンロードしているが、現状ではダウンロード中にその場で再エンコードする必要がある。
ひとまず、ローカルにキーフレームなどの映像情報がないので、こうした映像を無劣化でダウンロードして切り出すのは不可能だと考えている。間違っていると証明してもらえるとうれしい。
313は 4K 映像ストリームのみだが、音声ストリームがある映像でも動くと思う。ffmpeg -ss 5:40 -i $(yt-dlp -f 313 -g https://www.youtube.com/watch?v=3SykjY3GdMs) -acodec copy -vcodec copy -t 20 waterdrop_mountainlake.mkv最近になってこのアプリを知り、気に入っている。
クリップを切り出すために毎回 Blender のインスタンス全体 と動画プロジェクトを開いていたなんて、しかもそれを頻繁にやっていたなんて、今では信じがたい。