v0.3.3
スマートレンダリング対応のカットツールです。**カット点にかかる部分 GOP だけを再エンコードし、残りはビット単位でそのままコピーします。**放送録画(MPEG-2 TS)から CM を落とす用途を主眼に置いています。
0.3.3 で、市販 Blu-ray(BDMV)も読めるようになりました。0.3.2 で開くようになった録画ディスク(BDAV)と同じ経路で、マウントせずに開きます。そのうえで、中のどれを読むのかをウィンドウが確認するようになりました。
ダウンロード
| ファイル | 対象 |
|---|---|
SmartCut_0.3.3_amd64.AppImage |
Linux x64。glibc 2.39 以上(Ubuntu 24.04 / Debian 13 / Fedora 40 以降)。FUSE が必要です |
SmartCut-0.3.3-linux-x86_64.tar.gz |
Linux x64 可搬版。解凍して ./smartcut。中身は AppImage と同じ一式で、FUSE は不要です |
smartcut_0.3.3_amd64.deb |
Debian 13 / Ubuntu 25.04 以降。3.0MB。GUI を smartcut、コマンドライン版を smartcut-cli として入れます |
SmartCut_0.3.3_x64-setup.exe |
Windows x64 インストーラ。WebView2 ランタイムが必要です |
smartcut-portable-x64-0.3.3.zip |
Windows x64 可搬版。解凍して smartcut.exe を実行します |
FFmpeg を別途入れる必要があるのは deb だけです。ほかの配布物には同梱しています。
0.3.2 からの変更
市販 Blu-ray(BDMV)も、そのまま開きます
Blu-ray の仕様の両側を、1 つの読み取り側で読みます。BDAV(レコーダーが書くもの)と BDMV(プレスされたディスク)は、索引の置き場所・プレイリストがクリップを指す書き方・クリップ情報ファイルの名前・番組名を持つかどうかの 4 点で違い、それ以外は同じです。そこで bdav.rs は disc.rs になり、どちらの方言を見ているかを引数で受け取る形にしました。フォルダーでも .iso でも、どちらもマウントしないのは変わりません。
smartcut Anime.iso # 何が入っているか
smartcut Anime.iso --title 2 --cut 8.0-20.0 -o out.ts市販ディスクは、ほとんどが本編ではありません
これを書く元にしたシーズンセットは、12 話のほかにロゴ・警告・メニューループ・8 秒の繋ぎが 50 本入っていて、ディスクはその 62 本すべてを 000NN としか呼びません。しかも重複して指定します。各話は自分のプレイリストからも、「全話再生」からも、メニューのチャプター一覧が指すものからも再生されるので、プレイリストをそのまま並べると 62 クリップが 328 行になります。
- **1 クリップ 1 行にします。**いくつのプレイリストがそれを再生していても 1 行にまとめます。
- **5 分より長いものは最初からチェックが入ります。**ディスクを取っておく理由になる最短のものよりは十分短く、メニューを構成する最長のものよりは十分長い値です。残りは「短いクリップも表示」の奥にあります。
読み込みの前に、ウィンドウが確認します
ディスクを放り込むと「ディスクの読み込み」が開き、2 つのことを確認します。
- **どのクリップか。**各行に長さとディスクに占める割合が出ます。すべてを
000NNとしか呼ばないディスクでは、これが本編とロゴを見分ける材料になります。 - **どのトラックか。**ディスク自身の
CLIPINFに書かれているとおりに並べます。映像、言語つきの音声、字幕とメニューです。30GB を demux しないと描けない選択画面は誰も待たないので、何も開かないうちに答えられるようにしてあります。そのためトラックは PID で指定します(ストリーム番号は、何かを開くまで存在しません)。 - 映像は外せません。市販ディスクの字幕とメニューは、カットでは持ち出せないものとして表示します。何も言わずに落とすのではなく、明示します。
- 「同じ構成のクリップすべてに適用」で、1 つの選択をディスク全体に適用できます。シーズンセットで必要になるのはこれです。
Blu-ray のロスレス音声は、1 つの PID に 2 本入っています
TrueHD は、それを再生できない機器のために AC-3 コアを同じ PES に畳み込んで送ってきます。libavformat はこれを同じ PID を持つ 2 本のストリームとして渡してきます。一方カットは各ストリームを届いた PID に書き戻すので、1 つの PID に 2 本は書けません。多重化器に指示すれば Duplicate stream id 4352 で止まります。
そこで **PID ごとに先頭の 1 本を残します。**それは番組表が指定したストリーム、Blu-ray なら TrueHD 本体であり、TrueHD の素のストリームは再生機がデコードできます。残りは「置いてきたもの」として明示します。落ちるのは実在するもの(内側に畳まれていた互換用の AC-3)だからです。この処理はトランスポートストリームでだけ行います。ほかのコンテナはストリーム番号を好きに振り、全部同じ番号を振るものもあるので、そのまま適用すると録画の音声が丸ごと 1 本目に畳み込まれてしまいます。
多重化全体のテーブルを持つ録画で、自分のサービスを選びます
レコーダーが元の PAT をそのまま残していると、そこに並ぶ隣のサービスは、録画されたサービスと同じくらい実在します。これまで先頭の 1 件を採っていたので、出力に他人のサービス番号が付くことがありました。いまは映像が属するサービスを採ります。cut.rs が映像ストリームを含むプログラムを選び、si.rs は PAT が指すすべての PMT を追い、SDT は丸ごと保持してから自分のサービスに絞ります。映像と結び付かないときは、これまでどおり最初に届いた PMT が答えます。
記述のない音声トラックは、スキャンの時点で外します
録画の途中でサービスが PMT を差し替えると、新しい PID 一式が指定されます。ところがファイル先頭の probe はそこにフレームを見つけられないので、サンプリング周波数もチャンネル数も無いストリームが返ってきます。多重化器はそれを宣言できず(sample rate not set)、再エンコードしようにも周波数がありません。書き出しまで運んでカット全体を失敗させるのではなく、その場で外し、どの PID を外したか、ほかは影響を受けていないことを表示します。
ドキュメント
docs/developers/bdav.md は Reading a Blu-ray(日本語)になり、両方の方言を扱います。README・ユーザーガイド・設計文書もこれに合わせました。
テスト
tests/run_bdav_tests.sh は tests/run_disc_tests.sh になりました(35 本)。通常のフィクスチャから BDAV ディスクと BDMV ディスクの両方を組み立て、それぞれを UDF イメージに包みます。そのうえで、フォルダーから作ったカットとイメージの中から作ったカットがバイト単位で一致すること、その一致が 2 つの方言をまたいでも成り立つことを要求します。
全 14 スイート・167 チェックが開発 VM で通っています(0 失敗)。Linux と Windows の配布物はこのツリーから作られています。
