本ソフトウエアは、開発中止とします。 後継は、改良版である CMcut4U2 です。
従来 Unix系OS 上で 自動CMカットを行おうとすると comskip ぐらいしか選択肢が無かった。 しかし comskip は精度が悪かったり、 誤判定した時のリカバリが面倒だったりしたので、 自作することにしました。
本プログラムは、「PT2等で録画した mpeg2tsファイルを H.265(HEVC) にエンコードしつつ同時に自動で CMカットを Linux(Unix 系 OS) 上で実行する」為のものです。
CMカット単体の処理の概要は下記の通りです。
これを、TSdir で指定したディレクトリ以下の .ts ファイルに対して繰り返し、 Outdir で指定したディレクトリに mp4 ファイルを出力します。
下記のコマンド例は、Ubuntu でのものです。 他の OS の場合は、コマンドやパッケージ名は適宜変更して下さい。
$ sudo apt install ruby
$ sudo apt install ruby-gtk2
$ sudo gem install wav-file
$ sudo apt install python-dev python-numpy
$ sudo apt install ffmpeg
$ sudo apt install mpv
opencv は公式パッケージには無いので、 opencvの 公式ページ の手順に従ってソースからインストール。
$ sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
$ mkdir tmp ; cd tmp
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git
$ cd opencv ; mkdir build ; cd build
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ make install
git clone https://github.com/kaikoma-soft/CMcut4U.git .
を実行する。
パラメータ名 | 意味 |
---|---|
Top | TSファイル等のデータを格納するディレクトリ |
CPU_core | CPUのCPUのコア数 |
$ffmpeg_bin | ffmpeg の実行ファイル名 |
$nomalSize | エンコード後の本編画面サイズ |
$comSize | エンコード後の CM 画面サイズ |
$python_bin | python の実行ファイル名 |
% mkdir $HOME/video
% cd $HOME/video
% mkdir TS mp4 logo work
入力の TS ファイルは、TS ディレクトリ以下に番組単位のサブディレクトリを 作りその中に置く。
Top
├── TS
│ ├── 番組名-1
│ │ ├── タイトル #01.ts
│ │ ├── タイトル #02.ts
│ │ └── ...
│ ├── 番組名-2
│ │ ├── タイトル #01.ts
│ │ ├── タイトル #02.ts
│ │ └── ...
│ └── ...
│ ├── ...
│ ├── ...
│ └── ...
出力の mp4 ファイルは Top/mp4 以下に TSディレクトリと相似したものが 生成される。
% logoAnalysisSub.py --dir work/番組名/タイトル/SS
スクリーンショット画像が表示されるので、 ロゴマークが明瞭な時点の画像を保存する。
キー | 意味 |
---|---|
j | 60コマ( 30秒)飛ぶ |
k | 60コマ( 30秒)戻る |
s | 現在の画像を保存する。 |
b | 前のコマ( 0.5秒)に戻る |
q | 終了 |
上記以外 | 次のコマ( 0.5秒)に進む |
XXXXX:
:logofn: YYYY.png
:cmlogofn:
:position: top-right
:chapNum: 6
:duration: 465
オプション
option | 意味 |
---|---|
-f |
lock を無視して実行する。 |
--co |
CMカットに必要な計算のみ行う。mp4(HEVC)化のエンコードは行わない |
--cm |
本編画面サイズを $comSize にする。 |
--ng |
NG なものだけ対象にする。(cmcuterChk.rb 参照) |
--ic |
chapList.txt のハッシュチェックを行わない。(chapList.txt参照) |
--uc |
中間結果ファイルを再利用する。 |
--sa n |
誤差の許容範囲を n 秒にする。デフォルトは 3秒 |
--dd n |
n = 1 : 出力 mp4 ファイルを削除 |
n = 2 : 上記 + chapList ファイルを削除 | |
n = 3 : 上記 + 作業ディレクトリの logo 解析キャッシュを削除 | |
n = 4 : 上記 + 作業ディレクトリのチャプタ毎 mp4 ファイルを削除 | |
n = 5 : 上記 + 作業ディレクトリの wav,jpeg ファイルを削除 | |
--ar |
作業用ファイルの自動削除 |
機能
CMカットが正しく行われたかチェックする。
logo-table.yaml ファイルに書かれた値と比較して、OK/NG を表示する。
チェックするのは、mp4ファイルがあるか、チャプター数、本編の時間。
オプション
option | 意味 |
---|---|
--ng |
結果が NG な番組だけ表示する。 |
--sa n |
誤差の許容範囲を n 秒にする。デフォルトは 3秒 |
出力例
>>>>> 番組名 XXXXX <<<<<<<
( chapNum=10, duration=1440 )
No Name mp4 chap duration result
1 01 ○ 10 1440.0 OK
2 02 ○ 10 1440.0 OK
3 03 ○ 10 1440.0 OK
4 04 ○ 10 1440.0 OK
5 05 ○ 10 1440.0 OK
6 06 ○ 10 1440.0 OK
7 07 ○ 10 1440.0 OK
8 08 ○ 10 1440.0 OK
9 09 ○ 10 1440.0 OK
10 10 ○ 10 1440.0 OK
11 11 ○ 10 1440.0 OK
12 12 ○ 10 1430.0(-10) NG
機能
修正ファイル( Top/TS/番組名/fix.yaml ) を GUIで作成する。
これにより、自動判定が間違っている場合に、強制的に 本編/CM
を固定することが出来る。
使い方は、
オプション
option | 意味 |
---|---|
--uc |
中間結果ファイルを再利用する。 |
--sa n |
誤差の許容範囲を n 秒にする。デフォルトは 3秒 |
注意
修正した mp4 を得るには cmcuterAll.rb を実行する必要がある。
機能
修正ファイル( Top/TS/logo-table.yaml ) を GUIで編集する。
使い方は、
オプション
なし
機能
スクリーンショットの画像と logoファイルのテンプレートマッチングを行う。
--dir
オプションだけ指定された場合は、表示モードになる。
オプション
option | 意味 |
---|---|
--dir name |
スクリーンショットが保存された dir を指定する。 |
--logo name |
logo ファイル名を指定する。 |
logo-table.yaml
番組名単位で、下記のパラメタを設定するファイル。 エントリーはディレクトリの有無で、自動的に作成/削除されるので、 値を書き換える。( Top/TS/logo-table.yaml )
keyword | 意味 |
---|---|
:logofn: | 本編を認識する為の logo ファイル名。( Top/logo 以下の相対パス) |
:cmlogofn: | CM 判定の為の logo ファイル名(詳細は後述) |
:position: | logo の画面上の位置。デフォルトは “top-right” で “top-left”, “bottom-left”,”bottom-right” が指定可 |
:chapNum: | チャプター数 |
:duration: | 本編の時間(秒数) |
:monolingual | 二カ国放送を日本語のみにするオプションを追加。デフォルト 0 0 : なし 1 : -map_channel 0.1.0 -map_channel 0.1.0 (音声の左右の場合)2 : -ac 1 -map 0:v -map 0:1 (ストリームが別の場合) |
:audio_only | logo解析を行わず、音声のみでチャプター割を行う。true/false デフォルトは false |
:fade_inout | フェードイン、アウトを行う true/false。 デフォルトは true |
:ffmpeg_vfopt | mp4エンコード時の -vf オプションに任意の文字列を追加する。(4:3に変換する時など) |
:ignore_endcard | Endcard の検出の無効化 true/false デフォルトは false |
:ignore_check | このディレクトリ cmcuterChk の対象外とする true/false デフォルトは false |
:mp4skip | このディレクトリは無視する true/false デフォルトは false |
:cmcut_skip | CMカット処理は行わず、丸ごと mp4化する。true/false デフォルトは false |
:opening_delay | 本編の開始時間を指定した秒数遅延させる。デフォルト 0 |
:closeing_delay | 本編の終了時間を指定した秒数遅延させる。デフォルト 0 |
:nhk_type | 本編途中にCMが無く、本編の前後に長い無音期間が有る場合 true。デフォルトは false |
XXXXX:
:logofn: YYYY.png
:cmlogofn:
:position: top-right
:chapNum: 6
:chapNum1: 8
:duration: 465
:duration2: 495
:monolingual: 2
:audio_only: true
:fade_inout: false
:ffmpeg_vfopt: crop=1440:1080:240:0
記述例
---
- - All
- 1606
- HonPen
チャプター割の計算結果が格納されたファイル。
( $Top/work/番組名/タイトル/chapList.txt)
計算結果が間違っていた場合、このファイルを修正して再実行すると
それに従って、再変換される。
なお修正した場合は cmcutAll.rb 実行時に –ic オプションを付けて実行する必要がある。
(付けないと自動判定の計算が行われてしまう。)
例
0:00:00.00 CM
0:01:36.90 HonPen
0:04:11.92 CM
0:06:27.37 HonPen
0:15:07.89 CM
0:17:22.88 HonPen
0:29:06.88 CM
0:30:06.00 EOF
cmcut.skip
TS/番組名/cmcut.skip のファイルが存在すると、そのディレクトリにある TSファイルは、 CMcut の計算処理を行わず、丸ごと H.265(HEVC) にエンコードを行う。
mp4.skip
TS/番組名/mp4.skip のファイルが存在すると、そのディレクトリにある TSファイルは、 全て無視される。
cmcuterAll.rb と同じ場所に、override.rb という名前でファイルを置くと、
メソッドのオーバーライドが可能です。
具体的にはハードウエアエンコードを使用したい場合などに用います。
class Ffmpeg
#
# h264_nvenc を使用
#
def ts2x265( opt, debug = false )
arg = %W( -y )
arg += %W( -ss #{opt[:ss]} -t #{opt[:t]} ) if opt[:ss] != nil
arg += %W( -i #{@tsfn} )
arg += %W( -vcodec h264_nvenc -preset fast -acodec aac )
arg += %W( -s 640x360 #{opt[:outfn]} )
system2( "/usr/bin/ffmpeg", *arg )
end
end
実行時間
項目 | 時間(秒) |
---|---|
スクリーンショット作成 | 92.17 |
wav 作成 | 20.64 |
logo 解析 | 30.43 |
チャプター分割 | 1.95 |
HEVCエンコード | 1684.95 |
計 | 1830.14 |
CM判定実績( 2018年夏アニメ )
タイトル | 放送局 | 話数 | fix数 | fix内容 | 結果 |
---|---|---|---|---|---|
3D彼女 リアルガール | BS日テレ | 12話 | 全1+1 | 前番組の最後と予告編を誤判定 | △ |
あそびあそばせ | BS11 | 12話 | 0 | - | ○ |
すのはら荘の管理人さん | BS11 | 12話 | 1 | 12話 提供+EndCard をCM と誤判定 | △ |
はたらく細胞 | BS11 | 13話 | 0 | - | ○ |
はねバド! | BS11 | 13話 | 0 | - | ○ |
ゆらぎ荘の幽奈さん | BS11 | 12話 | 0 | - | ○ |
アンゴルモア元寇合戦記 | BS11 | 12話 | 0 | - | ○ |
オーバーロードⅢ | BS11 | 13話 | 0 | - | ○ |
ハイスコアガール | BS11 | 12話 | 1 | 11話最後のおまけ15秒部分 | △ |
プラネット・ウィズ | BS11 | 12話 | 0 | - | ○ |
ヤマノススメ3 | BS11 | 13話 | 0 | - | ○ |
ロード オブ ヴァーミリオン | BS11 | 12話 | 0 | - | ○ |
七星のスバル | BS11 | 12話 | 1 | 07話で、予告編を誤判定 | △ |
天狼 Sirius the Jaeger | BS11 | 12話 | 0 | - | ○ |
殺戮の天使 | BS11 | 12話 | 0 | - | ○ |
百錬の覇王と聖約の戦乙女 | BS11 | 12話 | 全1 | 全話共通で、予告編を誤判定 | △ |
邪神ちゃんドロップキック | BSフジ | 11話 | 0 | - | ○ |