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版を優先してテストしたため、対応したら更新します。)
下記の手順でインストールを実施します。
- powershellが使える事を確認(windows vista / 7 / 8 / 8.1 / 2008 / 2012は使えると思います。ちなみにテスト環境はWindows7です。)
- rubyをインストール(RubyInstaller からDLして、普通にインストールしてください)
- ディレクトリの用意『comskip_batch』フォルダを作成し、その下に、comskip、ffmpegフォルダを作成してください。
- ffmpegのインストール(DLして解凍するだけ)
- 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.iniComskipBatch.rbのダウンロード
[wpdm_file id=1 title=”true” desc=”true” template=”bluebox ” ]
運用ノウハウ
- 当然の事ながら、エンコード対象ディレクトリのパーミッションが間違っていると、処理に失敗する。処理失敗した場合には、まずはパーミッションを見直してください。
- ネットワーク越しのマウント先に対して処理を行う場合にもパーミッションに注意。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 | – |
参考にさせてもらった情報は下記のサイトです。
- foltiaで全自動CMカットを実現しよう
- comskipのUNIX化
- 自動TSエンコードバッチ(AutoConvert)
こんにちは、初めまして。
TSのCMカットで、検索してこちらにたどり着きました。
素人質問になりますが、
1.ComskipBatch.rbは、どこからダウンロードすれば、宜しいでしょうか。
2.使い方としては、実行例のbatファイルを作って、実行でしょうか?
お手数お掛け致しますが、教えて頂けると幸いです。
宜しくお願い致します。
ご指摘ありがとうございます。
プラグインの更新に伴い、リンクが表示されないようになっていました。
>1.ComskipBatch.rbは、どこからダウンロードすれば、宜しいでしょうか。
こちら、ダウンロードマネージャのパッケージ更新に伴って設定が初期化され、ダウンロードリンクが無くなっていました。
パッケージをダウングレードしましたので、ご確認ください。
>2.使い方としては、実行例のbatファイルを作って、実行でしょうか?
その通りです。
念の為、テスト用のファイルを用意して、何度か試した後に利用開始してください。
ご対応、ありがとうございます。
無事、ダウンロードできました、早速試して見ます(^^)
ps。
もし、不明点でてきましたら、また質問させていただくかもですが、
その際には、また宜しくお願い致しますm(_ _)m
こんにちは、先日は、対応ありがとうございました。
質問が、あります。下記、環境で試しているのですが、
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であるかどうかのフラグとか、関係ありますでしょうか?素人質問かもですが、教えて頂けると幸いです。
長文になり、申し訳ありません。宜しくお願い致します。
的確な内容でバグ報告をあげてくださったので概要の把握が楽で助かります。
環境的にはあっていそうですが、テストは基本的にLinux+Wine上で行っていた為、文字コードの差異(UTF8とSHIFT-JIS)のような感があります。
土日辺りに確認してみますね。
もし、お急ぎのようでしたら、Vmware上にUbuntu Linux環境を作れば動くと思われます。
お手数をおかけしますが、以上、よろしくお願いします。
こんにちは
気になっているのが、
ディレクトリを追加すると、
G:\\comskip_batch\\のように、入れていないのに。
\\が二つになってしまうんです。
お手数お掛け致しますが、対応方法が分かりましたら、大変助かります。
宜しくお願い致します。
ご返答が遅れてしまい申し訳ありません。
\\が2つになってしまう件は、そうなっていないと特殊文字がエスケープされないので、そう言うものとして考えるしかないと思います。
本バッチを見直してみたところ、コメント出力する部分でWindows-31JとUTF-8の文字列をくっ付けている個所がNGでしたので、その点を修正しました。再DLをお願いします。
また、PowerShell上で実行し、テスト用のTSファイルのCM検出とCMカットが出来る所までは確認しました。
こんにちは、ご対応ありがとうございます。
早速ダウンロードして試してみます(^^)
こんにちは、
新しい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
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
でバージョンが表示されると思いますので。
>コメントに括弧は、使えないんですね?
一部の文字列はサニタイジングされて削除されてしまうかもしれません。
エラーコードなどを貼り付ける際には、特に制限に引っかかり易いかもしれません。
こんにちは、早速のお返事ありがとうございます。
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なことが
分かりました。
ただ、もし、ここのところが、上手くプログラムで、入力されると
最高です。お時間あるときに、ご検討いただけると、幸いです。
以上、宜しくお願い致します。
無事にカットできましたか!!
最近多忙なので週末あたりでしたら時間が取れるかと思います。
手動で書き換えるのは、この手のスクリプトとしては有りえないので、改善するようにします。
ご指摘の件、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
こんにちは
対応ありがとうございます。
下記のように修正して、テストしてみました。(修正前を
コメントアウトしただけですが)
# 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ですので、
もし何かあれば、教えて下さい。
宜しくお願い致します。
長丁場のやり取りになってしまっているにも関わらず、ご対応いただき、恐縮です。
>エラーが変わりました。一応、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の最後の時間を直接書いて』の箇所が自動化されると思われます。
これもバッドノウハウですね(汗
いろいろご対応ありがとうございます。
うちの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
>素人で、良く分からないのですが、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 = の箇所を上記に書き換えてみれば、どこまで想定通りの値が来ているかがわかるかと。
こんにちは、アドバイスありがとうございます。
置き換えて試して見ました。
結果、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)
ご連絡が遅れて申し訳ありません。
回答が遅れてしまいそうでしたので、まずは一次回答をさせていただきます。
>結果、scrb = ffmpeg_return.scrub(”)のところで、
>止まってしまいました。
ffmpeg_returnの中身に何も入っていないようですね。
実行結果としては、下記のような内容を想定していましたが、
ご返答の内容で止まってしまったと言う事は、ffmpeg_returnの中身が無かったみたいですね。
‘——————— ffmpeg_return ———————’
ffmpeg_returnの中身を表示 << この中身をセットできていないから、後続処理が上手くいっていなかった ‘——————— scrub ———————’ scrbの中身を表示 ‘——————— allTime_array ———————’ allTime_arrayの中身を表示 ‘——————— allTime ———————’ allTimeの中身を表示 当方の環境で再現しないのがもどかしい限りですが、 週末にもう少し中身を見てみますね。
こんにちは
いろいろご対応ありがとうございます。
お時間あるときにで、良いので、
見て頂ければ嬉しいです。
でも、うちだけの環境かも知れませんね。
tigerさん
lasasさんが修正案として挙げられた scrub関数を挟む方法にて、もしかしてチョットした書き間違いがあるのでは無いでしょうか。
scrub(”)) → scrub(”))
ダブルクォーテーションではなく、シングルクォーテーション2個?
並列化可能にしてみました.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/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
有用なシェルスクリプトのコメント、ありがとうございます!!
こういったコメントを頂けると嬉しい限りです。
パラレルで動作されると、確かにtmp*.tsと言う名前がバッティングしてしまって問題が出ますね。
しかも、非パラレルでは、完了までの時間がかなり長いのが問題だったのですが、そこが改善されるのも素敵です。
あれれ? for文の後のカッコが取れちゃってる...コピペすると消えるみたいですね.
ウェブページへの投稿だと、サニタイジングされてしまう事がありますね。
zshはあまり触らないので、余裕のある時に勉強がてらLinux上で動作確認した上で訂正させて頂きますね。
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
コメントありがとうございます。
本件、私の環境では再現しない為、アドバイスを頂けたことに非常に感謝しております。
まず最初にお詫び申し上げます。
>tigerさんと同じ環境、同じ現象にハマっていたのですが、
>私の環境で解決したっぽいので共有します。
などと言って適当なコードを投稿して申し訳ありません。
何が問題だったから、投稿時の対応で解消したのかご説明
しないと、lasas様も対応に困られますよね。
さて、現在、本ページのComskipBatch.rbダウンロード
から頂戴したアーカイブ内にComskipBatch.rbがないようです。
私の適当なコードは省いていただいて結構ですので、
再度公開いただけませんでしょうか。
何卒宜しくお願い致します。
scraped.volatility様
ComskipBatch.rbが入っていなかった理由は、修正中だったので、単純にそのファイルをアップロードしていなかっただけです。
scraped.volatility様の指摘内容によって、ファイルを削除したのではありません。心配させてしまったようで申し訳ありませんでした。
なお、ご指摘頂いた箇所は、私のほうで再現しなかった現象ですので、いただいたコードがそのまま適用されています。
ffmpegから戻ってきた際の文字コードがUTF8以外だったので、文字コードを正規表現にかける直前でforce_encodingしたという理解ですが、間違っていたらご指摘ください。
lasas様
再度の公開、ありがとうございます。
修正の理由はご推察の通りです。
ただ、なぜ、私の環境ではUTF-8にするとうまくいくのか、
その原因と根本対応は分かっていません。
中途半端で申し訳ありません。
lasas様のlinux系の記事も拝読させて頂いております。
大変有益な情報ばかりで、有り難く活用させて頂いております。
この場をかりてお礼申し上げます。
ありがとうございます。
scraped.volatility様
ご返信、ありがとうございます。
『こうすれば上手くいきましたよ』等の助言を頂けるだけでも、原因究明が先に進むので、アドバイスと励ましのコメントは、非常にうれしいです。
環境差異で再現しない場合には尚更助かります。
初めまして。
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
処理対象TSファイルの終了時間の取り込みに失敗しており、その結果、文字列.splitする箇所で、nil.splitしてエラーになっているような気がします。
取りあえずは下記コマンドを実行して、『Duration:』が含まれる行があるかをご確認願えますでしょうか?
■ 実行するコマンド
ffmpeg.exe -i “対象TSファイル”
■ 出力結果から確認する箇所
Duration: 00:25:02.90, start: 77984.262267, bitrate: 14013 kb/s
↑ここのDuration:を取得する処理がソフトウェアの組み合わせで失敗しやすい。失敗すると、後続の処理も失敗する。
早速ご回答頂きまして、ありがとうございます。
ご指摘の通り、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 ここまで—–
お手数をおかけしますが、ヒントだけでも頂けると有り難いです。
お世話になっております。
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 ここまで—–
ご報告、ありがとうございます。
無事に使えるようになったようでなによりです。
どうも、余計な個所をコメントアウトしているようなので、
土日にでも修正するようにしますね。
今更ですが
>ウェブ上からCMカットの有無を選択できると嬉しい。
私はdo-record.shでMODE変数で切り分けてます。
RECORDER=/usr/local/bin/recpt1
if [ ${MODE} -eq 0 ]; then
$RECORDER –b25 –strip –eid ${EID} $CHANNEL $DURATION ${OUTPUT} > /dev/null
elif [ ${MODE} -eq 1 ]; then
$RECORDER –b25 –strip –sid ${SID} –eid ${EID} $CHANNEL $DURATION ${OUTPUT} > /dev/null
if [ ${CHANNEL} -ne 26 -a ${CHANNEL} -ne 27 ]; then
cp $OUTPUT ${OUTPUT}.ts
/usr/local/bin/ruby /opt/comskip_batch/ComskipBatch.rb –margin 0 –file ${OUTPUT} > /dev/
null
fi
fi
録画時にminimum-tsを選べばcmカットされます。
NHKははじいています。
参考になれば。
さっきの続き
modeの追加はconfig.phpでできますよ。
アドバイスありがとうございます。
MODE変数で切り分ける方法、良さそうですね。私の方でも修正して運用してみます。
追伸
まだ使ってくださっている方がいるようなので、暇を見てスクリプトの更新版をアップロードしますね。
まず,Windowsでrubyをインストールしました.(バージョンはruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x64-mingw32]です.)
さて,ComskipBatch.rbで変換しようとすると,vdrまではうまくできるのですが,ffmpegによる分割の前で,「ComskipBatch_core.rb:49:in `to_msec’: undefined method `split’ for nil:NilClass (NoMethodError)」がでます.これはmac版のrubyでも同様にでます.原因を調べたところプログラムのsplit関数の仕様が変わったことが原因だとわかりました.そこで,
def to_msec(str = ’00:00:00.00′)
h,m,s = str.split(‘:’);
s,ms = s.split(‘.’);
ms = ms.is_a?(Integer) ? ms : 0;
return Time.local(1970, 1 ,1 ,h, m, s, ms*1000);
end
を
def to_msec(str = ’00:00:00.00′)
h,m,s = str.to_s.split(‘:’);
s,ms = s.to_s.split(‘.’);
ms = ms.is_a?(Integer) ? ms : 0;
return Time.local(1970, 1 ,1 ,h, m, s, ms*1000);
end
のようにするとうまく変換できました.
それから
command = “#{FFMPEG} -y -i “#{file}” -c copy -ss #{ary[0]} -t #{st.strftime(“%T.%L”)} -sn “tmp.#{i}.ts””
の記述ですが,ffmpegでは,-ssを最初の引数にもって来たほうが変換が高速になります.つまり
command = “#{FFMPEG} -ss #{ary[0]} -y -i “#{file}” -c copy -t #{st.strftime(“%T.%L”)} -sn “tmp.#{i}.ts””
とすることです.実際これでも動きますし,先頭の頭出しに時間がかからなくなる文速く変換が終わります.
上記2点を変更したバージョンにされてはいかがでしょうか?
はじめまして。こんにちは。
ComskipBatch.rbのダウンロードリンクが切れてしまっているようです。
公開いただくことは可能でしょうか。
お手数ですが宜しくお願いいたします。
失礼いたしました。ダウンロード先がページ内で復活しております。