コンテンツにスキップ

CM 検出

録ったあとに CM を見つけて、チャプターを打つ・切る話。 エンコードのしかたは encode.md、 局ロゴの集め方は logo.md。

CM は既定でチャプターを打つだけです。実カットは誤検出すると本編が消えるので明示的に選びます。

CM 検出はエンコードと同じ ffmpeg で一緒に行います (TS の復号は1回)。エンコードする出口のあとに検出の出口を足し、 -map は出口ごとなので、エンコードするほうの指定は検出の出口に効きません (encoder.buildArgs の analysis):

ffmpeg ─ TS を1回だけ復号 ─┬ エンコードする出口: (scdet@key) → bwdif → scale → エンコーダ → mkv
├ 映像の出口: scdet@cm → metadata (一時ファイル) → ロゴの枠を切り出す → 標準出力
└ 音の出口: 主音声に silencedetect → ametadata (一時ファイル) → null
一時ファイル: コマごとの時刻と切れ目の点 / 無音の始まりと終わり → cm-scan.scanReader
fd 3: -progress (エンコードできたコマ数) → 進み具合

エンコードし終えたら、読んだ材料から境目を決めます (cm.openCm の decide。決め方は下の「検出のしかた」)。

  • 局ロゴを覚えるのは前段のまま (初めて見る局だけ。キーフレームだけ読むので、30分 3〜4GB で 12〜22 秒。全部を復号すると 37〜58 秒)。 覚えていたロゴが当たらず覚え直したときは、枠だけもう一度読みます (エンコードしたときと同じだけ頭を捨てて、コマの並びを揃える)
  • 材料は一時ファイルに書かせます (metadata / ametadata の file=)。標準エラーのログはエンコードと一緒だと行が欠けることがあり (30分で 5万行のうち1〜2行)、1行でも欠けるとロゴの枠とコマの数が合わなくなります。進み具合は fd 3 から読みます (-progress pipe:3。標準出力はロゴの枠が使う)
  • 検出が転んでもエンコードしたものは残します。 エンコードできたのに材料が足りない (ロゴの枠とコマの数が合わない等) ときは尺だけで決め直し、 決められなければ CM 無しで、理由を覚え書きに残します。エンコードする ffmpeg ごと落ちたときは (GPU → ソフトウェアの方式を試し切ったあと) 探さずにもう1回だけエンコードし、エンコードできたら音だけ読み直して CM の尺だけで決めます — 検出の出口 (壊れた映像など) が道連れにしたのかもしれないので。 このときは「切る」でも切らずにチャプターにします (キーフレームを置いていないうえ、尺だけの判定で本編を削らないため)
  • 両方のコーデックを選んだら、探すのは1本目だけ。 2本目は決まった境目でエンコードします (チャプターを入れて・境目にキーフレームを置いて)
  • コマ数の実測 (30/60) は CM が分かる前にやります。 窓は録画全体に散らす (「コマ数は本編の映像から測って決める」)

チャプターは -ss と同じだけ詰める

Section titled “チャプターは -ss と同じだけ詰める”

CM 検出は境目を ffmpeg の時刻 で返します。エンコードする ffmpeg で一緒に取った材料は、エンコードするほうと同じく頭の音声だけの区間を -ss で 捨てた時刻 (= エンコードしたもののコマの時刻) で、decide がコンテナの頭からの秒に直して返します (DB の cm_ranges もこの物差し)。 エンコードするたびに捨てる長さから引き直します (encoder.ts の own。字幕と同じ。再試行で足した頭捨て encodeRetrySeek もそのまま足す)。

1本目にはエンコードしたあとに書き足します (cm-cut.chapterArgs。-c copy で写すだけ。30分 570MB で 3 秒)。2本目からはエンコードするときに入れます。 コマ番号ではなく時刻で持つので、24 コマの映像を 30 コマで流す録画 (RFF) でも時刻はずれません。

CM を切るときは場面の切れ目にキーフレームを置く

