Skip to content

v0.3.3

Choose a tag to compare

@DeepRegular DeepRegular released this 05 Sep 05:12
· 466 commits to main since this release

スマートレンダリング対応のカットツールです。**カット点にかかる部分 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 の配布物はこのツリーから作られています。