.ts のお手軽エンコードに HandBrake を使うことにした

追記 2015/05/08
ffmpeg のフィルタの使い方によっては ffmpeg でも手軽に処理できるが、HandBrake はハードウェアデコーダーを搭載しているのでその分処理も速くなっている。

HandBrake は QSV 対応版が有り、ffmpeg にも QSV と NVENC(AVC, HEVC) でエンコードできるようになっている。しかし配布バイナリにはまだ付いてない上に、NVENC は non-free なので配布バイナリには一生付いてこない。

qsv 対応の ffmpeg をつくる
ffmpeg に nvenc(cuda) をインストールする

ffmpeg の逆テレシネについては decimate を使うことで手軽に重複フレームを除外できる。
この部分は後日追記予定。

追記 ここまで

.ts の中身は MPEG2-TS/AAC 30/1.001fps (24/1.001fps 混在を含む) 1440x1080 や 1980x1080 のインターレースの動画である。

HandBrake に至るまでにどれを試したかというと ffmpeg, avconv, mencoder の3種類である。

ffmpeg は日本語を含めてドキュメントが豊富にあり色々なフィルタがかけられる反面、逆テレシネフィルタをかけるとCPU使用率が下がりメモリリークし音ズレするので使えない結果になった。

avconv は逆テレシネフィルタがある、mp(mplayer filter)が使えなかったので試せず。

mencoder は mp の総本山であるが、配布されている mencoder に AAC エンコーダーがついていないのと、AAC を付けて remux すると音ズレしたりするのでやはり使えないことになった。

ffmpeg : Zeranoe FFmpeg - Builds
avconv : Get Libav
mencoder : MPlayer - The Movie Player

mencoder で使えるビデオフィルタ一覧 : MPlayer

ffmpeg の使用コマンド
ffmpeg -i in.ts -vf mp=detc=am=0:dr=2:fr=0,yadif,setpts=N/(24000/1001*TB) -acodec copy -bsf:a aac_adtstoasc -r 24000/1001 -y out.mp4

mencoder の使用コマンド
mencoder -oac pcm -ovc x264 -ofps 24000/1001 -o out.avi -vf detc=am=0:dr=2:fr=0,yadif,fixpts=fps=24000/1001 in.ts

HandBrake はクロスプラットフォームで実行できるエンコーダーであり、コマンドラインから実行する HandBrakeCLI とその GUI である Handbrake を使う。GUI には指定できないオプションもあるので使い方に慣れればコマンドラインから実行する方をおすすめする。この記事ではコマンドライン版の使い方を解説する。ナイトリービルドは最新版の x264 や OpenCL を使ってエンコードできる。 OpenCL ではゲームPCなどで環境が揃えば高速にエンコードできる。

公式サイト : HandBrake
handbrake をコマンドから起動 :CLIGuide – HandBrake
ナイトリービルド : HandBrake OpenCL [Jenkins]
使い方 : HandBrake日本語版の使い方:DVD/動画ファイルを変換する - SourceForge.JP Magazine : オープンソースの話題満載
2ちゃんねる : HandBrake 総合スレッド 12 Win
2ちゃんねる : HandBrake Mac版総合スレ
2ちゃんねる : HandBrake 総合スレッド 11 Mac
GUIでエンコードした時のエンコードオプションを調べる : Process Explorer

まずは使えるコマンドを調べるためにヘルプファイルをリダイレクトしてテキストに出力する。
HandBrakeCLI --help > HandBrakeCLI_help.txt 2>&1

基本のコマンド
HandBrakeCLI [options] -i -o

基本となる設定は出力解像度とフィルタを掛けるかどうか、映像エンコード設定、音声エンコード設定の4つである。

エンコードの目的を定める