Section titled “CM を切るときは場面の切れ目にキーフレームを置く”

エンコードする時点では境目が分からないので、場面の切れ目ごとにキーフレームを置いてエンコードし (scdet@key + -force_key_frames scd_metadata)、 境目が決まったらそこにあるキーフレームでエンコードしたものを切ります (cm-cut.ts。-c copy、concat デマクサの inpoint/outpoint)。 CM の境目は「無音の中の切れ目」なので (下の「境目の決め方」)、ほぼ必ずキーフレームが乗っています。

  • scdet@key は CM 検出と同じコマ (インタレ解除の前) で同じ閾値 (8) で測ります (解除の後で測ると境目の半分ほどで1コマずれる)。60コマで出すときは印が両方のフィールドのコマに写るので、キーフレームが2枚続きます
  • 境目から 1.5 コマ以内にキーフレームが無ければ (無音の真ん中に置いた境目など)、CM 側へ CM_CUT_MARGIN (0.8 秒) まで寄せます (本編を削るより CM が少し残るほうがまし)。それも無ければ境目の時刻を指してソフトウェアで再エンコード (-force_key_frames 時刻,…)、 それから切ります。切れなければ CM ごと置いてチャプターを入れます (1本目を切れなければ2本目も切らない。2本で長さが食い違わないように)
  • outpoint は dts で書きます。 x264 は B フレームがあり、境目のキーフレームの dts は pts より 2コマ前です。pts で切ると、 次の CM の頭のキーフレームまで前の切れに入ります。長さ (duration) は pts で書きます (書かないと concat は outpoint − inpoint を 長さにして、切れ目ごとに 2コマずつ後ろが詰まる)
  • 音は切れ目ごとに x264 で最大 2コマぶん CM 側にずれます (AV1 はずれない)。concat はファイルの位置で切るので、dts の順に並んだ 音の小包が映像の B フレームのずれのぶん前後の切れに入る。映像と音の時刻の関係は切れごとに元のまま (ずれは溜まらない)
  • 字幕 (ARIB の字幕をそのまま写したもの) も一緒に切れます。データ放送の時刻は、実際に切った所で詰めます (recorded-bml.ts)

GPU でエンコードするとき: VA-API は印の付いたコマを IDR にします。QSV は -forced_idr 1 を足さないと IDR にならず (I フレームのまま)、 入れ物にキーフレームとして書かれないので切れません (足してある)。手元に GPU が無いので実測はしていません — キーフレームが 境目に無ければ、上のとおりソフトウェアで再エンコードします。

録画の詳細の「その他…」→「CM検出をやり直す」で、再エンコードせずに CM を探し直します (encoder.runCmJob)。 エンコードするジョブと同じ待ち行列に並び (encode_jobs.kind = 'cm')、進み具合・中止・失敗の通知も同じです。同じ録画に ジョブは2つ積みません (エンコードしている最中に重ねると、同じファイルを2つが書き換える)。

  • 読む元は元のTS、無ければエンコードしたもの (mkv)。 どちらからでもロゴ・切れ目・無音は取れます。エンコードしたものは映像の大きさが 違う (1440x1080 → 1920x1080) ので、ロゴは大きさごとに覚えたものを使います (無ければその録画から覚える)
  • 時刻はエンコードするときと同じ物差し (コンテナの頭からの秒)。エンコードしたときに頭から捨てた長さを recordings.encode_skip に覚えておき、 元のTSから読んだ境目はそれを引いてチャプターに、エンコードしたものから読んだ境目はそれを足して cm_ranges に書きます
  • チャプターは CM の扱いの設定どおりに書き直す (-c copy で写すだけ): 「チャプター」「切り取る」なら差し替え、 「何もしない」なら外す。両方のコーデックでエンコードしていれば両方
  • CM を切ってエンコードした録画は戻せません (recordings.cm_kept に残した区間がある)。元のTSがあれば押したときに再エンコードを 促し、無ければ理由を出して押せなくします。 エンコードしたものが元のTSより 5 秒以上短ければ、cm_kept が無くても切ったものとみなして断ります
  • この列を足す前にエンコードした録画 (encode_skip も cm_kept も NULL): 元のTSがあれば頭の音声だけの区間を測り直して使います (再試行で足した頭捨ては分からない)。エンコードしたものしか無いときはエンコードしたものそのものから読むのでチャプターは合いますが、 cm_ranges はエンコードしたものの時刻のまま入ります (頭の音声だけの区間ぶん、1 秒弱早い)。CM を切ってエンコードしたものも見分けられず、 切ったものから読み直す (CM はほとんど見つからない) ことになります

