HandBrake の CLI 版を用いた簡単 TS ファイルエンコードスクリプト

スポンサーリンク

 最近ちょっとばかり Ruby の勉強を始めた関係で x265 の他 HandBrake 用にもスクリプトを書いてみた。
 今回の物は録画して転がっている TS ファイルをドラッグするだけで HandbrakeCLI.exe に突っ込んでくれる代物。
 売りとしてはそれだけじゃ無く、複数の TS ファイルをドラッグしてやっても全部順番にエンコードしてくれるから、1 つ 1 つポチポチ操作も必要が無い。つまり寝ている間にどんどんエンコードをしていられる。

スクリプトのダウンロード

 まず最初に必要なこのスクリプト
 ts2mp4 v0.3b (2016/06/12)
 それと HandbrakeCLI.exe (64bit 版を推奨)
 HandBrake: Downloads

 使い方としては ts2mp4.zip を展開すると次のファイルが出てくる。

HandBrake_options.txt
readme.txt
ts2mp4.exe
ts2mp4.rb

 展開したフォルダと同じ所に HandbrakeCLI.exe を移してくる。
 最後に任意の TS ファイルを ts2mp4.exe にドラッグしてあげるだけ。
 メインとなるコマンドプロンプトが開いて情報が出力され、さらに別のプロンプトが開きそこで HandbrakeCLI.exe を用いたエンコードが実行及びその進捗が表示。エンコードが終了したら勝手に閉じてメイン側のプロンプトに経過時間が表示される。
 複数の TS ファイルを ts2mp4.exe にドラッグした場合、順番に全てエンコードしてくれるようにしている。

 エンコード設定に関しては Handbrake_options.txt に記述する。1 つのオプションを 1 行で書いていくタイプにした。
 行頭に # を書くと、その行はコメントとして扱われる。更に空行も無視されるようにした。取り敢えずで自分が常用している設定を記述してあるので、そのままでも無難なエンコードが可能だが好みによっては設定を追加変更等すると良いだろう。

 と言う事で、簡単にエンコードしてみたい方にオススメしたい自作スクリプトでした。

ソース

 以下ソースをペタっと。

#! ruby -Ks
# -*- mode:ruby; coding:windows-31j -*-
#
# Handbrake cli wrapper v0.3

require "open3"
STDOUT.sync = true

# 同じパスにある HandBrakeCLI.exe を使用する。
script_path = ENV['OCRA_EXECUTABLE'] || $0
base_path = File.expand_path( File.dirname(script_path) )
bin_name = "HandBrakeCLI.exe"
handbrake_path = "#{base_path}/#{bin_name}"

# =============================================================================
# HandBrakeCLI.exe があるかチェック。無ければ終了。

if !File.exist?(handbrake_path) then
    puts "同じフォルダに HandBrakeCLI.exe が見つかりません。"
    puts "Error detected."
    puts "Press ENTER KEY to exit. ******************************************"
    STDIN.gets
    exit(1)
end

# エンコードをする TS ファイル名を引数から取得する。
encode_src = ARGV
# 引数が無ければ終了する。
if !encode_src[0] then
    puts "エンコードを行うファイルの指定がありません。"
    puts "Press ENTER KEY to exit. ******************************************"
    STDIN.gets
    exit(1)
end

# ファイルの存在と拡張子のチェックを行う。
encode_src.each do |filename|
    if filename !~ /\.(TS|AVI)$/i then
        puts "拡張子が \.TS では無いファイルが含まれているので終了します。"
        puts filename
        exit(1)
    end
    if !File.exist?(filename) then
        puts "ファイル #{filename} は存在しません。"
        exit(1)
    end
end

def errCheck(state)
    if state.to_s !~ /(exit 0)/ then
        puts "Error detected."
        puts "Press ENTER KEY to exit. ******************************************"
        STDIN.gets
        exit(1)
    end
end

