Skip to content

SmartCut v0.6.7

Choose a tag to compare

@DeepRegular DeepRegular released this 16 Sep 18:39
· 254 commits to main since this release

スマートレンダリング対応のカットツールです。**カット点にかかる部分 GOP だけを再エンコードし、残りはビット単位でそのままコピーします。**放送録画(MPEG-2 TS)から CM を落とす用途を主眼に置いています。

0.6.7 では、GUI の日本語を書き直しました。この GUI は日本語が正本ですが、文言のかなりの部分が英語から訳し戻したもので、英語のまま読めてしまう状態でした。カタログ 50 行を直しています。きっかけは、データ放送を「青いボタンの向こう」と説明していた 1 行です。青は 4 つのカラーボタンの 1 つで、データ放送を開くのは d ボタンです。

あわせて、カット編集の再生を 3 か所直しました。番組の変わり目で音が止まる、プレビューが録画のフレームレートで出ない、ウィンドウを閉じても音が鳴り続ける(Windows から「どこからか音楽が流れる」として報告されたもの)の 3 件です。また、レコーダーが焼いた BD-RE の 20 本目がようやく切り出せるようになりました。

ダウンロード

ファイル 対象
SmartCut_0.6.7_amd64.AppImage Linux x64。glibc 2.39 以上(Ubuntu 24.04 / Debian 13 / Fedora 40 以降)。FUSE が必要です
SmartCut-0.6.7-linux-x86_64.tar.gz Linux x64 可搬版。解凍して ./smartcut。中身は AppImage と同じ一式で、FUSE は不要です
smartcut_0.6.7_amd64.deb Debian 13 / Ubuntu 25.04 以降。3.9MB。GUI を smartcut、コマンドライン版を smartcut-cli として入れます
SmartCut_0.6.7_x64-setup.exe Windows x64 インストーラ。WebView2 ランタイムが必要です
smartcut-portable-x64-0.6.7.zip Windows x64 可搬版。解凍して smartcut.exe を実行します

FFmpeg を別途入れる必要があるのは deb だけです。ほかの配布物には同梱しています。

日本語で書かれているのに、日本語で読めませんでした

この GUI の文言は日本語が正本で、英語はそこから訳したものです。ところが実際には、英語で書いた説明が日本語に戻ってきた行がかなりあり、語順も語の選び方も英語のままでした。意味は通りますが、日本語として誰も言わない言い方になっています。

いちばんはっきりしていたのが「青いボタン」です。データ放送のチェックボックスの説明が「青いボタンの先にあるページ」となっていました。青は赤・緑・黄と並ぶカラーボタンで、使うのは番組の側です。データ放送を開くのは d ボタンです。同じ誤りが英語側にも、ガイドにも、ソースのコメント 2 か所にもあったので、すべて d に直しました。

ほかにも次のように直しています。

  • 字幕の行き先が カットの傍らに (.idx / .sub) でした。ファイルの置き場所を「傍ら」とは言いません。別ファイルに出力 にしました。カットの中に入れるほうは 出力ファイルに含める です。
  • ディスクが持っている索引を ディスクの索引、シーク用のものを 索引 と呼んでいました。別のものが 1 つの語を分け合っていたうえ、どちらもレコーダーが使う語ではありません。ディスク側は ディスクの管理情報、シーク用は インデックス に統一しました。
  • 持ち出せません → 出力できません。環境設定で答えます → 環境設定で決めます。サムネイルは作成できず → サムネイルを作成できませんでした。動詞で終わるべき文が名詞で終わっていたものが 6 つありました。
  • プレビューのフレームを 絵 と呼んでいた箇所を フレーム にしました。

ガイドは GUI を引用している箇所が追随し、用語の変更は技術ページにも通しました。日本語のスクリーンショットは 12 枚を撮り直しています。

番組の変わり目で音が止まっていました

**録画の冒頭は、その番組のものではありません。**チューナーは早めに録り始めるので、ファイルの頭には前の番組の終わりが入ります。そこだけ音の形が違うことがあります。ステレオの番組の前に、モノラルのニュースが読まれている。珍しい録画ではありません。