本番の録画 4 本 (30 分アニメ・地上波 3 局と BS 1 局)、Ryzen 5 5600X、ffmpeg 9.0.2 で、前のやり方 (検出してからエンコード) と比べました。細かい表は git の履歴にあります。

  • 境目は 4 本とも前の検出と同じ (ロゴの枠とコマの数も一致)
  • チャプターだけなら速さはほぼ同じ。 消えるのは検出の 1 回ぶんの復号だけで、エンコード (CPU 2400〜8500 秒) と比べると 小さい。エンコードし始めるまでの待ちは 40〜60 秒減る。チャプターを書き足す段は 2〜6 秒
  • 切るのは前より重い (前は CM を切ってからエンコードしたので、エンコードが 2 割ほど短かった)。そのかわり境目がコマ単位で合う。 前は TS のキーフレーム (0.5 秒) でしか切れず、境目が 0.5〜1.3 秒 CM 側にずれていた。切れ目のキーフレームで大きさは 2〜4% 増える
  • AV1 の境目 28 か所のうち 23 か所はちょうど、残りも 4 コマ以内。1 か所だけ近くの切れ目から 2.3 秒離れていて、境目を指して 再エンコードする側に回った。切ったあとのコマ (framemd5)・音のずれ (1 ms 以内)・字幕の位置 (ずれ 0) も突き合わせてある

局ロゴの消えている所を CM にします。 CM の間はロゴが消えるので、無音だけより格段に確かです。 境目は近くの「無音 + 場面の切れ目」に寄せ、CM の並び (15 秒の倍数) で詰めます (下の「境目の決め方」)。 ロゴを覚えられない・当たらないときは同じ材料から CM の尺だけで決め直すので、これで録れなくなることはありません。

ffmpeg (1回だけ復号) ─┬ 映像: scdet (場面の切れ目) → metadata (一時ファイル: コマごとの時刻と点)
│ └→ ロゴの枠を切り出す → 標準出力 (白黒の未圧縮のコマ)
└ 主音声: silencedetect → ametadata (一時ファイル: 無音)
logo-own.ts 枠に点を付けて、ロゴの出ている区間にする (logo-detect.ts)
cm-decide.ts ロゴの区間・無音・切れ目から CM の区間を決める

1回だけ復号します (src/lib/server/cm-scan.ts。ふだんはエンコードする ffmpeg で一緒に行う — 上の「CM はエンコードしながら探す」)。時刻もコマの並びも ffmpeg の1つです。

  • 切れ目は scdet@cm がコマごとに付ける点を metadata=mode=print で一時ファイルへ書かせ、その時刻をそのままコマの時刻に使う (閾値は 100 にしてログは出させない。名前を付けるのは、切るときにエンコードする鎖にも scdet@key があるため)
  • ロゴの枠は scdet のあとで切り出すので、標準出力のコマと書き出しの行は同じ順に並ぶ (-fps_mode passthrough。 数が合わなければロゴは使わない)
  • 無音は主音声に silencedetect (16 ビットで ±50 以下が 0.15 秒以上。chapter_exe の既定と同じ大きさ)