エンコード設定を決める前にエンコードの目的を定める。目的次第では設定が変わりエンコード速度も大きく影響する。

  • 保存形態について
    .ts のままだと容量が大きすぎるので小さくして長期保存向けなのか、PC以外で再生するためにエンコードするのか、動画を見たら消すかどうか。

  • エンコードするPCスペックはどの程度か
    動画のエンコードに複雑な処理をする、つまり高負荷の設定にするとそれだけエンコード速度が遅くなってしまう。なのでそれに見合ったエンコード設定にする。

  • PCで見るか、PC以外で見るか
    PCで見る場合、それほどエンコード設定に制限はないが、携帯ゲーム機やスマートフォン、フィーチャーフォン、ガラパゴス携帯、携帯のメディアプレイヤーなど一部の設定で再生できないことがあるのでそれを回避しながら設定することになる。詳しい設定はそれぞれのデバイスごとに違うので「デバイス名 エンコード」で検索する。PC以外で再生する場合は下のコマンドだけだと音声が再生されない可能性が高いので、この記事の一番下の ffmpeg で映像と音声をコピーして再度MP4ファイルに出力する。

  • 容量に制限があるかどうか
    基本的にはエンコードの遅い設定にすれば容量が小さくなりたくさんの動画を持ち運べることになるが、それに見合ったエンコード時間かどうかは環境によって違うので、それほど容量に制限がないのならエンコード設定は軽めにした方がよい。

  • リサイズ(解像度を小さく)するかどうか
    これは動画を再生する環境依存の場合と、エンコード時間を早くする場合の2種類ある。前者の場合、大きい解像度では再生できなかったり、再生プレイヤー側の出力解像度以上に設定してもそれに見合った結果にならないことがあるため。後者は.ts 保存のままでは容量が大きすぎるために容量を減らすためと、そのエンコード速度を考慮して妥協できるところでリサイズする。

  • 逆テレシネするかどうか
    30/1.001fps に 24/1.001fps が混在する場合に、重複フレームを間引いて少ないビットレートで高画質化を図るかどうか。これをするとエンコード速度が結構遅くなるので動画を永久保存する場合を除いて、動画を手早く持ちだして見たら消す人には不要な設定。

  • インターレース解除するかどうか
    フレームに残る残像を消すかどうかの設定。エンコード速度はそれほど遅くならないので解除推奨。

  • 途中の映像をカットするかどうか
    残すシーンと残さないシーンが混在する場合に時間指定でエンコードする、または分割した動画を mp4box などで連結する方法。慣れれば作業時間は減らせるがコツをつかむのに時間がかかるので動画を手早く持ちだして見たら消す人は前後のカットに止め、途中のカットをしないほうがいい。

コマンドを実行するには cmd.zip を保存し HandBrakeCLI , ffmpeg と同じフォルダ内に解凍して、cmd を実行し、コマンドをコピペすればコマンドラインから HandBrakeCLI , ffmpeg を実行できる。

以上を踏まえてのコマンド例
HandBrakeCLI -e x264 --deinterlace fast --h264-profile main --modulus 2 -q 22 --aencoder copy:aac -i in.ts -o out.mp4

リサイズする場合 -w 横幅 -l 縦幅
HandBrakeCLI -e x264 --deinterlace fast --h264-profile main -w 512 -l 288 --modulus 2 -q 22 --aencoder copy:aac -i in.ts -o out.mp4

指定ビットレート以内でエンコードする場合 --vb 数値(kb/s)
この場合は crf(-q) エンコードではなく abr エンコードになる
HandBrakeCLI -e x264 --deinterlace fast --h264-profile main -w 512 -l 288 --modulus 2 --vb 800 --aencoder copy:aac -i in.ts -o out.mp4

逆テレシネにする場合 --detelecine
HandBrakeCLI -e x264 --detelecine --deinterlace fast --h264-profile main -w 512 -l 288 --modulus 2 -q 22 --aencoder copy:aac -i in.ts -o out.mp4

エンコード速度を早くする場合 --x264-preset fast, faster
規定値より fast、fast より faster の方がエンコード速度が早く、容量も大きくなる。
HandBrakeCLI -e x264 --detelecine --deinterlace fast --h264-profile main --x264-preset fast -w 512 -l 288 --modulus 2 -q 22 --aencoder copy:aac -i in.ts -o out.mp4

個別にx264の設定をする場合
-x オプション1=値:オプション2=値
HandBrakeCLI -e x264 --detelecine --deinterlace fast --h264-profile main --x264-preset fast -x b_pyramid=1:keyint=240:keyint_min=0 -w 512 -l 288 --loose-anamorphic --modulus 2 -q 22 --aencoder copy:aac -i in.ts -o out.mp4

