cmカットスクリプト『ComskipBatch.rb』の紹介(Linux / Windows両対応)


CMカットrubyスクリプト『ComskipBatch.rb』をご紹介します。単純にTSからCMをカットします。適宜アップデートをかけるので、修正が入ったりした場合には、twitterで告知するようにします。

コマンド実行例は下記の通りで、『ComskipBatch.rb』に、対象ファイルを指定してCMカット処理を実行します。また、番組ごとにcomskipの設定値をcomskip.iniファイルで調整しないと、CMの検出がまばらになってしまう事があるので、ディレクトリ内にcomskip.iniと言うファイルがあれば、CM検出時にはその設定を優先します。他にもCMが無いけど番組の最後に5分ほどのCMが必ず入るような放送に対応する為に、最後の○分を切り捨てる事も出来ます。

実行例

# 対象のファイルを1つだけ指定して実行する例
ruby /opt/comskip_batch/ComskipBatch.rb --margin 3 \
  --file /var/www/epgrec/video/録画.ts \
  --move_to /var/www/epgrec/video/CMカット済/
  --failed_to /var/www/epgrec/video/CMカット失敗

# findコマンドと組み合わせて、対象ファイルを一括処理する例
find /mnt/video/ -type d \( -name 'CMカット済' \) -prune -o -type f  -name "*.ts" ! -name "*CS*" | \
  xargs -I% ruby /opt/comskip_batch/ComskipBatch.rb --margin 3 --file % --move_to /mnt/video/CMカット済/ \
  --failed_to /var/www/epgrec/video/CMカット失敗

ためしに58分2秒のニュース番組を処理した所、CM全カットで45分19秒まで短縮されました。CMが13分弱も入ってたんですね。容量ベースでは1録画あたり約900MBの節約です。当バッチファイルは作りを簡単にするためにH.264エンコードまでは実施しません。必要なら本バッチを実行した後に一気にH.264エンコードする処理に繋げるなどしてください。

このバッチは、無料放送(CMが入る)と、有料放送(CMは入らないけど、最後に番組の宣伝が数分入る)の何れに対してもざっくりと宣伝部分をそぎ落とせるように作りました。

目的 設定ファイル 処理内容
デフォルト ComskipBatch.rbがあるディレクトリ/comskip/comskip.ini デフォルト値を利用して、CMカット処理を行う。
CMカット CMカット対象のTSがあるディレクトリ/comskip.ini  そのディレクトリ内のcomskip.iniを利用してCMカット処理を行う。デフォルトのcomskip.iniで誤検出されてしまう場合等に利用する。
有料放送向け CMカット対象のTSがあるディレクトリ/minus.txt comskipによるCM検出を行わず、決め打ちで番組最後からminus.txtに記載した秒数分を除外する。AT-X等の有料放送向け。録画が30分で、25分が本編。その後の5分が放送局内のCMと言うケースでは、300と書いたminus.txtを置いておけば良い。

ComskipBatch.rbの引数

引数 指定例 説明
–file /var/www/epgrec/video/録画.ts CMカット対象のTSファイルへのフルパス
–margin 3 録画が開始されるまでのマージン(秒)。3秒や10秒が多いはず。comskipでこのマージンの秒数以下の本編の冒頭部を見つけた場合、それを削除する。
–minus 300 minus.txtを設置している場合と同じ動作になる。対象ファイルの後ろ数分に必ずCMが入ることがわかっているファイルを指定する場合に合わせて指定する。
–move_to /var/www/epgrec/CMカット済 本バッチファイルで処理済みのファイルを送る先。1つのファイルに対して何度も実行する事を防止する目的で、処理済みのファイルを退避させるために利用。この場合、CMカット済ディレクトリに送った後に、他のPCから一括してffpmegによるH.264エンコードする等の連携で利用している。
–failed_to /var/CMカット失敗 本バッチファイルでCMカットで失敗したファイルを送る先。ファイルサイズが下記の–cut_rateよりも小さくなった場合に、このオプション指定先にファイルが送られます。
–cut_rate 70 (カット後のファイル容量÷カット前のファイル容量) × 100の結果と比較しています。70を指定すると、70パーセント以上ファイルサイズが小さくなってしまった場合にはカット失敗とみなします。30分番組だと、CMは5分(17%ぐらい)は入っているので、未指定の場合には70としています。

ファイルサイズの圧縮率について

TOKYO MXの一般的な30分番組にCMカット、H.264圧縮した結果

ファイル 時間 ファイルサイズ コメント
CMカットのみ 00:30:02 ⇒ 00:23:59 1771MB ⇒ 1432MB 番組終了後のCMが30秒ほど余計に入ってしまいましたが、特に問題なくCMカット可能だった。
H.264高画質圧縮 00:30:02 ⇒ 00:23:59 1771MB ⇒ 191MB 最新のffmpegでの圧縮率が圧倒的。画像劣化が殆ど無いにも関わらずこの圧縮率は凄い。

comskipはwindows版と、くず鉄さんがUNIX上で使えるようにしたUNIX版があるようですが、foltiaの作者の宗子さんの投稿にあるwine上で動かす方式をとりました。Windowsメインの方はらんだむけんきゅうじょさんのAutoConvertを検討するのも良いと思います。本バッチは追ってWindows上での実行に対応予定です。

非常に短い番組(数分番組)の場合にはCM検出が上手くいかない場合があるが、一般的な20分以上の番組は大丈夫な模様。大方の番組は30分枠~数時間枠なので問題ないと思います。有料放送の番組内にある同放送局が流す他の番組の宣伝はカットできない可能性大(実際失敗しているため、–minus 300指定等で対応できれば、そちらで対処)。また、ディズニーチャネルのような番組ロゴが番組開始後数秒後に遅れて表示されるような番組も苦手です。

セットアップ方法

windows、ubuntuについてセットアップ方法をまとめます。

Windowsの場合のセットアップ方法(Linux版と同様の使い方です。Linux版を優先してテストしたため、対応したら更新します。)

下記の手順でインストールを実施します。

  1. powershellが使える事を確認(windows vista / 7 / 8 / 8.1 / 2008 / 2012は使えると思います。ちなみにテスト環境はWindows7です。)
  2. rubyをインストール(RubyInstaller からDLして、普通にインストールしてください)
  3. ディレクトリの用意『comskip_batch』フォルダを作成し、その下に、comskip、ffmpegフォルダを作成してください。
  4. ffmpegのインストール(DLして解凍するだけ)
  5. comskipのインストール(DLして解凍するだけ)
./comskip_batch/ コメント
|- comskip comskip.dictionary
comskip.exe
comskip.ini
comskip.txt
comskip81_063.zip
comskipGUI.exe
debugwindow.html
HideRun.exe
manual.html
PostProcessing.bat
readme.txt
tuning.html
comskip以下にこちらからダウンロードしたファイルを格納する。※comskip81_***.zip を解凍して、comskip.iniはチューニング済みのファイルで上書きする。
|- ffmpeg bin
doc
licenses
presets
ff-prompt.bat
README.txt
ffmpeg以下にffmpeg関係のファイルを格納する。ビルド済みのffmpegをダウンロードして展開するだけ。
|- ComskipBatch.rb ComskipBatch.rbをダウンロードして配置してください。同ファイル内の『変数定義周り』と言うコメントのMARGIN=3とある所を修正します。録画マージンが5秒ならMARGIN=5としてください。

Ubuntuの場合のセットアップ方法

まずは、windowsのexeファイルをLinux上で実行させるために、wineと、TSファイルの全長を取得する為に、libav-toolsをインストールしておきます。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install wine libav-tools

次にffmpegをインストールします(インストール方法はこちらを参照)。

最後にcomskipをダウンロード。下記のwget先のリンクが変更になっていた場合にはこちらからリンク先を確認して下さい。

sudo mkdir -p /opt/comskip_batch/comskip
cd /opt/comskip_batch/comskip

# comskipをダウンロードする
sudo wget http://www.kaashoek.com/files/comskip81_063.zip

# zipファイルを展開する
unzip comskip81_063.zip

# comskip_batchをダウンロードして、展開する
# ダウンロードリンクは下記の『ComskipBatch.rbのダウンロード』より。
# ダウンロードしたファイルを下記に配置する。comskip.iniはダウンロードしたファイルで上書き修正する。
/opt/comskip_batch/ComskipBatch.rb
/opt/comskip_batch/comskip/comskip.ini