src/lib/ts/cm-decide.ts。日本の地上波・BS の CM は、無音と場面の切れ目で区切られた 15 秒の倍数が並び、その間はロゴが消えます。 join_logo_scp の規則はそのまま移さず、この構造から組み直しました。

  1. 境目の候補 — 0.2 秒以上の無音の中と前後 0.2 秒にある切れ目。切れ目が無ければ無音の真ん中
  2. ロゴの消えている所を CM にする。 番組の間で 14.5 秒に足りないもの (アイキャッチ) は番組
  3. 端を寄せる — ロゴの出入りから 5 秒以内の候補へ。ロゴの点が大きく替わった切れ目があればそれ (消えた側が半分以下)、 無ければいちばん近い無音の、いちばん強い切れ目。継ぎ目の無音に切れ目が2つある (番組の映像 → 番宣のフェード) ときや、 番宣の字にロゴの判定が引きずられたとき (実機の日テレで 5 秒) に効く。ロゴは番組が戻ってから数秒遅れて出ることがある (実機の BSテレ東で 4.7 秒) ので、寄せる幅は広めに取る
  4. CM の並びで詰める — 端から 15 秒の倍数 (誤差 0.25 秒) ずつ候補をたどる。反対側の手前で並びが止まり、残りが CM の尺に 足りなければ、そこは番組 (CM の前のロゴの無いアイキャッチ、ロゴが遅れて出る番組の頭)。近くに無音の無かったロゴの出入りは 当てにせず、並びの止まった所まで。番組の間では、近くに無音の無いロゴの出入りを CM の端にしません。 CM は途切れの中の 最初の境目から最後の境目までで、境目が無ければ途切れごと番組です。ロゴが場面の途中で消えただけのことがあるため (実機の TOKYO MX で、背景に紛れてロゴが 16 秒判定できず、その間が CM になっていた。join_logo_scp も、無音も CM の並びも 無い所ではロゴが消えても CM の境目にしない)。録画の頭と尻の途切れは前後の番組との境目で、無音を挟まないこともあるので、 これまでどおりロゴの出入りから
  5. 提供は番組に残す — 番組の直後の 10 秒、または番組の終わりから CM の並びをたどった先の 10 秒 (CM は 15 秒の倍数)。 番組の映像に提供の字を重ねていることが多く、削ると番組が欠ける。提供の後には CM が続くので、番組が戻る直前の 10 秒でも CM の並び (15 秒おき) に続くものは局の番宣として CM (実機のフジテレビで、CM 120 秒の後、ロゴが戻る直前の 10 秒が番宣だった)。 並びの外にある 10 秒だけ提供とみる
  6. 前後の番組を外す — 番組表の尺の窓を、ロゴの出始めから始まる所・消え際で終わる所に置いてみて、ロゴがいちばん多く入る所を採る (同じくらいなら番組表どおりの頭に近い所)。窓の外のロゴは録画の頭と尻に入った前後の番組で、CM を挟まずに続くこともある。 窓の端も近くの無音の切れ目に寄せる
  7. CM に挟まれた短い所の頭の告知は CM にする — CM の間のロゴの出ている所が 60 秒以内 (次回予告と提供など) で、 CM の終わりからちょうど 5 秒か 10 秒 (誤差 0.25 秒) の所に強い切れ目があれば、そこまで CM を伸ばす。局の短い告知は ロゴを出したまま流れ、次回予告との間に無音が無いことがあるため。伸ばしたあとにロゴの出ている所が 15 秒残らないときと、 長い本編の頭には手を出さない

ロゴが使えなかったときは、0.8 秒以上の無音で区切った区間が 15 秒の倍数で 30 秒以上続く所を CM にします。0.4 秒にすると本編の「間」を拾い、実機 16 本の境目 123 で余分が 67 → 37、抜けが 42 → 32 でした。

ロゴを先に確かめます。 覚えていなければキーフレームだけ読んで覚え、それから1回の復号に枠を渡します。覚えられなくても 読み込みは続け、無音と切れ目だけで決め直します。そのときは理由を検出の覚え書き (recordings.cm_note) に残します (無音 36 箇所 (ロゴは使えず: …))。映像の読み込みで ffmpeg が落ちたとき (壊れた映像など) は、音だけ読み直して同じように決めます。