プレビューの音は swresample のコンテキストを 1 つ通ります。これは最初に復号したフレームの形式・チャンネル配置・レートで作られ、作られたときと違う形のフレームは受け取りません。番組の変わり目で Input changed を返し、そのエラーが再生スレッドを終わらせていました。フレームは流れたまま、音だけが番組の始まった瞬間に消えます。

冒頭 3.243 秒がモノラルの 50 分の録画で測ると、変換できたのは 151 フレームで、そのあとは 1 枚も通っていませんでした。いまは届いたフレームごとに形を確かめ、前と違えばコンテキストを作り直します。同じ録画で 937 フレーム全部が通ります。作り直すのは変わり目の 1 回だけです。

書き出し側の同じ問題は 0.6.6 で直してあります(settled_shape)。残っていたのは鳴らす側でした。

プレビューが録画のフレームレートで出ます

これまでは毎秒 15 枚(プロキシからなら 24 枚)しか要求していませんでした。**期限を過ぎたフレームを捨てる仕組みが無かったためです。**間に合わないパソコンでは、フレームを減らすのではなく再生全体が遅れます。音はサウンドカードの時計で進み、映像を待ちません。そのため遅れたフレームは、そのまま音とのずれになります。

いまは、自分の時刻を 2 フレーム以上過ぎたフレームは出さずに捨てます。捨てても払うのは復号だけで、JPEG もデータ URL も作りません。そのため録画そのもののレートを要求してよくなりました。そのパソコンが描ける枚数だけを、時刻どおりに出します。4 コアのマシンで 1440x1080 の MPEG-2 を直接復号して、毎秒 30.5 枚を実測しています。

ウィンドウを閉じても音が鳴り続けていました

Windows から「どこからか音楽が流れる」という報告がありました。カット編集のウィンドウを閉じたときです。

再生は 2 つのスレッドで動いていて、どちらも Playing というフラグ 1 つしか見ていません。ウィンドウそのものは持っていません。そして、ウィンドウが閉じてもそのフラグを下ろす処理がありませんでした。フレームは行き先が無いだけですが、音のスレッドはサウンドカードに合わせて進むので、録画の残り分だけ鳴り続けます。番組の頭で閉じれば 45 分です。

ウィンドウの CloseRequested と Destroyed で下ろすようにしました。修正前はウィンドウが消えたあとも CPU を 3 秒あたり 83〜85 tick 使い続けていましたが、修正後は 0 です。

エントリーポイントマップが、別の位置を指していました

レコーダーが焼いた BD-RE 4 枚・20 本のうち、19 本は切り出せて 1 本だけが止まっていました。継ぎ目の問題ではなく、エントリーの問題でした。

1 本のクリップは 6 つの区間(ATC シーケンス)でできています。そのうち 4 番目だけが、指している位置のピクチャより 6.000 秒早い時刻を書いていました。先頭 2 点はさらに 11.651 秒早く、これは細かいエントリが持つ 11 ビットの一周分です。区間の長さも同じだけ狂っていて、ピクチャ 289 秒分に対して 316 秒と書いてあります。カットから見えていたのは「エントリーポイントに出会わないまま通り過ぎた」というエラーでした。マップの示す時刻へシークして読み進めると、約束されたピクチャは 8 秒先にあります。同じクリップの他の 5 区間も、同じディスクの他の 7 クリップの 3,592〜3,615 点も、ストリームと 1/1000 秒で合っています。

どの区間が信用できるかは、マップのどこにも書いてありません。そこで全部に 1 つずつ確認することにしました。シーク 1 回と短い読み取り 1 回で済む確認です。先頭のバイトにある最初のピクチャが、先頭のエントリの指しているピクチャかどうかを見ます。違えばその区間のエントリだけ捨て、ストリームを読んで作り直します。読むのはその区間だけで、クリップ全体ではありません。そして手前の継ぎ目を、その区間が実際に持っている最後のピクチャまで引き戻します。

確認するのは継ぎ目を持つクリップ、つまりレコーダーが焼いたクリップだけで、しかもストリームから作っていない索引に対してだけです。走査して作った索引は、自分が読んだものと食い違いません。20 本のうち発動するのは 1 本の 1 区間だけで、残り 19 本の計画はコピー秒数まで以前と同じです。直った 1 本はコピー 99.8% で書き出せます。隣のタイトルと同じ値です。