ComskipBatch.rbのダウンロード

下記のダウンロード条件に同意した上でComskipBatch.rbをダウンロードする

ダウンロード条件

  • このファイルの利用は全て自己責任とさせて頂きます。
  • ファイルのダウンロードは個人に限らせて頂きます。法人その他の団体のご利用及びダウンロードは出来ません。
  • 趣味の範囲でのご利用に限り使用いただけます。
  • アップロードファイルに何かしらの問題がある場合には問い合わせフォームよりご連絡ください。適切な対応を取らせて頂きます。

運用ノウハウ

  • 当然の事ながら、エンコード対象ディレクトリのパーミッションが間違っていると、処理に失敗する。処理失敗した場合には、まずはパーミッションを見直してください。
  • ネットワーク越しのマウント先に対して処理を行う場合にもパーミッションに注意。nfsの場合にはパーミッションが合っていれば問題ないはず。sambaマウントは上手くいかないかもしれません。
  • CMの検出精度の調整は、comskip.iniで設定可能。
  • ボトルネックになるのはCPUとDISK IO。CPUは1コアしか使わないのでコア数よりもクロック数が高い方が有利。

FAQ

  • 画質劣化は?>TSを切り貼りするだけなのでありません。ただし、本体とCMとをミリ秒単位で切り取ってしまうために再生ソフトによっては最初の一瞬が飛んだように見えるかもしれません。また、CMで一息付いていた時間が無くなります。
  • 処理時間は?>Core i5 3470で30分番組で5分程度。CMが多い1時間物のニュース番組で20分程です。処理中のCPU使用率は25%程度(1コアしか使っていない)
  • H.264エンコード処理につなげたいんだけど?>本バッチにファイル名を渡して処理した後にお好きな方式でバッチエンコードしてください。当方は『【Windows】無料ソフトウェアで手っ取り早くpt2/pt3で作成したTSをH.264エンコードする』と同様のやり方でスペックの低い録画PCではなく、高スペックな普段使いのWindowsPCでエンコードしています。
  • ○○の処理を含めてほしいんだけど?>コメント欄からどうぞ。
  • バグを見つけた。>すいませんがコメント欄から教えてください。パッチを送ってくれるとなおうれしいです。
  • ○○の放送局、もしくは番組を処理した結果の成功報告、失敗報告を挙げたいんだけど>コメント欄からお願いします。『適用可否』に反映させてもらいます。
  • comskip.iniを微調整して、チャネル毎にチューニングしたけどいる?>可能ならチューニング結果を教えてもらえると嬉しいです。
  • CMカットに失敗したんだけど、元ファイルは?>○○○.ts.bakとして元ファイルを同ディレクトリに移動しています。ファイル名を変更すれば元ファイルが戻ってきます。

今後やりたい事

  • epgrecの録画後に『ComskipBatch.rb』が実行されるようにしたい(無条件に実行するだけなら『do-record.sh』の最後に追記するだけで良いので簡単に対応できるが、ウェブ上からCMカットの有無を選択できると嬉しい。作者さんが対応して下さるとうれしい限り)。
  • comskip.iniのチューニング

当サイト配布のcomskip.iniでのCMカット成功率(情報募集中)

同じ放送局でも、番組Aは必ず成功するが、番組Bはあまり成功しない等の問題があります。上手くいかない場合には番組毎にcomskip.iniをいじったりする必要があります。

タイプ channel 放送局 成功率 コメント
GR GR20_23608 TOKYO MX1 80%  3編に分かれる番組は厳しいかも。前後半の一般的な構成なら高確率で成功する。
GR GR20_23609 TOKYO MX2
GR GR21_1056 フジテレビ
GR GR22_1048 TBS1
GR GR22_1049 TBS2
GR GR23_1072 テレビ東京1  80%  結構相性が良い。
GR GR23_1073 テレビ東京2
GR GR23_1074 テレビ東京3
GR GR24_1064 テレビ朝日
GR GR25_1040 日テレ1
GR GR25_1041 日テレ2
GR GR26_1032 NHKEテレ1東京  CMが存在しない。処理対象外。
GR GR26_1033 NHKEテレ2東京  CMが存在しない。処理対象外。
GR GR26_1034 NHKEテレ3東京  CMが存在しない。処理対象外。
GR GR27_1024 NHK総合1・東京  CMが存在しない。処理対象外。
GR GR27_1025 NHK総合2・東京  CMが存在しない。処理対象外。
BS BS_101 NHKBS1  CMが存在しない。処理対象外。
BS BS_103 NHKBSプレミアム  CMが存在しない。処理対象外。
BS BS_141 BS日テレ
BS BS_151 BS朝日1
BS BS_161 BS-TBS
BS BS_171 BSジャパン
BS BS_181 BSフジ・181
BS BS_191 WOWOWプライム 有料放送なので、終わりから○秒削除すれば良いはず。–minusオプションで対応可能と思われる。
BS BS_192 WOWOWライブ 有料放送なので、終わりから○秒削除すれば良いはず。–minusオプションで対応可能と思われる。
BS BS_193 WOWOWシネマ 有料放送なので、終わりから○秒削除すれば良いはず。–minusオプションで対応可能と思われる。
BS BS_200 スターチャンネル1 有料放送なので、終わりから○秒削除すれば良いはず。–minusオプションで対応可能と思われる。
BS BS_201 スターチャンネル2 有料放送なので、終わりから○秒削除すれば良いはず。–minusオプションで対応可能と思われる。
BS BS_202 スターチャンネル3 有料放送なので、終わりから○秒削除すれば良いはず。–minusオプションで対応可能と思われる。
BS BS_211 BS11  90% 成功率高め。BSと地デジで選択肢があるならBS11がお勧め。
BS BS_222 TwellV
BS BS_231 放送大学BS1
BS BS_232 放送大学BS2
BS BS_233 放送大学BS3
BS BS_234 グリーンチャンネル
BS BS_236 BSアニマックス 未テスト
BS BS_238 FOXスポーツエンタ
BS BS_241 BSスカパー!
BS BS_242 J SPORTS 1
BS BS_243 J SPORTS 2
BS BS_244 J SPORTS 3
BS BS_245 J SPORTS 4
BS BS_251 BS釣りビジョン
BS BS_252 イマジカBS・映画
BS BS_255 BS日本映画専門ch
BS BS_256 ディズニーチャンネル × ロゴが入るタイミングが悪い。
BS BS_258 ディーライフ
BS BS_531 放送大学ラジオ
BS BS_910 WNI・910
CS CS_161 QVC
CS CS_218 東映チャンネル
CS CS_219 衛星劇場
CS CS_223 チャンネルNECO
CS CS_227 ザ・シネマ
CS CS_229 FOXムービー
CS CS_240 ムービープラスHD
CS CS_250 sky・Aスポーツ+
CS CS_254 GAORA
CS CS_257 日テレG+ HD
CS CS_262 ゴルフネットHD
CS CS_290 SKY STAGE
CS CS_292 時代劇専門chHD
CS CS_293 ファミリー劇場HD
CS CS_294 ホームドラマCH
CS CS_296 TBSチャンネル1
CS CS_297 TBSチャンネル2
CS CS_298 テレ朝チャンネル1
CS CS_299 テレ朝チャンネル2
CS CS_300 日テレプラス
CS CS_305 銀河◆歴ドラ・サスペ
CS CS_307 フジテレビONE
CS CS_308 フジテレビTWO
CS CS_309 フジテレビNEXT
CS CS_310 スーパー!ドラマHD
CS CS_311 AXN 海外ドラマ
CS CS_312 FOX
CS CS_314 女性ch/LaLa
CS CS_321 スペシャプラス
CS CS_322 スペースシャワーTV
CS CS_323 MTV HD
CS CS_325 エムオン!HD
CS CS_326 ミュージック・エア
CS CS_329 歌謡ポップス
CS CS_330 キッズステーション
CS CS_331 カートゥーン
CS CS_333 AT−X  ×  チューニングしてもだめかも。
CS CS_339 ディズニージュニア
CS CS_340 ディスカバリー
CS CS_341 アニマルプラネット
CS CS_342 ヒストリーチャンネル
CS CS_343 ナショジオチャンネル
CS CS_349 日テレNEWS24
CS CS_351 TBSニュースバード
CS CS_353 BBCワールド
CS CS_354 CNNj
CS CS_362 旅チャンネル
CS CS_363 囲碁・将棋チャンネル
CS CS_55 ショップチャンネル
CS CS_800 スカチャン0
CS CS_801 スカチャン1
CS CS_802 スカチャン2
CS CS_805 スカチャン3