一覧の「ロゴでCMを判定できませんでした」はその覚え書きから決めます (format.logoUnusable)。別の列に印を持つと、 後から条件を広げても録ってある分に効かないためです。join_logo_scp の頃の覚え書き (join_logo_scp・jls は使えず) は、 上げるときのマイグレーションで新しい言い方に書き換えます (drizzle/0007_cm-one-pass.sql)。

局ロゴは自分で覚えて、自分で当てます (src/lib/ts/logo-detect.ts・src/lib/server/logo-own.ts。外のツールは使いません)。

覚えるのは CM検出のときで、録れたものをそのまま材料にします。 録る局は必ずエンコードを通るので取りこぼしません。 置き場は放送波から取得した PNG の隣 (data/logos/cm/<局ID>/own-logo-<幅>x<高さ>.bin)。SD と HD の録画が交互に来ても 育つよう、コマの大きさごとに持ちます。

  1. 覚える — キーフレームだけを 600 枚散らして抜き (-skip_frame nokey。全部を復号しないので速い)、上下 1/5 の範囲で 線の向きを足し合わせて在り処を割り出す (下の「在り処の割り出し」)。局のぶんを覚えていれば飛ばす
  2. 当てる — ロゴの枠を CM 検出の1回の復号で全部のコマから切り出してもらい (cm-scan.ts)、点を付けて区間にする。ついでに 90 コマおきに足して、覚えたものを育てる
  3. 録画をまたいで — 足していく (古いぶんは 6000 コマを上限に薄める)。覚えていたもので1コマも当たらなければ、 その録画から覚え直す。前と重なる所で覚えたときだけ持ち帰る (ロゴの無い特番で番組の透かしを覚えて、局の型を上書きしないように)

覚え方。 画素ごとに Sobel の勾配の向きを角を倍にした単位ベクトルで足し、コマ数で割った長さ (揃い方) を見ます。 ロゴの縁は後ろが何であれ毎コマ同じ向きなので、ロゴの出ていたコマの割合 (実機で 0.5〜0.6) まで残り、中身の縁は打ち消し合って 0.07 以下になります。倍角にするのは、白いロゴが暗い所にも明るい所にも乗って勾配の符号が場面で反転するためです。 足し合わせたまま持つので、録画をまたいで足せます。番組が出し続けるテロップ (BSテレ東 の帯の飾り) は別の番組で薄まります。

当て方。 覚えた縁の画素で、そのコマの勾配の向きが ±26° 以内に揃う割合を数え、型を斜めに 6 画素ずらした4箇所で 同じように数えた割合を引きます。後ろが細かい柄だと、ロゴが無くてもたまたま揃う画素が出ますが、それはずらしても揃うので 消えます。ロゴの出ているコマで 0.6〜0.85、出ていないコマは CM の間ずっと 0.1 に届きません。

見えないことと、無いことは違う。 半透明の白いロゴは、後ろが白っぽいと溶けて点が 0 まで落ちます (実機のテレ東: 型の画素の明るさが 208 を超えると、ロゴの出ているコマでも点の 9 割が 0.16 未満)。そのまま「消えた」と読むと、本編の 明るい場面のたびに切れました (テレ東の30分で 5 区間のところを 38 区間)。そこで判断できない後ろでは直前の判断を持ち越します。 どの後ろが判断できないかは録画ごとに映像から決めます。

  1. 型の画素の明るさ (16 段) ごとに点の上位 5% を見て、出す/消すの境目 (0.25) に届かない段は外す。 数えるのは前後 2 秒にロゴがはっきり見えたコマだけ (CM の間まで数えると、CM にしか出ない後ろは 上位 5% も 0 なので「見えない段」になり、CM の頭へ判断が持ち越される)
  2. 1 で出した区間の中で、明るさ × 肌理 (隣り合う画素の差) の段ごとに点が 0.12 を割った割合を数え、1 割を超える段も外す。 実機のテレ東では、明るさ 176〜207 で肌理のある所が 1〜2 割、208 以上は半分以上割っていた
  3. ただしのっぺりして白くない後ろは、いつでも判断する (ロゴが乗っていれば必ず縁が立つ)。番組の切れ目の 真っ黒は局がロゴごと消すので、1 では「見えない段」になり、番組の終わりのロゴが黒い間 15 秒ぶん持ち越された (実機の BS11)

