なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

comskipのUNIX化

CMカットの自動化を求めて

以前comskipのオプションをうまく使えば、CMカットが楽勝だと聞いていろいろ試してみた。

関連記事
foltiaで全自動CMカットを実現しよう :宗子時空
CMスキップ - だえもんだもん

一応自前の環境、Debian GNU/Linuxでビルドできるようにcomskipを修正した。
comskipは非常にソースが汚く苦労した。

ビルド方法等

ソースは以下のgithubに置いています
GitHub - hangingman/comskip: Comskip, a free MPEG commercial detector

ビルドは以下のようにすればできるはず(x264,argrable2,pthread,libmに依存する)

 $ git clone https://github.com/hangingman/comskip.git
 $ cd path/to/comskip/
 $ git submodule init
 $ git submodule update
 $ ./bootstrap
 
 // bootstrapでうまく行かなければ
 $ autoheader; aclocal; automake --add-missing; autoconf

 # ffmpegのディレクトリに移動してビルドする
 $ cd ffmpeg
 $ ./configure --enable-gpl --enable-version3 --disable-stripping --enable-libx264 --enable-shared
 $ make && make install

 # comskip本体をビルドする
 $ cd ../
 $ ./configure
 $ make && make install

 # comskipのラッパースクリプトを用意しているので使ってみてください
 # 実行するとCMカット、分離、結合まで自動でできます
 $ cd misc/
 $ chmod +x comskip_wrapper.sh
 $ ./comskip_wrapper.sh comskip.ini kill_la_kill_#6.ts

なぜffmpegをcomskip以下に持っているかというと、comskipがffmpegの特定バージョンに依存しているからだ。
comskipディレクトリのconfigureからffmpegのconfigureを呼べるように細工しようとしたが、ffmpeg側でconfigure.acを
配布していないため、不可能だった。

だから、インストール方法としてはffmpegを/usr/local以下にインストールした後、それに依存したcomskipをビルド
するのが良いと思い、そうしている。

テスト

comskip.iniは以下のものを使用する

detect_method=255
min_show_segment_length=125
punish=28
output_vdr=1

この設定だとcomskipの走査終了後に.vdrファイルができてCMカットしやすい。

検証のため、自作のネイティブ版とwineで動かしたcomskipに、同じtsファイルを食わせてみた。
使用したファイルはキルラキル5話。

ネイティブ版(GNU/Linux elf 64)の起動

 $ LD_LIBRARY_PATH=/usr/local/lib comskip -t -d 255 -v 2   \
   --zpcut --zpchapter --videoredo --csvout --quality      \
   --plist --ini=./comskip.ini ./3160-5-20131102-0310.m2t

できあがった.vdrファイル

0:00:21.38 start
0:01:49.37 end
0:04:13.65 start
0:05:42.84 end
0:12:51.77 start
0:15:16.31 end
0:24:25.43 start
0:30:36.63 end

wine版(windows x86)の起動

 $ wine ~/.wine/drive_c/Program\ Files/comskip/comskip.exe \
   -t -d 255 -v 2 --zpcut --zpchapter --videoredo --csvout \
   --quality --plist --ini=./comskip.ini 3160-5-20131102-0310.m2t

できあがった.vdrファイル

0:00:21.38 start
0:01:49.37 end
0:04:13.65 start
0:05:42.84 end
0:12:51.77 start
0:15:16.31 end
0:24:25.43 start
0:30:36.63 end

見事Windowsネイティブ版とLinux版で、本編部分が一致した。やったぜ。

結論

しかし、残念なことに本当のCMの位置と、.vdrファイルのCMの位置は全く一致していない。
(※目視確認でのアニメ本編は 00:01:40:00ごろ開始である。comskipの検出ガバガバじゃねえか…)
つまりcomskipはCMを検出できていない or 誤検出している。

とりあえずこの人はできるとレスしてるが、実際comskip使ってCM検出できるんでしょうかね…

536 :名無しさん@編集中:2013/10/05(土) 22:23:02.74 id:iNl1yeOz
comskip81_056を一日弄っていたけど、CMスキップ楽勝だね、アニメじゃなくても。
先人に感謝。
detect_method=255、min_show_segment_length=125、punish=28
.vdr(output_vdr=1)で出力すると加工は楽です。
自分はバッチでchapters.txtにしてから、空橋さんの「gen_.chapters.txt_to_.chapter(チャプタースキップ用)b.bat」を通してTVTplayで見ている。
Avisynth要りません。まあcomskipはtrimコマンド出力できるので入用な人は大丈夫ですね。

続報

前から気になっていた自動TSエンコードバッチ(AutoConvert)を配布しておられるらんだむけんきゅうじょさんのcomskip.iniを使用させていただいたところ、割とうまいことCMを検出できた。
AutoConvert – 自動TSエンコードツール – – らんだむけんきゅうじょ

出力結果

0:00:00.50 start
0:01:38.33 end
0:13:16.16 start
0:15:16.31 end
0:27:51.23 start
0:30:36.63 end

出力結果はCMの開始・終了とピタリ一致している。(最初のスタート部分以外)
これをバッチ処理ffmpegに渡せばfoltiaとも連携できそうだ。

【課題】
・最初と最後の部分のCM判別が緩い、そのためOP前と次回予告前に少しCMが入るようだ
 → 最初と最後のデータだけもう一度comskipで検出させる?
bashffmpegに渡す動画時間の計算を行わせたところ、ミリ秒単位では計算できなかった
 → Perlとか使う?

2013/12/31 追記
UbuntuやMintでcomskipがビルドできない問題に対処したパッチをマージしました。
shirase氏、2ちゃんねるの【視聴・録画】Linuxでテレビ総合8【デジタル/アナログ】の人ありがとう!

2014/01/26 追記
Fedora 17 x86_64(つまりRHEL系)でのビルドを可能にしました、GitHubの最新を使えばビルドできるはずです。ただし、昔のCentosだとカーネルが古くてビルド不可と思われる、Centos5系は多分ダメ。

・comskip_wrapper.shの新しいパッチをいただきました。ありがとうございます。

 可能になったこと
 ・日本語 or スペース混じりのファイルのCMカット結合処理
 ・センチ秒単位のCMカット

・以前書いたavconvとの連携処理をバッチ化したシェルをGitHubに貼っておきます。参考になればどうぞ。
 comskipとffmpeg(avconv)連携スクリプト · GitHub
 wine + Murdoc Cutter + avconvでCMカット - なんとな~くしあわせ?の日記

・CMカットの成績
 試験として「這いよれ!ニャル子さんW」「はたらく魔王さま!」「ココロコネクト」等のアニメをcomskipに食わせてみたが、いずれもほぼCMがちゃんと切れている。(…次回予告も、画面右上にロゴがあれば検知できているように思う)しかし、今のところドラマとか一般的な放送は試しておらず、pt2以外の環境で録画したTSファイルについてもよくわかっていない。生のTSファイルのデータはどれも変わらないと思っていたのだが、comskipの使用報告を見るに何か環境の違いが原因でCMカットの精度が変わっているように思う。

2014/07/22 追記
・argutable2へのライブラリの依存関係を減らしたソースをマージしました、ありがとうございますgleenteaさん