参考にさせてもらった情報は下記のサイトです。

タグ付けされた , , . ブックマークする へのパーマリンク.

36 Responses to cmカットスクリプト『ComskipBatch.rb』の紹介(Linux / Windows両対応)

  1. tiger 曰く:

    こんにちは、初めまして。

    TSのCMカットで、検索してこちらにたどり着きました。
    素人質問になりますが、
    1.ComskipBatch.rbは、どこからダウンロードすれば、宜しいでしょうか。
    2.使い方としては、実行例のbatファイルを作って、実行でしょうか?
    お手数お掛け致しますが、教えて頂けると幸いです。
    宜しくお願い致します。

    • lasas 曰く:

      ご指摘ありがとうございます。
      プラグインの更新に伴い、リンクが表示されないようになっていました。

      >1.ComskipBatch.rbは、どこからダウンロードすれば、宜しいでしょうか。
      こちら、ダウンロードマネージャのパッケージ更新に伴って設定が初期化され、ダウンロードリンクが無くなっていました。
      パッケージをダウングレードしましたので、ご確認ください。

      >2.使い方としては、実行例のbatファイルを作って、実行でしょうか?
      その通りです。
      念の為、テスト用のファイルを用意して、何度か試した後に利用開始してください。

      • tiger 曰く:

        ご対応、ありがとうございます。
        無事、ダウンロードできました、早速試して見ます(^^)

        ps。
        もし、不明点でてきましたら、また質問させていただくかもですが、
        その際には、また宜しくお願い致しますm(_ _)m

  2. tiger 曰く:

    こんにちは、先日は、対応ありがとうございました。

    質問が、あります。下記、環境で試しているのですが、
    errorとなってしまいます。何か、batファイルの書き方であるとか、
    設定であるとか、不備があれば、教えて頂けると助かります。
    [環境]
    OS:windows7Pro(64bit)
    1.rubyをインストール(Ruby 2.1.5-p273-x64)
    2.ディレクトリの用意『 g:\comskip_batch』フォルダを作成し、その下に、comskip、ffmpegフォルダを作成
    3.ffmpegのインストール(FFmpeg version: 2014-11-27 git-9f9440b)
    4.comskipのインストール(comskip81_069.zipを解凍)
    5.CMのあるtest.tsファイルをg:\comskip_batchフォルダに、準備
    6.batファイル作成
    ruby G:\comskip_batch\ComskipBatch.rb –margin 1 –file test.ts –move_to G:
    7.batファイル実行 下記、エラーとなります。
     {“file”=>”test.ts”, “margin”=>”1”, “minus”=>nil, “move_to”=>”G:”}
    #
    “ERROR ./test.vdr \u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002comskip\u306E\u5B9F\u884C\u306B\u5931\u6557\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002”
    —————————————————————
    test.tsの前に、ディレクトリを追加して実行
    ruby G:\comskip_batch\ComskipBatch.rb –margin 1 –file G:\comskip_batch\test.ts –move_to G:
    やはり、下記エラー
    {“file”=>”G:\\comskip_batch\\test.ts”, “margin”=>”1”, “minus”=>nil, “move_to”=>”G:”}
    #
    “ERROR G:\\comskip_batch/test.vdr \u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002comskip\u306E\u5B9F\u884C\u306B\u5931\u6557\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002”

    ComskipBatch.rbの 実行ディレクトリを、ベタがきにしても、
    変わらず。# windowsであるかどうかのフラグとか、関係ありますでしょうか?素人質問かもですが、教えて頂けると幸いです。
    長文になり、申し訳ありません。宜しくお願い致します。
     

    • lasas 曰く:

      的確な内容でバグ報告をあげてくださったので概要の把握が楽で助かります。

      環境的にはあっていそうですが、テストは基本的にLinux+Wine上で行っていた為、文字コードの差異(UTF8とSHIFT-JIS)のような感があります。
      土日辺りに確認してみますね。

      もし、お急ぎのようでしたら、Vmware上にUbuntu Linux環境を作れば動くと思われます。

      お手数をおかけしますが、以上、よろしくお願いします。

  3. tiger 曰く:

    こんにちは

    気になっているのが、
    ディレクトリを追加すると、
    G:\\comskip_batch\\のように、入れていないのに。
    \\が二つになってしまうんです。

    お手数お掛け致しますが、対応方法が分かりましたら、大変助かります。
    宜しくお願い致します。

    • lasas 曰く:

      ご返答が遅れてしまい申し訳ありません。

      \\が2つになってしまう件は、そうなっていないと特殊文字がエスケープされないので、そう言うものとして考えるしかないと思います。

      本バッチを見直してみたところ、コメント出力する部分でWindows-31JとUTF-8の文字列をくっ付けている個所がNGでしたので、その点を修正しました。再DLをお願いします。

      また、PowerShell上で実行し、テスト用のTSファイルのCM検出とCMカットが出来る所までは確認しました。

  4. tiger 曰く:

    こんにちは、ご対応ありがとうございます。

    早速ダウンロードして試してみます(^^)

  5. tiger 曰く:

    こんにちは、
     新しいComskipBatch.rbをダウンロードして、同じ環境で、テストしています。
    comskipは、動作し、test.tsから、test.vdrも作られるのですが、
    下記エラーで止まってしまいます。

    G:\comskip_batch\ComskipBatch.rb:116:in ‘match’:invalid byte sequence in UTF-8(ArgumentError)
    from G:\comskip_batch\ComskipBatch.rb:116: in”

    —————————————————————-
    いくつかの番組をテストしてみましたが、同じ結果でした。
    お手数お掛け致しますが、原因が分かりますでしょうか?
    宜しくお願い致します。m(_ _)m
     

    • lasas 曰く:

      116行目だと、下記の箇所でしょうか?

      tmp = Encoding.default_external
      Encoding.default_external = ‘utf-8’
      allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match(`#{FFMPEG} -i “#{file}” 2>&1`).to_a[1]
      Encoding.default_external = tmp

      ここは、windows上で実行すると文字コードでエラーが出ていたので、仕方なくこのような処理にしたところです。
      やっている事は、TSファイルの再生時間を求めています。例えば、00:30:02.92等の値が返ってくることを想定しています。
      # バッドノウハウですが、取りあえずのテスト目的であれば、上記をのコードをコメントアウトして、allTime=”00:30:02.92″等とダイレクトに指定すると、取りあえず前に進めるかもしれません。

      ffmpegの方も、念のために、
      G:\comskip_batch\ffmpeg\bin\ffmpeg -i test.ts
      等として、ffmpegのiオプションが利用可能かどうかをまずは試してください。

      後、match関数でエラーが出ているようなので、rubyのバージョンとOS名(windows7、windows8.1等)を教えてもらえると助かります。
      ruby -v
      でバージョンが表示されると思いますので。

      >コメントに括弧は、使えないんですね?
      一部の文字列はサニタイジングされて削除されてしまうかもしれません。
      エラーコードなどを貼り付ける際には、特に制限に引っかかり易いかもしれません。

  6. tiger 曰く:

    こんにちは、早速のお返事ありがとうございます。

    1.G:\comskip_batch\ffmpeg\bin\ffmpeg -i test.tsのテスト
      ffmpegが、それなりに、動きました。
    2.ruby,windowsのバージョン
      ruby 2.1.5p273 (2014-11-13 revision 48405) [x64-mingw32]
      OS:windows7 Pro 64bit
    3.アドバイスのallTimeに、test.vdrの最後の時間を書いて、
      実行したところ、最後まで、実行されて、出力フォルダーに
      CMカットされた、test.tsができました。
      再生もOKでした。 感激です。!!

    アドバイスのように、、手動で、書き換えれば、OKなことが
    分かりました。
    ただ、もし、ここのところが、上手くプログラムで、入力されると
    最高です。お時間あるときに、ご検討いただけると、幸いです。
    以上、宜しくお願い致します。

    • lasas 曰く:

      無事にカットできましたか!!

      最近多忙なので週末あたりでしたら時間が取れるかと思います。
      手動で書き換えるのは、この手のスクリプトとしては有りえないので、改善するようにします。

    • lasas 曰く:

      ご指摘の件、Rubyのバージョンを2.1系列にして試してみました。

      結論から言うと、windows7(x64)、ruby 2.1.5p273でご指摘の問題はおこりませんでしたが、提示して頂いたエラー内容からぐぐって、解決策となりそうなコードを書き換えて、私のPCで試し、PowerShell(64bit)と、コマンドプロンプトの両方から正常終了する事を試しました。
      (修正が的を得ているか不明なので、アップロードファイルはまだ昔のままです)

      その際に、修正したコードは下記のとおりです(Ruby 2.1以上で動かしてください)。

      ■ 修正前
      if IS_WINDWS
      tmp = Encoding.default_external
      Encoding.default_external = ‘utf-8’
      allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match(`#{FFMPEG} -i “#{file}” 2>&1`).to_a[1]
      Encoding.default_external = tmp
      else

      ■ 修正後
      # TSの終了時間を割り出す
      allTime = ”;
      if IS_WINDWS
      allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match((`#{FFMPEG} -i “#{file}” 2>&1`).scrub(”)).to_a[1]
      else

  7. tiger 曰く:

    こんにちは
     対応ありがとうございます。
    下記のように修正して、テストしてみました。(修正前を
    コメントアウトしただけですが)
    # TSの終了時間を割り出す
    allTime = ”;
    if IS_WINDWS
    allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match((`#{FFMPEG} -i “#{file}” 2>&1`).scrub(”)).to_a[1]
    else

    # # TSの終了時間を割り出す
    # allTime = ”;
    # if IS_WINDWS
    # tmp = Encoding.default_external
    # Encoding.default_external = ‘utf-8’
    # allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match(`#{FFMPEG} -i “#{file}” 2>&1`).to_a[1]
    # Encoding.default_external = tmp
    # else

    結果、
    エラーが変わりました。一応、2番組で試しましたが、同じエラーでした。
    G:\comskip_batch\ComskipBatch.rb:111:in :undefined local variable or method 窶・ for main:Object(NameError)
    113行は、「allTime = ”;」の行です。
    また前回と同じように、test.vdrの最後の時間を直接書いて
    実行したところ、CMカットされた、test.tsが正常に作られました。

    私的には、現状でも、十分OKなのですが、
    何か、テスト的なことがあれば、何でもしますし、
    画面共有とかで、見て頂くことも、OKですので、
    もし何かあれば、教えて下さい。
    宜しくお願い致します。

    • lasas 曰く:

      長丁場のやり取りになってしまっているにも関わらず、ご対応いただき、恐縮です。

      >エラーが変わりました。一応、2番組で試しましたが、同じエラーでした。
      ffmpeg による戻り値が想定外で、その結果から取得している文字列が空となってしまった為、”文字列”.scrub(”)としている個所でエラーが出ているように見えました。
      もう一度、ffmpeg -i test.tsの結果を確認させて下さい。

      ・・・と言っても、わけもわからず確認するのもつまらないと思いますので、理由を下記に説明します。

      allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match((`#{FFMPEG} -i “#{file}” 2>&1`).scrub(”)).to_a[1]

      上記の処理は、正規表現で、ffmpeg -i “ファイル名”の結果に含まれる”Duration: 00:30:03.06”と言う箇所を対象として、00:30:03.06の部分を抜き取る処理をしています。
      ここで、該当する文字列が無ければ仰るようなエラーになってしまうと思います。

      ご参考までに、ffmpeg -f test.tsを実行した結果を下記に載せておきます。
      下から8行目辺りの”Duration: 00:30:03.06, start: 4523.011533, bitrate: 7515 kb/s”の箇所が狙っている場所です。ここから実時間を正規表現で取得しています。
      (ちなみに、使用しているffmpegは http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20141221-git-6706a29-win64-static.7z です。)

      ———————————————-
      D:\comskip_batch\ffmpeg\bin\ffmpeg.exe -i D:\comskip_batch\test.ts
      ffmpeg version N-68639-g6706a29 Copyright (c) 2000-2014 the FFmpeg developers
      built on Dec 20 2014 22:12:53 with gcc 4.9.2 (GCC)
      configuration: –enable-gpl –enable-version3 –disable-w32threads –enable-avisynth –enable-bzlib –enable-fontconfi
      g –enable-frei0r –enable-gnutls –enable-iconv –enable-libass –enable-libbluray –enable-libbs2b –enable-libcaca —
      enable-libfreetype –enable-libgme –enable-libgsm –enable-libilbc –enable-libmodplug –enable-libmp3lame –enable-lib
      opencore-amrnb –enable-libopencore-amrwb –enable-libopenjpeg –enable-libopus –enable-librtmp –enable-libschroedinge
      r –enable-libsoxr –enable-libspeex –enable-libtheora –enable-libtwolame –enable-libvidstab –enable-libvo-aacenc —
      enable-libvo-amrwbenc –enable-libvorbis –enable-libvpx –enable-libwavpack –enable-libwebp –enable-libx264 –enable-
      libx265 –enable-libxavs –enable-libxvid –enable-decklink –enable-zlib
      libavutil 54. 15.100 / 54. 15.100
      libavcodec 56. 16.100 / 56. 16.100
      libavformat 56. 16.101 / 56. 16.101
      libavdevice 56. 3.100 / 56. 3.100
      libavfilter 5. 4.100 / 5. 4.100
      libswscale 3. 1.101 / 3. 1.101
      libswresample 1. 1.100 / 1. 1.100
      libpostproc 53. 3.100 / 53. 3.100
      [mpeg2video @ 0000000000302620] Invalid frame dimensions 0x0.
      Last message repeated 10 times
      [mpegts @ 00000000003164c0] PES packet size mismatch
      Last message repeated 6 times
      [mpegts @ 00000000003164c0] Could not find codec parameters for stream 2 (Unknown: none ([6][0][0][0] / 0x0006)): unknow
      n codec
      Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
      [mpegts @ 00000000003164c0] Could not find codec parameters for stream 3 (Unknown: none ([13][0][0][0] / 0x000D)): unkno
      wn codec
      Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
      Input #0, mpegts, from ‘D:\comskip_batch\test.ts’:
      Duration: 00:30:03.06, start: 4523.011533, bitrate: 7515 kb/s
      Program 333
      Stream #0:0[0x1003]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709), 720×480 [SAR 32:27 DAR 16
      :9], max. 2000 kb/s, 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc
      Stream #0:1[0x1043]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 255 kb/s
      Stream #0:2[0x1c01]: Unknown: none ([6][0][0][0] / 0x0006)
      Stream #0:3[0x1e03]: Unknown: none ([13][0][0][0] / 0x000D)
      At least one output file must be specified
      ———————————————-

      >また前回と同じように、test.vdrの最後の時間を直接書いて
      >実行したところ、CMカットされた、test.tsが正常に作られました。
      *.vdrファイルはCMの入っている個所が記載されているので、
      録画時にマージンで数秒余計に撮っている場合には、TSファイルの最後が上手い事CMになっている事が多いです。
      その場合、*.vdrの最後の行の秒数を入れてあげれば、結果オーライになる可能性が高いです。

      上記より、かなり乱暴ですが、*.vdrファイルから読み込んだ最後の値をallTimeに詰めるようにして、
      allTime = a.last
      とでもしておけば、『test.vdrの最後の時間を直接書いて』の箇所が自動化されると思われます。

      これもバッドノウハウですね(汗

  8. tiger 曰く:

    いろいろご対応ありがとうございます。

    うちのffmpeg -i test.tsの結果です。
    Duration: 00:29:30.54, start: 46349.948711, bitrate: 16316 kb/s
    でした。
    素人で、良く分からないのですが、allTimeを画面とファイルに
    プリントとかは、できますか?
    宜しくお願い致します。
    —————————————————————-

    G:\comskip_batch>G:\comskip_batch\ffmpeg\bin\ffmpeg -i G:\comskip_batch\test.ts

    ffmpeg version N-68044-g9f9440b Copyright (c) 2000-2014 the FFmpeg developers
    built on Nov 27 2014 03:13:44 with gcc 4.9.2 (GCC)
    configuration: –enable-gpl –enable-version3 –disable-w32threads –enable-av
    isynth –enable-bzlib –enable-fontconfig –enable-frei0r –enable-gnutls –enab
    le-iconv –enable-libass –enable-libbluray –enable-libbs2b –enable-libcaca —
    enable-libfreetype –enable-libgme –enable-libgsm –enable-libilbc –enable-lib
    modplug –enable-libmp3lame –enable-libopencore-amrnb –enable-libopencore-amrw
    b –enable-libopenjpeg –enable-libopus –enable-librtmp –enable-libschroedinge
    r –enable-libsoxr –enable-libspeex –enable-libtheora –enable-libtwolame –en
    able-libvidstab –enable-libvo-aacenc –enable-libvo-amrwbenc –enable-libvorbis
    –enable-libvpx –enable-libwavpack –enable-libwebp –enable-libx264 –enable-
    libx265 –enable-libxavs –enable-libxvid –enable-decklink –enable-zlib
    libavutil 54. 15.100 / 54. 15.100
    libavcodec 56. 13.100 / 56. 13.100
    libavformat 56. 15.100 / 56. 15.100
    libavdevice 56. 3.100 / 56. 3.100
    libavfilter 5. 2.103 / 5. 2.103
    libswscale 3. 1.101 / 3. 1.101
    libswresample 1. 1.100 / 1. 1.100
    libpostproc 53. 3.100 / 53. 3.100
    [mpeg2video @ 0000000002c34c60] Invalid frame dimensions 0x0.
    Last message repeated 10 times
    [mpegts @ 0000000002c44880] PES packet size mismatch
    Last message repeated 1 times
    [mpegts @ 0000000002c44880] probed stream 2 failed
    [mpegts @ 0000000002c44880] PES packet size mismatch
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 2 (Unknow
    n: none ([6][0][0][0] / 0x0006)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 3 (Unknow
    n: none ([6][0][0][0] / 0x0006)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 4 (Unknow
    n: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 5 (Unknow
    n: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 6 (Unknow
    n: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 7 (Unknow
    n: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 8 (Unknow
    n: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 9 (Unknow
    n: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 10 (Unkno
    wn: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 11 (Unkno
    wn: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    [mpegts @ 0000000002c44880] Could not find codec parameters for stream 12 (Unkno
    wn: none ([13][0][0][0] / 0x000D)): unknown codec
    Consider increasing the value for the ‘analyzeduration’ and ‘probesize’ options
    Input #0, mpegts, from ‘G:\comskip_batch\test.ts’:
    Duration: 00:29:30.54, start: 46349.948711, bitrate: 16316 kb/s
    Program 1048
    Metadata:
    service_name : ?TBS1
    service_provider:
    Stream #0:0[0x111]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420
    p(tv, bt709), 1440×1080 [SAR 4:3 DAR 16:9], max. 20000 kb/s, 29.97 fps, 29.97 tb
    r, 90k tbn, 59.94 tbc
    Stream #0:1[0x112]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, ster
    eo, fltp, 188 kb/s
    Stream #0:2[0x114]: Unknown: none ([6][0][0][0] / 0x0006)
    Stream #0:3[0x115]: Unknown: none ([6][0][0][0] / 0x0006)
    Stream #0:4[0x840]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:5[0x850]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:6[0x857]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:7[0x858]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:8[0x859]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:9[0x860]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:10[0x85e]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:11[0x85f]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:12[0x86e]: Unknown: none ([13][0][0][0] / 0x000D)
    Program 1049
    Metadata:
    service_name : ?TBS2
    service_provider:
    Program 1183
    Metadata:
    service_name : ?G?|ャ、ノ
    service_provider:
    Program 1432
    Metadata:
    service_name : ?TBS
    service_provider:
    At least one output file must be specified

    • lasas 曰く:

      >素人で、良く分からないのですが、allTimeを画面とファイルに
      >プリントとかは、できますか?
      下記のような感じでどうでしょうか?

      ffmpeg_return = `#{FFMPEG} -i “#{file}” 2>&1`
      p ‘——————— ffmpeg_return ———————‘
      p ffmpeg_return
      p ‘——————— scrub ———————‘
      scrb = ffmpeg_return.scrub(”)
      p scrb
      p ‘——————— allTime_array ———————‘
      allTime_array = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match(scrb)
      p allTime_array
      allTime = allTime_array.to_a[1]
      p ‘——————— allTime ———————‘
      p allTime

      rubyはp の後に変数、ないしは文字列を置く事で画面出力可能ですので、allTime = の箇所を上記に書き換えてみれば、どこまで想定通りの値が来ているかがわかるかと。

  9. tiger 曰く:

    こんにちは、アドバイスありがとうございます。

    置き換えて試して見ました。
    結果、scrb = ffmpeg_return.scrub(”)のところで、
    止まってしまいました。
    いろいろお手数お掛け致します。
    単純に、allTimeの内容、見られればと思いましたが、
    一筋縄で、いかないですね。
    「エラー状態」
    G:/comskip_batch/ComskipBatch.rb:118:in `’: undefined local variable or method `窶・ for main:Object (NameError)

    —————————————————————-
    「実行結果」
    G:\comskip_batch>ruby G:\comskip_batch\ComskipBatch.rb –margin 0 –file G:\coms
    kip_batch\test.ts –move_to G:\comskip_batch\output\
    {“file”=>”G:\\comskip_batch\\test.ts”, “margin”=>”0”, “minus”=>nil, “move_to”=>”
    G:\\comskip_batch\\output\\”}
    #
    “ffmpeg version N-68639-g6706a29 Copyright (c) 2000-2014 the FFmpeg developers\n
    built on Dec 20 2014 22:12:53 with gcc 4.9.2 (GCC)\n configuration: –enable-
    gpl –enable-version3 –disable-w32threads –enable-avisynth –enable-bzlib –en
    able-fontconfig –enable-frei0r –enable-gnutls –enable-iconv –enable-libass –
    -enable-libbluray –enable-libbs2b –enable-libcaca –enable-libfreetype –enabl
    e-libgme –enable-libgsm –enable-libilbc –enable-libmodplug –enable-libmp3lam
    e –enable-libopencore-amrnb –enable-libopencore-amrwb –enable-libopenjpeg –e
    nable-libopus –enable-librtmp –enable-libschroedinger –enable-libsoxr –enabl
    e-libspeex –enable-libtheora –enable-libtwolame –enable-libvidstab –enable-l
    ibvo-aacenc –enable-libvo-amrwbenc –enable-libvorbis –enable-libvpx –enable-
    libwavpack –enable-libwebp –enable-libx264 –enable-libx265 –enable-libxavs –
    -enable-libxvid –enable-decklink –enable-zlib\n libavutil 54. 15.100 / 5
    4. 15.100\n libavcodec 56. 16.100 / 56. 16.100\n libavformat 56. 16.101
    / 56. 16.101\n libavdevice 56. 3.100 / 56. 3.100\n libavfilter 5. 4
    .100 / 5. 4.100\n libswscale 3. 1.101 / 3. 1.101\n libswresample 1
    . 1.100 / 1. 1.100\n libpostproc 53. 3.100 / 53. 3.100\n窶廨:\\comskip_
    batch\\test.ts窶\x9D: Invalid argument\n”
    G:/comskip_batch/ComskipBatch.rb:118:in `’: undefined local variable or me
    thod `窶・ for main:Object (NameError)

    • lasas 曰く:

      ご連絡が遅れて申し訳ありません。
      回答が遅れてしまいそうでしたので、まずは一次回答をさせていただきます。

      >結果、scrb = ffmpeg_return.scrub(”)のところで、
      >止まってしまいました。

      ffmpeg_returnの中身に何も入っていないようですね。

      実行結果としては、下記のような内容を想定していましたが、
      ご返答の内容で止まってしまったと言う事は、ffmpeg_returnの中身が無かったみたいですね。

      ‘——————— ffmpeg_return ———————’
      ffmpeg_returnの中身を表示 << この中身をセットできていないから、後続処理が上手くいっていなかった ‘——————— scrub ———————’ scrbの中身を表示 ‘——————— allTime_array ———————’ allTime_arrayの中身を表示 ‘——————— allTime ———————’ allTimeの中身を表示 当方の環境で再現しないのがもどかしい限りですが、 週末にもう少し中身を見てみますね。

  10. tiger 曰く:

    こんにちは

    いろいろご対応ありがとうございます。
    お時間あるときにで、良いので、
    見て頂ければ嬉しいです。

    でも、うちだけの環境かも知れませんね。

    • woodrof 曰く:

      tigerさん

      lasasさんが修正案として挙げられた scrub関数を挟む方法にて、もしかしてチョットした書き間違いがあるのでは無いでしょうか。

      scrub(”)) → scrub(”))

      ダブルクォーテーションではなく、シングルクォーテーション2個?

  11. massa 曰く:

    並列化可能にしてみました.ComskipBatch.rbは
    tmp1.ts,,,とファイルを作成するのでただ単に並列化するとまずいことが起こります.そこで,tsファイルを別々のフォルダに入れて並列で実行させました.

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #!/bin/zsh

    ParallelNum=4
    i=0
    for x in *.ts
    do
    FolderName=`echo “${x}” | openssl md5 | awk ‘{print substr($0, 10)}’`
    mkdir “${FolderName}”
    mv “${x}” “${FolderName}”
    echo “cd ${FolderName};ruby /opt/comskip_batch/ComskipBatch.rb –margin 3 –file ${x} –move_to ~/CM_cut_TS_File/${x%.ts}Cut.ts >/dev/null 2>&1; cd ../;” >> myshellCM`expr ${i} % ${ParallelNum}`.sh
    i=`expr $i + 1`
    done
    FILENUM=${i}

    if [ $ParallelNum -gt $FILENUM ];then
    for (( i = 0; i > myshellCM.sh
    done
    chmod +x myshellCM${i}.sh
    echo “./myshellCM${i}.sh ” >> myshellCM.sh
    else
    for (( i = 0; i > myshellCM.sh
    done
    chmod +x myshellCM${i}.sh
    echo “./myshellCM${i}.sh ” >> myshellCM.sh
    fi

    chmod +x myshellCM.sh
    zsh myshellCM.sh
    mv -f *.* /tmp/
    mv -f * /tmp/
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    • lasas 曰く:

      有用なシェルスクリプトのコメント、ありがとうございます!!
      こういったコメントを頂けると嬉しい限りです。

      パラレルで動作されると、確かにtmp*.tsと言う名前がバッティングしてしまって問題が出ますね。
      しかも、非パラレルでは、完了までの時間がかなり長いのが問題だったのですが、そこが改善されるのも素敵です。

  12. massa 曰く:

    あれれ? for文の後のカッコが取れちゃってる...コピペすると消えるみたいですね.

    • lasas 曰く:

      ウェブページへの投稿だと、サニタイジングされてしまう事がありますね。
      zshはあまり触らないので、余裕のある時に勉強がてらLinux上で動作確認した上で訂正させて頂きますね。

  13. scraped.volatility 曰く:

    tigerさんと同じ環境、同じ現象にハマっていたのですが、
    私の環境で解決したっぽいので共有します。

    ■ 修正前
    if IS_WINDWS
    tmp = Encoding.default_external
    Encoding.default_external = ‘utf-8′
    allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match(`#{FFMPEG} -i “#{file}” 2>&1`).to_a[1]
    Encoding.default_external = tmp
    else

    ■ 修正後
    if IS_WINDWS

    tmp = Encoding.default_external
    Encoding.default_external = ‘utf-8’
    ffmpeglog = `#{FFMPEG} -i “#{file}” 2>&1`
    ffmpeglog = ffmpeglog.force_encoding(‘UTF-8’).scrub(”)
    allTime = /Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/.match(ffmpeglog).to_a[1]
    Encoding.default_external = tmp

    else

    • lasas 曰く:

      コメントありがとうございます。
      本件、私の環境では再現しない為、アドバイスを頂けたことに非常に感謝しております。

  14. scraped.volatility 曰く:

    まず最初にお詫び申し上げます。
    >tigerさんと同じ環境、同じ現象にハマっていたのですが、
    >私の環境で解決したっぽいので共有します。
    などと言って適当なコードを投稿して申し訳ありません。
    何が問題だったから、投稿時の対応で解消したのかご説明
    しないと、lasas様も対応に困られますよね。

    さて、現在、本ページのComskipBatch.rbダウンロード
    から頂戴したアーカイブ内にComskipBatch.rbがないようです。

    私の適当なコードは省いていただいて結構ですので、
    再度公開いただけませんでしょうか。
    何卒宜しくお願い致します。

    • lasas 曰く:

      scraped.volatility様

      ComskipBatch.rbが入っていなかった理由は、修正中だったので、単純にそのファイルをアップロードしていなかっただけです。
      scraped.volatility様の指摘内容によって、ファイルを削除したのではありません。心配させてしまったようで申し訳ありませんでした。

      なお、ご指摘頂いた箇所は、私のほうで再現しなかった現象ですので、いただいたコードがそのまま適用されています。
      ffmpegから戻ってきた際の文字コードがUTF8以外だったので、文字コードを正規表現にかける直前でforce_encodingしたという理解ですが、間違っていたらご指摘ください。

  15. scraped.volatility 曰く:

    lasas様

    再度の公開、ありがとうございます。
    修正の理由はご推察の通りです。
    ただ、なぜ、私の環境ではUTF-8にするとうまくいくのか、
    その原因と根本対応は分かっていません。
    中途半端で申し訳ありません。

    lasas様のlinux系の記事も拝読させて頂いております。
    大変有益な情報ばかりで、有り難く活用させて頂いております。
    この場をかりてお礼申し上げます。
    ありがとうございます。

    • lasas 曰く:

      scraped.volatility様

      ご返信、ありがとうございます。

      『こうすれば上手くいきましたよ』等の助言を頂けるだけでも、原因究明が先に進むので、アドバイスと励ましのコメントは、非常にうれしいです。
      環境差異で再現しない場合には尚更助かります。

  16. t3500 曰く:

    初めまして。
    TSを自動CMカットしたくComskipBatch.rbをインストールさせていただきました。
    しかし、エラーで処理が止まるため、質問させて下さい。
    インストールについては、ご説明通りのディレクトリ構成でインストールしました。

    TSファイルは、EpgDataBon_Capにて作成しました。
    録画時間は30分です。
    まず、私の環境から説明させていただきます。

    Windows 7 x64
    PT2 rev.A
     Spinel 3.6.1.1
     BonDriver 0.3.0.0
     BonDriver_Spinel 3.5.3.0
     EpgDataBon_Cap 0.10.66.0
     
    ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]
    comskip 0.81.077
    ffmpeg version N-73818-g9ebe041 x64
    comskipbatch-rb Ver 0.08
    comskipbatch-rb/comskip.iniをcomskipディレクトリにコピー
    PowershellでTSをINPUTして実行

    > ruby.exe .\ComskipBatch.rb –margin 5 –file .\test.ts
    \ –move_to test_cut.ts
    \–failed_to test_failed.ts

    ./ComskipBatch.rb:48:in `to_msec’: undefined method `split’ for nil:NilClass (NoMethodError)
    from ./ComskipBatch.rb:152:in `block in ‘
    from ./ComskipBatch.rb:151:in `each’
    from ./ComskipBatch.rb:151:in `each_slice’
    from ./ComskipBatch.rb:151:in `’

    このようなエラーが出て、test_cut.tsが作成されませんでした。
    ちなみに、tmp0.ts〜tmp3.tsまでは作成されていました。

    こちらでやってみたことは、comskipのバージョン変更、rubyのバージョン変更(64bit/32bit)、ffmpegの(64bit/32bit)を使ったりしましたが、エラーは治りませんでした。

    私の技量ではお手上げですので、よろしくお願いします。2015/7/22

    • lasas 曰く:

      処理対象TSファイルの終了時間の取り込みに失敗しており、その結果、文字列.splitする箇所で、nil.splitしてエラーになっているような気がします。
      取りあえずは下記コマンドを実行して、『Duration:』が含まれる行があるかをご確認願えますでしょうか?

      ■ 実行するコマンド
      ffmpeg.exe -i “対象TSファイル”

      ■ 出力結果から確認する箇所
      Duration: 00:25:02.90, start: 77984.262267, bitrate: 14013 kb/s
      ↑ここのDuration:を取得する処理がソフトウェアの組み合わせで失敗しやすい。失敗すると、後続の処理も失敗する。

  17. t3500 曰く:

    早速ご回答頂きまして、ありがとうございます。
    ご指摘の通り、ffmpegコマンドにて、Durationを確認してみました。
    結果は、下記の通りでDurationは取得出来るように考えられます。
    ” Duration: 00:55:00.26, start: 55305.693433, bitrate: 14255 kb/s”

    lasas様が作成された時点と、私が導入した時点での各アプリケーションのバージョン問題なのでしょうか?

    —– ffmpeg.exe -i の結果 —–
    > fmpeg.exe -i test0.ts
    ffmpeg version N-73818-g9ebe041 Copyright (c) 2000-2015 the FFmpeg developers

    libavutil 54. 28.100 / 54. 28.100
    libavcodec 56. 49.101 / 56. 49.101
    libavformat 56. 40.101 / 56. 40.101
    libavdevice 56. 4.100 / 56. 4.100
    libavfilter 5. 25.100 / 5. 25.100
    libswscale 3. 1.101 / 3. 1.101
    libswresample 1. 2.101 / 1. 2.101
    libpostproc 53. 3.100 / 53. 3.100
    [mpeg2video @ 0000000003199940] Invalid frame dimensions 0x0.
    Last message repeated 7 times
    [mpegts @ 00000000031731e0] PES packet size mismatch
    Input #0, mpegts, from ‘test0.ts’:
    Duration: 00:55:00.26, start: 55305.693433, bitrate: 14255 kb/s
    —– ffmpeg -i の結果 以上 ーーーーー

    1つ気になったのが、PES packet size mismatchという部分ですが、PES Packet Sizeが間違っている場合、ストリームに問題がある場合があるようですが、今回の場合もそれに当てはまるのでしょうかね?

    そうなると、ソフトウェア、BATファイルの問題では無く私のTS Recodingのシステム問題になってきますね。

    補足になりますが、test0.vdrの結果はこのように記録されていました。
    —–test0.vdr—–
    0:14:22.69 start
    0:16:22.71 end
    0:32:57.74 start
    0:35:09.64 end
    0:39:53.75 start
    0:41:53.91 end
    0:52:38.22 start
    0:55:00.06 end
    —–test0.vdr ここまで—–

    最後に、長文になりますが、test0.logを添付させて頂きます。
    —–test0.log—–
    ################################################################
    Generated using public Comskip 0.81.077
    Time at start of run:
    Mon Jul 27 10:48:07 2015
    ################################################################

    Detection Methods to be used:
    1) Black Frame
    2) Logo – Give up after 2000 seconds
    3) Scene Change
    4) Resolution Change
    5) Closed Captions
    6) Aspect Ratio
    7) Silence
    8) CutScenes

    ComSkip throttles back from -0001 to -0001.
    The time is now 1048 so it’s full speed ahead!
    Frame Rate set to 29.970 f/s
    Ticks per frame = 2
    678901234567890123456789012345678901234567890123456789012345678901234567890
    32:
    33:
    34:
    35:
    36: –
    37: —-
    38: ++–+
    39: ||-++++|
    40: ||+++++||
    41: ||+||+|||
    42: — ||+|++|||
    43: —– |-++|+|
    44: +-+-| -++++|
    45: ||+++++|| —-
    46: ||+||+|||
    47: |||| ||||
    48: |||||||||
    49: – — ||||||++— —– —
    50: — —- ||||||+++— ——- —-
    51: —–| ||+++++ |||| —+++||||++++++++ |+++-
    52: ||+++-+| ||+-+++| |||| —-++||||++—++++| |+++++||
    53: ||++ |+|| ||| |++|| |||| |+||||+| -++|| |++||+|||
    54: |||| |++|| |||||||||| |||| ||+||||| |++|| |||| |+||
    55: |||| ||||| |||||||||| |||| —-++||||++– |+|| ||+| |+|||
    56: ||||||||| ||||||||| |||| —-+++| ||++– |+|| ||||||+||
    57: |||||||||| |||| |||| |||| |+++— –+++| |++| ||| ||+|
    58: ||||||||| ||||||||| ||||||+++— –+++| ||| |||| ||||
    59: ||||||||| ||||||||| ||||||||| ++|| |||| |||| |+||
    60: ||||||||| ||||||||| ||||||||| ++| ||+| |||| ||||
    61: ||||||||| ||||||||| ||||||||| |||||||| ||||||+|
    62: ||||||||| ||||||||| |||||||| |++| |+||||||||+|
    63: ||||||||| |||||||||| ||||||||| |||| ||+|||| ||+|
    64: ||||||||| |||| |||| |||| |||| ++| ||+||| ||+|
    65: ||||||||| ||||||||| |||| | | |||| |++|||||||
    66: |||| ||||+–+|+|||||| ||||||++| |||| | +-| ||||
    67: |||||||+++–+++||||||| ||||||+++— |||| | +-| ||||
    68: |||| |+++–++|| ||||| |||| |++—+| |||| – |||||
    69: |||| ——– |||| |||| —-++|| |||| – ||||
    70: ||++ —— ||||| ||+| —++|| ||+| |+||
    71: ||+++ ||||| |+++ |||| ||++ ++||
    72: |+++– ||||| |+++- ++|| |+++ +++|
    73: +++++——- |||| ++++—++|| |+++–++++|
    74: -++++—— |||| ++++++++ |++++++++
    75: ——-+++||||||| ——– ——
    76: —–+++|||||| — —
    77: –+++| |+||
    78: —+++| +-|
    79: |+++— |+| |
    80: ||++— ||++
    81: ||++ +|+||
    82: ||+| +++||
    83: ||++—-+++|
    84: |+++–+-+-
    85: –+—–
    86: —–
    87:
    88:
    89:
    90:
    Audio PTS jumped -21 frames at frame 21929

    Retry=0 at frame=98893, time= 3300.10 seconds
    Audio PTS jumped -34 frames at frame 98893
    Audio PTS jumped -21 frames at frame 98893

    Retry=1 at frame=98893, time= 3300.10 seconds
    Audio PTS jumped -23 frames at frame 98893
    Audio PTS jumped -21 frames at frame 98893

    Retry=2 at frame=98893, time= 3300.10 seconds
    Audio PTS jumped -23 frames at frame 98893
    Audio PTS jumped -21 frames at frame 98893

    Retry=3 at frame=98893, time= 3300.10 seconds
    Audio PTS jumped -23 frames at frame 98893
    Audio PTS jumped -21 frames at frame 98893
    Distribution of Black Frame cutting: 3 positive and 0 negative, ratio is 9.9900
    Confidence of Black Frame cutting: 0 out of 2 are strict, too low
    Distribution of Scene Change cutting: 21 positive and 0 negative, ratio is 9.9900
    Confidence of Scene Change cutting: 8 out of 20 are strict
    Distribution of Uniform Frame cutting: 1 positive and 0 negative, ratio is 9.9900
    Confidence of Uniform Frame cutting: 0 out of 1 are strict, too low
    Distribution of Volume cutting: 41 positive and 0 negative, ratio is 9.9900
    Confidence of Volume cutting: 19 out of 32 are strict
    Threshold used – 1.0500 After rounding – 1.0500
    No change

    Logo fraction: 0.6984
    Maximum volume found: 13564
    Average volume: 1558
    Sound threshold: 15
    Silence threshold: 100
    Minimum volume found: 0
    Average frames with silence: 97
    Black threshold: 25
    Minimum brightness found: 16
    Minimum bright pixels found: 0
    Minimum dim level found: 0
    Average brightness: 513
    Uniformity level: 500
    Average non uniformity: 216
    Maximum gap between logo’s: 167
    Suggested logo_threshold: 0.7250
    Suggested shrink_logo: 53.21
    Max commercial size found: 30
    Dominant aspect ratio: 1.3400
    Score threshold: 1.0500
    Framerate: 29.970
    Total commercial length: 0:06:12.07
    Block list after weighing
    —————————————————-
    # sbf bs be fs fe sc len scr cmb ar cut bri logo vol sil corr stdev cc
    0:++ 2 0 2 1 25843 0.00 862.261 0.06 0 1.34 EL v 440- 0.87 1628+ 98+ 0.000 44 NONE
    1:– 24 2 22 25844 26764 15.00 30.697 0.11 4 1.34 LC S vs 788= 0.00 1752+ 93- 0.000 78 NONE
    2:– 45 23 22 26765 27214 15.00 14.982 0.10 4 1.34 LC S vs 728= 0.00 1466- 91- 0.000 72 NONE
    3:– 23 23 0 27215 27484 3.33 8.976 0.36 3 1.34 LC a 2144= 0.00 1734+ 98+ 0.000 214 NONE
    4:– 3 1 2 27485 27642 14.60 5.239 0.28 5 1.57 A LCN v a 2259= 0.00 1531- 89- 0.000 225 NONE
    5:– 2 2 0 27643 28483 15.57 28.028 0.14 8 1.34 LC b 1336= 0.00 1998= 970 0.000 133 NONE
    6:– 1 1 0 28484 28540 15.57 1.869 0.09 8 1.34 LC vs 105! 0.00 150! 53! 0.000 10 NONE
    7:– 2 1 1 28541 29441 12.19 30.030 0.10 3 1.34 LC S v 859= 0.00 1885= 95- 0.000 85 NONE
    8:++ 4 2 2 29442 59261 0.00 994.961 0.04 0 1.34 EL v 257= 0.87 1340- 98+ 0.000 25 NONE
    9:– 2 2 0 59262 60159 12.00 29.930 0.19 2 1.34 LC S vs 1298= 0.00 1758+ 96- 0.000 129 NONE
    10:– 2 1 1 60160 60613 18.00 15.115 0.16 3 1.34 LC S v 1209= 0.00 1675+ 91- 0.000 120 NONE
    11:– 17 2 15 60614 61049 12.00 14.515 0.21 2 1.34 LC S vs 1256= 0.00 1751+ 95- 0.000 125 NONE
    12:– 37 15 22 61050 61438 2.00 12.946 0.25 0 1.34 L vs 2287= 0.00 1003! 83- 0.000 228 NONE
    13:– 24 23 1 61439 61869 6.00 14.348 0.08 0 1.34 L S v 809= 0.00 1563+ 93- 0.000 80 NONE
    14:– 4 2 2 61870 62319 12.00 14.982 0.14 2 1.34 LC S v 1277= 0.00 1916= 92- 0.000 127 NONE
    15:– 3 2 1 62320 62765 18.00 14.848 0.35 3 1.34 LC S v 2955= 0.00 1585+ 93- 0.000 295 NONE
    16:– 2 2 0 62766 63215 12.00 14.982 0.17 2 1.34 LC S vs 1388= 0.00 1844+ 92- 0.000 138 NONE
    17:++ 2 1 1 63216 71729 0.00 284.050 0.06 0 1.34 EL v 540+ 0.79 1683+ 98+ 0.000 54 NONE
    18:– 4 2 2 71730 72180 15.73 15.015 0.12 6 1.34 LC S v 1133= 0.00 1702+ 91- 0.000 113 NONE
    19:– 2 2 0 72181 72624 27.60 14.781 0.21 10 1.34 LC S vs 984= 0.00 1607+ 93- 0.000 98 NONE
    20:– 7 1 6 72625 72974 30.53 11.645 0.13 19 1.34 LC vs 725= 0.00 1703+ 92- 0.000 72 NONE
    21:– 10 7 3 72975 73019 54.28 1.468 0.00 21 1.34 LC v 222! 0.00 1551- 81- 0.000 22 NONE
    22:– 3 3 0 73020 73074 84.81 1.802 0.00 23 1.34 LC vsa 18! 0.00 1106! 73! 0.000 1 NONE
    23:– 3 1 2 73075 73439 99.99 12.145 0.10 27 1.79 A LC v a 838= 0.00 1654+ 92- 0.000 83 NONE
    24:– 2 2 0 73440 73523 99.99 2.769 1.21 25 1.34 LC vs 1666= 0.00 1710+ 80- 0.000 166 NONE
    25:– 1 1 0 73524 73927 99.99 13.447 0.01 25 1.34 LC s 188! 0.00 1769+ 93- 0.000 18 NONE
    26:– 1 1 0 73928 73973 99.99 1.501 0.00 23 1.34 LC vsa 173! 0.00 1291- 81- 0.000 17 NONE
    27:– 2 1 1 73974 74430 199.98 15.215 0.24 17 1.79 A LC S v a 1236= 0.00 1596+ 90- 0.000 123 NONE
    28:– 2 2 0 74431 74872 43.73 14.715 0.17 10 1.34 LC S vs 1140= 0.00 1989= 93- 0.000 114 NONE
    29:– 3 1 2 74873 75331 18.69 15.282 0.12 6 1.34 LC S v 1037= 0.00 1476- 90- 0.000 103 NONE
    30:++ 4 2 2 75332 94640 0.00 644.244 0.06 0 1.34 EL v 435- 0.76 1631+ 98+ 0.000 43 NONE
    31:– 3 2 1 94641 94729 2.00 2.936 0.34 0 1.34 L v a 1921= 0.00 1697+ 67! 0.000 192 NONE
    32:– 2 2 0 94730 95450 17.80 24.024 0.06 6 1.79 A LC a 585+ 0.00 1778+ 96- 0.000 58 NONE
    33:– 3 1 2 95451 95627 20.02 5.873 0.15 8 1.34 LC vs 1581= 0.00 1551- 91- 0.000 158 NONE
    34:– 2 2 0 95628 96061 99.99 14.448 0.11 11 1.34 LC S vs 1018= 0.00 1643+ 85- 0.000 101 NONE
    35:– 2 1 1 96062 96526 21.15 15.482 0.15 10 1.34 LC v 1395= 0.00 1663+ 89- 0.000 139 NONE
    36:– 4 2 2 96527 96978 37.82 15.048 0.35 9 1.34 LC S vs 2323= 0.00 1730+ 92- 0.000 232 NONE
    37:– 4 2 2 96979 97129 26.42 5.005 0.05 9 1.34 LCN v 721= 0.00 1735+ 78- 0.000 72 NONE
    38:– 4 2 2 97130 97576 60.94 14.882 0.18 9 1.34 LC S v 1926= 0.00 1934= 92- 0.000 192 NONE
    39:– 3 2 1 97577 98025 29.08 14.948 0.16 6 1.34 LC S vs 1879= 0.00 1436- 92- 0.000 187 NONE
    40:– 4 2 2 98026 98476 13.88 15.015 0.10 3 1.34 LC S v 607+ 0.00 1686+ 92- 0.000 60 NONE
    41:– 2 2 0 98477 98893 2.00 13.847 0.34 0 1.34 L b 935= 0.00 1920= 95- 0.000 93 NONE

    98893 Frames Processed
    ################################################################
    Time at end of run:
    Mon Jul 27 10:53:35 2015
    ################################################################
    —–test0.log ここまで—–

    お手数をおかけしますが、ヒントだけでも頂けると有り難いです。

  18. t3500 曰く:

    お世話になっております。
    ffmpeg -i finename.tsのあたりの処理が怪しいというご指摘でしたので、先ほどからその部分のみ書き出して、いろいろテストしてみました。
    結果的に、きちんとCMカットが動きましたので、ご報告させて頂きます。

    —–ComskiBatch.rb—–
    # ffmpeglog = `#{FFMPEG} -i ‘#{file}’ 2>&1`
    ffmpeglog = `#{FFMPEG} -i \”#{file}\” 2>&1`
    —–ComskipBatch.rb ここまで—–

    のように書き換えましたところ、alltime変数に格納することがきました。

    これで、CMカットが自動で出来るようになりました。
    有用なスクリプトを公開して下さり、ありがとうございます!

    D&DやSendToで使えるよう、こんな感じでBATファイルを書くと便利ですね。

    —–DropCut.bat—–
    powershell -NoExit ruby E:\RecSys\ComskipBatch\ComskipBatch.rb –margin 5 –file “%~1” –move_to “%~dpn1_new.ts” –failed_to “%~dpn1_failed.ts” gci
    —–DropCut ここまで—–

    • lasas 曰く:

      ご報告、ありがとうございます。

      無事に使えるようになったようでなによりです。
      どうも、余計な個所をコメントアウトしているようなので、
      土日にでも修正するようにしますね。

コメントを残す

メールアドレスが公開されることはありません。