OpenCL を使う場合 --opencl-support
何も指定しなければ OpenCL は使われない
HandBrakeCLI -e x264 --opencl-support --detelecine --deinterlace fast --h264-profile main --x264-preset fast -x b_pyramid=1:keyint=240:keyint_min=0 -w 512 -l 288 --loose-anamorphic --modulus 2 -q 22 --aencoder copy:aac -i in.ts -o out.mp4

指定時間で分割する場合
--start-at duration:秒 動画の開始何秒からエンコードするか
--stop-at duration:秒 上の開始時間から何秒エンコードするか
HandBrakeCLI -e x264 --detelecine --deinterlace fast --h264-profile main --x264-preset fast -w 512 -l 288 --modulus 2 -q 22 --aencoder copy:aac --start-at duration:10 --stop-at duration:5 -i in.ts -o out.mp4

フレームレートが異なる所を境に分割し、動画を連結する場合にはフレームレートを指定する。
-r フレームレート(5/10/12/15/23.976/24/25/29.97/30/50/59.94/60)
HandBrakeCLI -e x264 --detelecine --deinterlace fast -r 23.976 --h264-profile main --x264-preset fast -w 512 -l 288 --modulus 2 -q 22 --aencoder copy:aac --start-at duration:10 --stop-at duration:5 -i in.ts -o out.mp4

動画を連結する方法は、mp4box か AviUtl の MP4 Export もしくは Libav-SMASH Exporter を利用する

基本コマンド
MP4Box.exe -add "in1.mp4" -cat "in2.mp4" -new "out.mp4"

VFRな映像を連結する場合、.264 にfps を指定して音声とは別に連結し、別途一纏めになった音声をmuxする
mp4box.exe -add "in1.264":fps=23.976 -cat "in2.264":fps=29.97 -add "in.m4a":lang=jpn -new "out.mp4"

MP4box を各サイトからダウンロードする
Libav-SMASH Exporter は L-SMASH-Works を使う : POP@4bit
左上の「バイナリを選択」から保存する。

AviUtl の場合は追加読み込みを繰り返してエクスポートから MP4 Export もしくは Libav-SMASH Exporter を選択し出力ファイル名を決める。

分割するテクニック


映像のフレームレートが変更される所を境に無音になるのを利用して、それを目安に分割する方法がある。

AviUtl を使う場合には 無音&シーンチェンジ検索(chapter.auf)を利用して無音部分を調べることができる。

参考記事
rigayaの日記兼メモ帳 TMPGEnc MPEG Smart Renderer 4のCMカット

ffmpeg を使う場合には silencedetect を使う。一度ではうまく分割できないので無音時間を変えてみる。

ffmpeg : Zeranoe FFmpeg - Builds

基本コマンド
ffmpeg -f lavfi -i amovie=in.m4a,silencedetect -f null - > out.txt 2>&1
ffmpeg -i in.m4a -filter_complex silencedetect -f null - > out.txt 2>&1
ffmpeg -i in.mp4 -vn -filter_complex silencedetect -f null - > out.txt 2>&1

オプション設定
silencedetect=d=無音時間(秒)

詳しい設定方法 : FFmpeg documentation : : 5.25 silencedetect

.ts ファイルの無音検出し out.txt に出力するコマンド
ffmpeg -i in.ts -vn -filter_complex silencedetect -f null - > out.txt 2>&1

out.txt の読み方


silence_start: 7.87467
silence_end: 8.96 | silence_duration: 1.08533
silence_start: 787.971
silence_end: 788.992 | silence_duration: 1.02133

このように無音時間の開始秒(silence_start)と無音時間の終了秒(silence_end)、無音時間の秒数(silence_duration)が表示される。無音時間の開始と終了を本編の時間から分割する時間を推測する。これは推測なので無音検出の時間が短かったりして検出できなかったり、本編とそれ以外で共に無音時間が含まれると分割する時間が表示された時間通りにはならない。なのでコンマ何秒ごとにずらしながら本編の開始時間と終了時間を調べる必要があるが、一度設定が決まると同様の設定で本編とそれ以外の分割ができるようになるので2回目以降は楽になる。

分割する正確な時間を調べるには開始時間と終了時間をずらしながら5秒程度の動画を何回か出力する。本編の総時間は大抵決まっているので開始時間から逆算して終了時間を決めるが、そのまま開始から終了までエンコードすると時間を間違えた時に再度調べるのに時間がかかるので、今度は終了時間を定めてから開始時間をずらす。

