録画したTSファイルを手っ取り早くH.264でエンコードする方法です。環境のセットアップは10分程度で済みます。対象ディレクトリ内に存在するTSファイルをH.264エンコードするバッチファイルもついでに作成しました。
PT2/PT3を使っていると録画ファイルが大量に溜まるのですが、これをTSファイルのまま保存しておくと、30分番組で1.8G~4.5Gもの容量を消費してしまいます。これではいくらHDDがあっても足りない為、Ubuntuで構築した録画サーバ上でcomskip、ffmpegを連携させてCMカットした後バッチで一括処理した後に、ffmpegでH.264エンコードして容量を30分あたり500M程度にして保存していました。しかし、録画サーバのスペックが低くH.264エンコードを大量に行うには不適切と言う悩みがありました。その対策としてH.264エンコードをWindows上で行えるようにした時の備忘録です。
ffmpegを選択する前にWindows上でH.264エンコードできるソフトウェアを色々試してみたのですが、今回は、CMカットとエンコード処理後にディレクトリ移動させる事と、無料のソフトウェアを組み合わせて処理する事が目的なので、ソフトウェアの選択基準は『バッチ処理に組み込みやすい』と言う理由にのみ基づいています。
ソフト | 費用 | 構築難易度 | コメント |
---|---|---|---|
AviUtils | 無料 | 中 | 画質、エンコード速度共に優秀。有志の努力によってIntel Quick Sync Videoも使えます。各種プラグインでノイズ除去やロゴ消し等、色々出来ますがその分処理速度が遅くなる傾向にある模様です。今回は、CMカットにffmpegを使っている事から、エンコードソフトに統一性を持たせるために候補から外しました。 |
MediaEspresso | 2980円 | 低 | 購入して試しました。Intel Quick Sync Videoが使える為エンコード速度も速く、使い勝手も良いです。 |
ArcSoft Media Converter | 29.99ドル | 低 | Intel Quick Sync Videoが使え、変換も変換後の画質も上々。ただし購入が海外からの為、クレジットカード決済やPayPal決済が必要ですが、使いやすいです。今回は無料ではないので候補外にしました。普通に使えます。 |
ffmpeg | 無料 | 低 | コマンドラインから実行。頻繁にバージョンアップされている為、1年前に使えていたオプションが使えなくなったりすることもちらほら。ただし、音声分離させずにコマンド一発で音ズレ無しでH.264エンコードでき、CMカットやファイル移動のコマンドを含むバッチ処理に組み込みやすい。 |
TMPGEnc | 9,333円 | 高 | 動画エンコードの老舗です。TSのエンコード目的で購入するにはオーバースペックな気がした事と、無料ではないと言う理由で候補から外しました。有料版で学習コストと手間を惜しまないならこのソフトが一押しだと思われます。 |
ffmpegのオフィシャルサイトのダウンロード画面から、windows版のffmpegをダウンロードします。64bit版、32bit版があるので、お使いのOSに合わせて選択してください。
上記画面の赤枠個所をクリックすると、windows版ffmpegのダウンロード画面へ辿れます。
ffmpegのダウンロードではstaticとsharedがありますが、今回はstaticの方を選択します。32bit/64bitはお使いのOSに合わせて選択してください。
ダウンロードしたffmpegを解凍して適当なディレクトリの下に配置します今回は、C:\localApp\ffmpegにしました。取りあえず、解り易ければ何処でも良いです。
『スタートメニュー』 > 『アクセサリ』 > 『Windows PowerShell』 > 『Windows PowerShell』から、powershellを起動します。一応、ダウンロードしたffmpegの64bitに合わせて、powershellも64bitを使います(x86とある方は32bitです)。
powershell上から、TSファイルがあるディレクトリに移動して、ffmpegによるエンコード処理を行います。
# TSファイルがあるディレクトリに移動する cd Z:\未エンコード # ffmpegを実行する。 C:\localApp\ffmpeg\bin\ffmpeg.exe -i ソードアート・オンライン.ts -movflags faststart \ -vcodec libx264 -acodec libmp3lame -ac 2 -ar 48000 -ab 128k \ -threads 4 ソードアート・オンライン.mp4
ffmpegに指定したオプションの意味は下記の通り。設定をつめたい人はドキュメントを確認して、オプションを見直してください。
ffmpegのオプション | 意味 |
---|---|
-i ソードアート・オンライン.ts | 元のTSファイル |
-movflags faststart | メタデータを先頭に持ってくることで、ファイル全体を読み込む前に再生できるようにする。 |
-vcodec libx264 | H.264エンコード指定 |
-acodec libmp3lame -ac 2 -ar 48000 -ab 128k | 音声部分はlameでmp3エンコードする。 |
-threads 4 | スレッド数。CPUのコア数に合わせる。4コアなら4。CPUコア数を1つは開けておきたいとか言う要望があれば、-1して指定すれば良い。 |
ソードアート・オンライン.mp4 | 出力ファイル名 |
ffmpegを実行すると、下記のような画面でエンコード中となります。4コアのCore i5 3470で23分のTSをエンコードするのに20分ほどかかりました。
本投稿ではwindows上にffmpeg環境をセットアップするのが目的ですが、上記までだと、一つ一つのファイルについてコマンドを書き換えて実行すると言う面倒な作業を強いられて精神衛生上よろしくありません。なので、30分で取りあえず使えるようにしたpowershellスクリプトを使ってコマンドラインからまとめて実行できるようにします。一応、アップロードもしておくので、好きにダウンロードして編集して使って下さい。
一応、補足しておくとこのスクリプトはエンコードのみでCMカットやエンコード成功したファイルの移動処理は含まれていません。
## 環境に合わせて下記の環境変数は修正してください。 # TSファイルが置かれているディレクトリ $TARGET_DIR="Z:\未エンコード" # ffmpegの実行ファイル $FFMPEG="C:\localApp\ffmpeg\bin\ffmpeg.exe" # エンコードオプション(ビデオ回り) $FFMPEG_OPT_VIDEO="-vcodec libx264" # エンコードオプション(音声回り) $FFMPEG_OPT_AUDIO="-acodec libmp3lame -ac 2 -ar 48000 -ab 128k" # スレッド数。CPUのコア数と同じにすればいいと思います。 $FFMPEG_OPT_THREADS="4" # ファンクション定義 function h264enc { if ($args.count -ge 1) { $arg="-i '$args.ts' -movflags faststart $FFMPEG_OPT_VIDEO $FFMPEG_OPT_AUDIO -threads $FFMPEG_OPT_THREADS '$args.mp4'" powershell -Command "$FFMPEG $arg" } else { "エンコード対象のファイルを指定してください。" } } cd $TARGET_DIR Get-ChildItem | ForEach-Object { h264enc $_.Basename }
h264enc.ps1のダウンロード後、ファイル内の、$TARGET_DIR、$FFMPEG、$FFMPEG_OPT_THREADSを編集してからh264enc.ps1を右クリックして、powershellで実行を選べば対象ディレクトリ以下にあるTSファイルすべてに対して、H.264エンコードが順次実行されると思います。
powershellは、初めて扱ったのでお作法等が間違っているかもしれません(環境変数の定義方法とかが特に怪しい)が、取りあえず結果オーライと言う事で・・・。OS起動直後に実行されるようにしておけば、良い感じに対象ディレクトリに対してH.264エンコードが実行されると思います。H.264エンコードが済んだファイルは他の場所に移動しないと、毎回同じファイルに対してエンコードしてしまうので、その辺はご自分で作りこんでください。
全自動CMカットスクリプトは今現在テスト中なので、ある程度検証が終わったらアップロードするかもしれません。
ピンバック:ぽんこつ庵 » 録画映像のエンコード環境