CMスキップ

元ネタは、foltiaの中の人。
foltiaで全自動CMカットを実現しよう :宗子時空

いつもの通りwineは使わないので、portingされてないかなーと探してみると、MacOSのとlinuxのがあった。
GitHub - essandess/etv-comskip: Commercial Marking and Skipping for EyeTV and iTunes Exports
Comskip for Linux released

MacOSのは、Makefileが何やってるのだかさっぱり分からんので10秒で放棄。

linuxのはbuildがやたら難しいようで、forumが阿鼻叫喚。ひとまずconfigureしてみようと、0.93eを取ってきた。
#forumメッセージの#1をupdateしてくれてるので、最新バージョンは#1を見ればいいです

最初の関門は、gcc-4.8以上が必要ってところ。9.1-STABLEは、gcc-4.2.1なのでした。portsnapして、portmaster -PPして。。。うー、gcc48のpackageがないー。Atomでbootstrap stage1 stage2って、一晩かかるな、こりゃ。

comskipがちゃんと動けば、おれおれDLNAサーバでこのセグメント情報を使えるようにする予定。1つのtsファイルに対して、CMを除いたOP/Aパート/Bパート/EDをそれぞれ別のエントリとして返してやれば、BRAVIAさんはこれを連続再生してくれて、結果的にCMスキップされるはず。検出ポイントがtimeかframeのoffsetで返されるっぽいのが面倒だけど、なんとかbyte offsetに換算して、例によってファイルのextattrに埋め込んでやるのが良さそう。

というわけで、まだ実質何も動いてないぞ。build失敗とか、comskipクラッシュとか、全然検知されーん、とかいろいろありそうな罠。

buildまではできたので追記

  • multimedia/ffmpeg(2.0.1)と、lang/gcc48(4.8.2.s20131010)を入れておく。
  • devel/argtable2も入れるが、なぜかargtable2.pcがインストールされないので、手で/usr/local/libdata/pkgconfigにコピー。
  • 他にも要るかも。怒られたら適当に追加。
% CC=gcc48 CXX=g++48 ./configure

gmake、すると怒られたので、適当に修正。glibcとの差というか。とりあえず下記。

 diff --git a/CsEdges.h b/CsEdges.h
 index d89104f..0b206c9 100644
 --- a/CsEdges.h
 +++ b/CsEdges.h
 @@ -4,6 +4,8 @@
  #include "CsOptions.h"
  #include "CsExceptions.h"

 +#include <cmath>
 +
  namespace CS {

  class Edges
 diff --git a/CsOptions.h b/CsOptions.h
 index 363cbca..8632440 100644
 --- a/CsOptions.h
 +++ b/CsOptions.h
 @@ -10,19 +10,19 @@
  #define MULTI_EDGE_BUFFER 0

  #ifdef __GNUC__
 -#include <features.h>
 -#if __GNUC_PREREQ(4,8)
 +// // #include <features.h>
 +// #if __GNUC_PREREQ(4,8)
  #undef USE_NEW_CPP_CONSTRUCTORS
  #define USE_NEW_CPP_CONSTRUCTORS 1
 -#else
 -#if __GNUC_PREREQ(4,7)
 -#ifdef __GNUC_PATCHLEVEL__
 -#if __GNUC_PATCHLEVEL__ >= 2
 -#undef USE_NEW_CPP_CONSTRUCTORS
 -#define USE_NEW_CPP_CONSTRUCTORS 1
 -#endif
 -#endif
 -#endif
 -#endif
 +// #else
 +// #if __GNUC_PREREQ(4,7)
 +// #ifdef __GNUC_PATCHLEVEL__
 +// #if __GNUC_PATCHLEVEL__ >= 2
 +// #undef USE_NEW_CPP_CONSTRUCTORS
 +// #define USE_NEW_CPP_CONSTRUCTORS 1
 +// #endif
 +// #endif
 +// #endif
 +// #endif
  #endif

 diff --git a/getopt.h b/getopt.h
 index 91eb54e..bfc6c54 100644
 --- a/getopt.h
 +++ b/getopt.h
 @@ -133,7 +133,8 @@ struct option
     errors, only prototype getopt for the GNU C library.  */
  extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
  # else /* not __GNU_LIBRARY__ */
 -extern int getopt ();
 +// extern int getopt ();
 +#  include <unistd.h>
  # endif /* __GNU_LIBRARY__ */

  # ifndef __need_getopt

とりあえず起動まで。

$ ./comskip 
Comskip 0.93e.000, made using avcodec
The commandline used was:
./comskip

Usage:
  comskip  [-h|--help] [-w|--debugwindow] [-n|--playnice] [--zpcut] [--zpchapter] [--videoredo] [--csvout] [--quality] [--plist] [-m|--demux] [-p|--pid=<string>] [-t|--ts] [-d|--detectmethod=<int>] [-v|--verbose=<int>] [-u|--dump=<int>] [-s|--play] [--timing] [-q|--quiet] [--ini=<file>] [--logo=<file>] [--cut=<file>] [--output=<file>] [--selftest=<int>] <file> [<file>]

  -h, --help                Display syntax
  -w, --debugwindow         Show debug window
  -n, --playnice            Slows detection down
  --zpcut                   Outputs a ZoomPlayer cutlist
  --zpchapter               Outputs a ZoomPlayer chapter file
  --videoredo               Outputs a VideoRedo cutlist
  --csvout                  Outputs a csv of the frame array
  --quality                 Outputs a csv of false detection segments
  --plist                   Outputs a mac-style plist for addition to an EyeTV archive as the 'markers' property
  -m, --demux               Demux the input into elementary streams
  -p, --pid=<string>        The PID of the video in the TS
  -t, --ts                  The input file is a Transport Stream
  -d, --detectmethod=<int>  An integer sum of the detection methods to use
  -v, --verbose=<int>       Verbose level
  -u, --dump=<int>          Dump the cutscene at this frame number
  -s, --play                Play the video
  --timing                  Dump the timing into a file
  -q, --quiet               Not output logging to the console window
  --ini=<file>              Ini file to use
  --logo=<file>             Logo file to use
  --cut=<file>              CutScene file to use
  --output=<file>           Folder to use for all output files
  --selftest=<int>          Execute a selftest
  <file>                    Input file
  <file>                    Output folder for cutlist

Detection methods available:
          1 - Black Frame
          2 - Logo
          4 - Scene Change
          8 - Resolution Change
         16 - Closed Captions
         32 - Aspect Ratio
         64 - Silence
        128 - CutScenes
        255 - USE ALL AVAILABLE

Errors:
ComSkip: missing option <file>
$

続きはまた。。。