# Handbrake.exe の引数設定を設定ファイルから読み込んでパースする。
handbrake_args = File.open("#{base_path}/HandBrake_options.txt", "r").read
handbrake_args = handbrake_args.gsub(/(^\#.*\n|^\n)/, "").gsub(/\n/, " ")

# 途中で停止したい場合の操作手順説明
puts "***** 複数のエンコードを停止する場合はこちらのウィンドウで CTRL+C を *****"
puts "***** 押した後、HandBrakeCLI.exe が動いているウィンドウを閉じる。 ********"

# HandBrakeCLI.exe に TS ファイルを引き渡してエンコードを行う。
encode_src.each do |filename|
    # エンコード時間計測用
    start_time = Time.now.to_i
    # 渡された TS ファイル名をそのままに .MP4 ファイルにする。
    encode_dst = filename.gsub(/\.(TS|AVI)$/i, ".mp4");
    puts "#{Time.now.strftime("%Y/%m/%d %H:%M:%S")} -- Encode start \"#{filename}\" to .mp4"

    # 新しいコマンドプロンプトで実行させる。
    Open3.popen3("start #{handbrake_path} #{handbrake_args} -i \"#{filename}\" -o \"#{encode_dst}\"") do |i, o, e, w|
        e.each do |line|
            puts line
        end
        # HandBrakeCLI で何らかのエラーがあればそこで終了させる。
        errCheck(w.value)
    puts "#{Time.now.strftime("%Y/%m/%d %H:%M:%S")} -- Encode finished \"#{encode_dst}\""

    # 処理時間の算出と表示
    t = Time.now.to_i - start_time
    h = t / 3600
    m = t / 60 - h * 60
    s = t % 60
    printf("エンコードにかかった時間 : %02d:%02d:%02d\n", h, m, s)
    end
end

# エンターキーが押されるまでプロンプトを残しておく。
puts "Press ENTER KEY to exit. ******************************************"
ex = STDIN.gets

設定ファイル

 副音声も含めてエンコードしたい場合、”-a 1″ と記述されている箇所を “-a 1,2” に変更する事。

# HandBrakeCLI.exe の引数を設定するファイル。
# 必要に応じてオプションの追加/削除/変更等行って下さい。
# 取り敢えずであればこのままでも問題ないハズです。

# 行頭「#」はコメント行とし、空行は無視される。

### 使用するコンテナ
--format av_mp4
### 使用するエンコーダー
--encoder x264
### 以下 x264 の設定
--x264-preset=medium
--x264-tune=animation
--h264-profile=auto
--h264-level=auto
# エンコード品質指定。一般的には 20 前後推奨。値が小さい程高画質。
-q 21
# フレームレート指定。一般的にアニメなら 23.976、実写なら 29.976 等々。
-r 23.976
# 固定フレームレートを指定する。可変の場合は --vfr に書き換え。
--cfr

### 以下オーディオの設定
# 使用するオーディオトラックの指定 none で無し、複数指定でマルチプルに。
-a 1
# 使用するオーディオエンコーダー。TS ファイルの音声を使用する想定をした設定
## TS ファイルの音声をパススルーする場合
#-E copy:aac
## その他コーデックを用いる場合
-E fdk_aac

# オーディオのビットレート
#-B 160

# オーディオのサンプリングレート (8/11.025/12/16/22.05/24/32/44.1/48 kHz)
#-R auto

### 以下、動画の設定
--loose-anamorphic
--modulus 2
--pixel-aspect 4:3
# 720p にリサイズする場合
-X 960
-Y 720
# 1080p のままにする場合、上 2 行をコメントアウト、下 2 行を有効に。
#-X 1440
#-Y 1080

# クロップ指定 上:下:左:右 の順に。
--crop 0:0:0:0

### 以下、フィルタやその他
# 逆テレシネ、コーミング除去
--decomb
--detelecine

# 詳しいオプションの内容は HandBrakeCLI.exe --help を参照の事。
# 2015/04/17 Rev.01 初版
# 2016/06/11 Rev.02
# ・DXVA デコードオプションが廃止されたので修正
# ・動画サイズ指定オプションを -w, -l から -X, -Y (最大ピクセル数指定)に変更
# 2016/06/12 Rev.03
# ・リサイズ後の動画フォーマットを -w, -l を用いていたときと同じになるよう、
#  細かく詰めて調整を行った。
#  (Rev.02 の方法ではエンコード後のファイルサイズが大きくなってしまう為)

Ruby スクリプトへのドラッグで直接使う方法 (2016/01/24 追記)

 RubyInstaller for Windows のサイトから Ruby 2.1 系の 32bit 版インストーラーをダウンロードしてインストールを行う。
24_rubyinstaller
 次の内容を .reg ファイルとして保存を行いダブルクリックをしてレジストリに流し込む。すると .ts ファイルを ts2mp4.rb にドラッグアンドドロップで .exe と同じ動作が可能になる。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\RubyFile\ShellEx]

[HKEY_CLASSES_ROOT\RubyFile\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

 こうするとスクリプトを自分で弄っても簡単に使えるようになるからオススメでもある。

更新履歴

2016/01/22 – v0.3 バグ修正

 exe 化した実行ファイル使用に於いて、エンコード対象のファイルがネットワークドライブに存在すると、カレントディレクトリが実行環境毎で変化していた不具合があったので修正した。

2016/06/11 – v0.3a オプションファイルのみ更新

 HandBrakeCLI.exe 最新の Nightly Build ではオプションの挙動が一部 (特に動画のリサイズ) が変わっていたので、対応すべくオプションの変更や表記の変更のみを行った。
 ライセンスの関係上 FDK_AAC が無効化されている為、自力でビルド出来ない場合には “-E copy:aac” を有効にして TS ファイルの音声をエンコード無しにパススルーさせた方が良いかもしれない。

2016/06/12 – v0.3b オプションファイルのみ更新

 v0.3a で対応したリサイズ方法だと、コンテナ内の動画サイズが再生サイズと同一になっていた為、エンコード量が増えてしまっていた。その関係でビットレートも上がりファイルサイズも大きくなっていた。よって、リサイズ方法を変更というか正しい方法に書き換えた。
 TS ファイルの様に、動画サイズを 960×720 として格納し、再生時に 1280×720 に伸ばして再生させる方が HandBrake 的に正しいかなと。

2017/06/10 – ファイル内容変化無し

 最近のコミットで OpenCL によるスケーリングオプションが無効となったので HandBrakeCLI.exe を自分でビルドしている方は “-P” を指定するとエラーがでるので使わないこと。

スポンサーリンク

『HandBrake の CLI 版を用いた簡単 TS ファイルエンコードスクリプト』へのコメント

  1. 名前:匿名 投稿日:2016/01/22(金) 00:58:12 ID:8871722d0 返信

    検索から流れ着きました。
    説明通りにファイルを配置しても
    「同じフォルダに HandBrakeCLI.exe が見つかりません。」のところでエラーになります。
    この記事上以外に動作させるのに必要なものがあるのでしょうか?

    • 名前:ぶっち 投稿日:2016/01/22(金) 02:19:29 ID:03f5adaf8 返信

       申し訳ありません。exe 化したスクリプトでは、ファイルをドラッグアンドドロップを行った場合、エンコード対象のファイルがネットワークドライブ上にあると環境によっては上手くチェックが行えずにエラーを出すことを確認いたしました。
       修正したファイルをソースと共にアップロードしておきましたので、よろしければ使ってみて下さい。

       https://bucci.bp7.org/wp-content/uploads/2016/01/ts2mp4_0.3.zip

  2. 名前:匿名 投稿日:2016/01/23(土) 18:02:02 ID:3055902a6 返信

    >ぷっちさん

    環境の情報を全く載せていなかったにもかかわらず修正版でばっちり動作しました!
    ありがとうございます!使わせていただきます!

    • 名前:ぶっち 投稿日:2016/01/23(土) 18:59:03 ID:52374db38 返信

      無事に動作して良かったです。勉強がてら作ったきりのプログラムなので雑ですいません。
      自分自身、未だにこのスクリプトを使って問題無くいますので、気に入ってくれたのであれば幸いです。

  3. 名前:nob3 投稿日:2017/03/10(金) 13:03:14 ID:b34b5ee04 返信

    ぷっちさん 
    初めまして、nob3と言うものです。
    私は初めエンコにFFmpegを使用、その後はGUI版のHandBrakeを使用していましたが、時間がかかる割には思うような画質が得られず、お手上げ状態でした。
    ところが、ぷっちさん作成のスクリプトを使用し、手軽に高画質エンコができるようになり、大変感謝しております。ライブ映像が多いので-r29.976 の設定で使用しています。(このoptionも凄くフレキシブルで有り難いですね)
    夜中に複数ファイルのエンコが出来るので重宝しています。
    素晴らしいスクリプト公開して頂き、本当に有り難うございます。

    • 名前:ぶっち 投稿日:2017/03/10(金) 13:17:05 ID:521a73c89 返信

       はじめまして。ぶっちです。
       私が作成したスクリプトがお役に立っているようで嬉しい限りです。ご使用ありがとうございます。
       自分自身としても公開したときからスクリプト自体へ手を加えること無く未だに使用しております。オプションは動画によってアレこれ変えますが、別ファイルとして処理するようにして良かったなと自分でもおもっております (笑

  4. 名前:nob3 投稿日:2017/03/10(金) 23:25:01 ID:b34b5ee04 返信

    ぷっちさん 即レス有り難うございます。

    エンコはどこで折り合いをつけるか、人それぞれだと思います。
    このスクリプトの場合、これまで自分がいろいろ試してき設定などより遙かに早く、かつ高画質です。
    何か自分のやってきたのが単なる時間の浪費だったような気がします。
    これはts⇒mp4のスタンダードといえるかもしれませんね。

    ところで、今nasで悩んでおります。
    現在、自作nasでLinux-mintでHDD2台のraid1にmediatombを使用しています。
    mp4再生はmediatombのトランスコードか、ソニーBDPによるネット再生をしています。
    ぷっちさんはmp4やtsのファイル管理、メディアサーバー、nasはどのようなものをお使いでしょうか。
    差し支えの無い範囲で、ご教示頂ければ幸甚です。
    nob3

    • 名前:ぶっち 投稿日:2017/03/10(金) 23:39:47 ID:521a73c89 返信

       nob3 さんこんばんは。
       特段 NAS として RAID 云々まで手が回らないので、CentOS 7 上で Samba を動かしつつ Win から共有する形でファイルをやり取りしたり、スマホと PC 双方向に動画をやり取りしたい時にはこれまた CentOS 7 上で動かしている NextCloud 経由で同期することで割とスムーズにやり取りできております。
       また、DLNA 的な使い方はしていません。

       ストレージに冗長性を持たせるべきとは思っていますが、現状はバックアップスクリプトを書いて rsync で適当に飛ばしているだけになります。

  5. 名前:nob3 投稿日:2017/03/11(土) 11:41:01 ID:63537f19f 返信

    ぷっちさん 返信有り難うございます。
    DLNAを使わずとも、SambaとCloudで動画が共有できるということですか。
    確かにファイルは共有とバックアップさえしっかり出来ていれば、NASにこだわることは有りませんね。

    実はRAID1のHDDの使い方が無駄なような気がしています。シングル運用に変更しrsyncで深夜に定期バックアップを取る方が、私の目的には合うかもしれません。
    有り難うございました。
    nob3

  6. 名前:名前 投稿日:2018/02/21(水) 11:47:15 ID:1d81f1121 返信

    1280*720にドットバイドットで縮小した方が綺麗なのですが、
    その設定方法の書き換え方法を教えてください、
    そのまま打ち込んでもアスペクト比を打ち込む設定が4:3のままなので、
    解像度を変えて簡単に縮小が出来ません、お願い致します。

    • 名前:ぶっち 投稿日:2018/02/21(水) 14:17:57 ID:7ee674475 返信

      --pixel-aspect 1:1
      -X 1280
      -Y 720

      こうすることで 1280×720 になります。
      画質を取るか速度を取るかでこの辺は弄ってみると良いですね。

      • 名前:名前 投稿日:2018/02/21(水) 15:24:41 ID:1d81f1121 返信

        すぐに返信頂き有難うございます。
        やってみます。