白いロゴなら明るい段が、黒い縁取りのロゴなら暗い段が外れます。そのうえで前後 1 秒の中で 3 番目に高い点が 0.25 を超えたら出た、0.12 を割ったら消えた、とし (ヒステリシス)、境目はならした点 (9 コマの中央値) で戻します。 1 秒未満の切れ目は埋め、2 秒未満の区間は捨てます。

切り出しは比で指定します。 途中で大きさの変わる録画 (SD の CM) でも枠がはみ出さず、比で切ってから小さい枠だけ戻すので、 同じ大きさのときの scale は何もしません (コマ全体を scale すると切り出しの CPU が倍になる)。

同じ映像を流している局は1つにまとめます (logo-data.stations)。放送局はサブチャンネルの枠を 常時流していて、マルチ編成をしていない間は本チャンネルと同じ映像・同じ SDT の局名が出ています (実機では TOKYO MX1 が 23608/23609、フジテレビが 1056/1057/1058)。束ねないと 設定の「チャンネル」の表の「CMロゴ」の列に同じ画像が2つ並びます。覚えたら同じ映像の局へ写し (share。向こうが同じ大きさのものを 持っていれば写さない。局がロゴを替えて覚え直したときだけ上書きする)、サブチャンネルの枠で録れた番組が一から覚え直さないようにします。覚えたロゴを捨てるのも、 束ねた局まとめてです。束ねる鍵にはネットワークも入れます (局名だけだと同名の別系列を1つにしてしまう)。

透かしは隅にしか出ません。 画面全体は探さず、上下 1/5 の範囲で足した揃い方 (上の「覚え方」) を四隅 (横 1/3) ごとに切り出し、強い縁のかたまりを選びます (logo-area.pickArea)。右上から見ます (国内の地上波はほぼここ)。

  • 上位 1% の縁を太らせて (4 画素) 繋ぐ。 繋がないと「テ」「レ」「東」が別のかたまりになる
  • ロゴより大きいかたまりは張り合わせない。 画面の 15% × 10% を超えるもの (テロップの帯・黒帯の縁) は除ける
  • 隣り合う (16 画素以内) かたまりは括る。 テレビ朝日 は図形と文字が離れていて、文字だけの枠では覚えられなかった
  • 選んだかたまりが上位 1% の縁の 65% を持っていなければ言い切らない (EDGE_SHARE)。ロゴと張り合う 「動かない縁」(背景の窓枠、出し続けるテロップ) が同じ隅にあるときで、どの隅も駄目ならその録画では覚えず、 無音検出に落ちて次の録画でまた割り出します。ロゴと同じくらい動かない縁のほうを言い切って覚えると防げません (画面で捨てて覚え直す)。 TOKYO MX1 で窓枠をロゴと取り違えた回の録画は残っておらず、試せていません
  • 外接枠を中の縁の 95% で締め、15% の余白を足す

位置を手で教える手段はありません。 自前の割り出しは実機の 16 本 (12局) で全部ロゴを当てました (下)。 違うものを覚えたときは、CMロゴを押して開く窓の「覚え直す」で捨てます (下の「覚えたロゴを画面で確かめる」)。

番組の半分以上がCM判定になった結果は捨てます。 ロゴを覚えたての回など、「頭の2秒だけ本編」のような結果に なることがあります。ロゴで決めた結果が多すぎれば尺だけで決め直し、それも多すぎれば CM 無しにします。本編を削るよりCMが残るほうが被害が小さいためです。