例えば本編が 181.869秒から開始し、本編の総時間が 780秒の場合は以下になる
--start-at duration:181.869 --stop-at duration:780

しかし、上にようにエンコードすると時間がかかるので以下のようにエンコード時間を短くする
--start-at duration:181.869 --stop-at duration:5

終了時間を調べる場合、エンコード開始時間は(181.869 + 780 - 5)、総時間を5秒として確認しやすいように短い動画にエンコードする
--start-at duration:956.869 --stop-at duration:5

これで本編の動画の開始時間と終了時間がわかり、以下の様なコマンドになる
HandBrakeCLI -e x264 --detelecine --deinterlace fast -r 23.976 --h264-profile main --x264-preset fast -w 512 -l 288 --modulus 2 -q 22 --aencoder copy:aac --start-at duration:181.869 --stop-at duration:780 -i in.ts -o out.mp4

これでPCで再生できるMP4の動画が出来上がるが、PC以外で再生しようとすると音声が聞こえない場合が多い。試したのは Xbox360, PSP どちらも映像は流れるが音声は聞こえなかった。理由は音声フォーマットが「ER Parametric」になっているから。これを「AAC」に ffmpeg で変換する。

変換コマンド
ffmpeg -i out.mp4 -c copy -absf aac_adtstoasc out2.mp4

映像と音声をコピーして再度MP4ファイルに出力することでPC以外のデバイスでも音声が流れるようになる。
関連記事

この記事へのコメント

管理人のみ通知 :

トラックバック


ニコニコチャンネル始めました
ニコラボチャンネル
スポンサード リンク
THE IDOLM@STER THE@TER ACTIVITIES 03
THE IDOLM@STER THE@TER ACTIVITIES 03

Fate/EXTELLA REGALIA BOX for PlayStation (R) 4 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4
Fate/EXTELLA REGALIA BOX for PlayStation (R) 4 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4

妖怪ウォッチ くったりぬいぐるみだニャン ジバニャン
妖怪ウォッチ くったりぬいぐるみだニャン ジバニャン

Fate/EXTELLA VELBER BOX 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4
Fate/EXTELLA VELBER BOX 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4

Fate/EXTELLA REGALIA BOX for PlayStation (R) Vita 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS Vita
Fate/EXTELLA REGALIA BOX for PlayStation (R) Vita 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS Vita

【早期購入特典あり】初音ミクシンフォニー~Miku Symphony 2016~オーケストラ ライブ CD(初音ミクシンフォニー描き下ろしクリアファイル付き(ランダム配布))
【早期購入特典あり】初音ミクシンフォニー~Miku Symphony 2016~オーケストラ ライブ CD(初音ミクシンフォニー描き下ろしクリアファイル付き(ランダム配布))

「うたわれるもの 偽りの仮面&二人の白皇」歌集(初回限定盤)
「うたわれるもの 偽りの仮面&二人の白皇」歌集(初回限定盤)

TVアニメ『ラブライブ!サンシャイン!!』挿入歌シングル「想いよひとつになれ/MIRAI TICKET」
TVアニメ『ラブライブ!サンシャイン!!』挿入歌シングル「想いよひとつになれ/MIRAI TICKET」

『刀剣乱舞-花丸-』 歌詠集 其の三 特装盤
『刀剣乱舞-花丸-』 歌詠集 其の三 特装盤

本好きの下剋上~司書になるためには手段を選んでいられません~第一部 「本がないなら作ればいい3」
本好きの下剋上~司書になるためには手段を選んでいられません~第一部 「本がないなら作ればいい3」

新着記事と追記・編集記事
スポンサード リンク
ブログ内検索
プロフィール

Author:ロベルト
お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab
ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

カテゴリ
アクセスの多い記事
記事アーカイブ

最新コメント
リンク
ニコニコ静画
アニメカテゴリ毎時ランキング
免責事項
当ブログはリンクフリーです。記事によりトラブルが生じた場合でも、当ブログ管理人は一切の責任を負いません。 当ブログに記載されている情報の正誤や利用は、ご自身の判断でお願いします。 紹介したアプリケーションに関する問い合わせは作者に問い合わせてください。ニコニコ動画に関する質問はまずは公式掲示板、2ch、各Q&Aサイトを参照ください。
ブログの読者になる(RSS)
アクセス数