ffprobe の出力はキーで読みます (cm.fields。-of default=nw=1 の key=value を引き、同じキーは最初のもの)。1本のTSに局がいくつも 入っている (TOKYO MX は MX1 と MX2) と -select_streams v:0 でも番組ごとに同じ行が並び、-show_entries の順でも返らないためです。

捨てたときも「ロゴでCMを判定できませんでした」と出します。 ロゴは当たったと言うのに毎回100%がCM判定で 捨てられるのは、ロゴではない縁 (常時出ている枠や字幕の下地) を覚えたときです。覚えたロゴを確かめて捨てるボタンは 設定の「チャンネル」の表で CMロゴを押して開く窓にあります。ロゴの消えている所が1つも無かったときも同じです。

うまくいった回はCM欄ごと出しません (format.cmNoteWorthShowing)。ロゴ とだけ書いても 読む人には何の情報にもならず、切れ目はチャプターで分かります。何か書いてあること自体が 「いつもの精度は出ていない」の合図になります。

覚えているロゴは設定の「受信」の「受信できるチャンネル」(/settings/reception#channels) の「CMロゴ」の列に、覚えた局の行で出ます (開け閉めしない。押すと大きく見られ、そこで「覚え直す」)。 覚えた枠の揃い方を白黒の画像にして出します (/api/services/<id>/logo-data)。いちばん揃うところを白に伸ばします (揃い方はロゴの出ていたコマの割合 までしか上がらないので、1 を白にすると灰色にしかならない)。SD と HD を両方覚えていれば、最後に書いたほうです。

出すのは画像と「いつ更新したか」だけです (当てるたびに育てて書き直すので、最後に当てた時刻に近い)。 違う画像を覚えていたら、大きく見る窓の「覚え直す」で捨てられます。入れ物ごと消し (同じ映像の局に写したぶんも)、その局の次の録画をエンコードするときに 一から覚え直します。

logoframe から乗り換えた (実機の 16 本)

Section titled “logoframe から乗り換えた (実機の 16 本)”

乗り換えた理由は BSテレ東 です。 logoframe はロゴを「色と濃さ」で覚えるので後ろがのっぺりしたコマが要り、 後ろがほとんど明るいセットの BSテレ東 では覚えられずに降りていました。自前は線の向きだけを覚えるので、後ろが何でも構いません。

実機の録画 16 本 (12局・9.6 時間) を、前の仕組み (logoframe・chapter_exe・join_logo_scp) と今の仕組みの両方に通して CM の境目を突き合わせ、食い違った所は映像で確かめました (表と数字は git の履歴にあります):

  • ロゴ: 自前は 16 本とも一から覚えた (logoframe は TOKYO MX1 の1本と BSテレ東 で覚えられなかった)。比べられる 15 本中 11 本で CM の境目が1コマも違わず、BSテレ東 は自前でだけ当たった (前は無音検出に落ちて CM 2 箇所を外していた)
  • 境目: 123 のうち 113 が 4 コマ以内。それ以上ずれた 12 か所は、映像で見て今の仕組みが正しいのが 10、前が正しいのが 1、 決めきれないのが 1。前の仕組みは録画の尻の CM の中の 10 秒前後の番宣を本編にしがちだった (join_logo_scp の「提供」の扱い)
  • 速さ: 1 時間ぶんあたり壁時計 140 秒 → 76 秒、CPU はほぼ同じ (4 コア、2本目から)。chapter_exe が索引を作るために ファイルを頭から読み直していたぶんが消えた。エンコード (30 分で CPU 1 万秒ほど) と比べればどちらも 2% ほど

まだ外すもの: 番組の頭のロゴの無い枠。 テレビ朝日 の「IMAnimation」や、ロゴを出さずに始まる BSテレ東 の番組のように、 番組が始まってからロゴを出すまでの数秒は CM と見分けが付きません (どちらもロゴが無く、境目に無音とシーンチェンジがある)。 番組の頭だけ「ロゴが無くても本編」とみなすと、録画の頭に入る前の番組の CM まで本編に入るので、手を入れていません。