Avisynth + x265 で動画をエンコードするメモ

スポンサーリンク

 ここ最近、またエンコード環境を見なおそうと Avisynth + x264 エンコ関連で調べ事をしていた。すると、最近の x265 を用いたエンコードは最適化やら色々と進んでいるようでエンコード速度も上がったとあちこちで見かけた。自分の記憶だと 720p サイズでエンコをしても 1fps ちょいしか出なくて、とてもじゃないけど実用上厳しいと思って居た。どのコンテナに入れるか~って問題もあったし。
 それならちょっと試してみるかと Avisynth + x265 でテストエンコしてみた話しのメモ記事になる。


 先ずエンコードに必要なバイナリ群をかき集める面倒な作業がある。「これをやりたいけど、何が必要か」と 1 つずつ調べながらで結構ダルイ物があるけど、今現在 “興味が湧いている物に対して” は意欲的にやるのでまぁ良いかと。

 早速最初の問題にぶち当たる。それは、x265 を用いて動画をエンコードするバイナリには Avisynth のスクリプトファイルを入力ファイルとして渡して上げても読み込む事が出来ない。x264 であればそのまま渡せていただけにちょっと面倒。そこでちょっと調べると avs4x265 と言うツールが海外のフォーラムにあったので使って見たらやりたいことが出来た。
 動画のエンコードが出来れば、音声は分離した物を FAW で疑似 Wave 形式に変換。avs2wav で Trim コマンドに則ったトリミングが可能。トリミング後の疑似 Wave ファイルを FAW で AAC に戻して MP4 のコンテナに突っ込めば良い。
 次に当たった問題点は最終的に MP4 のコンテナに動画と音声を Mux する事。x264 環境では MP4box を用いていたが、x265 ではちょっと強引過ぎるのか上手く Mux 出来ず。代替案として L-SMASH を用いる事とした。実際に使って見た感じだと、MP4box より L-SMASH の方がお行儀が良い感じもするし、処理速度も速かったからこの点は x264 エンコにもフィードバックする事としたので現在では MP4box を使用して居ない。

 ダラダラと書いたけど、必要なバイナリは次の通りとなった。

  • avs4x265.exe
  • avs を元にフィルタ処理後の動画を x265.exe に引き渡すツール

  • x265.exe
  • 動画を x265 エンコするプログラム

  • avs2wav.exe
  • avs ファイルに定義した Trim コマンド通りに音声を Trim するツール

  • fawcl.exe
  • aac ファイルを疑似 Wave 形式に変換するツール

  • muxer.exe
  • Mux するツール。L-SMASH に同梱

  • remuxer.exe
  • Remux するツール。L-SMASH に同梱

 以上 6 点になる。
 x265.exe 及び muxer.exe, remuxer.exe を同梱する L-SMASH は次のサイトよりダウンロードが可能。
 rigayaの日記兼メモ帳
 こちらは非常に役立つ情報が多かったので重宝した。

 また、別途 TS ファイルから音声を分離する際に DGIndex が必要となる。主にソースファイルで配布されているので自分でビルドをしなくてはいけない。その際に参考とさせて頂いたのは次のサイト。
アニメとかエンコード関連の自分用メモとか DGIndex 1.58バグ対応

 実際に TS ファイルを x265 エンコする手順としては……

  1. DGIndex を用いて d2v の出力と aac 形式の音声ファイルへと分離
  2. 分離した aac ファイルを疑似 Wave 形式に変換
  3. d2v と疑似 Wav ファイルを avs スクリプトで読み込ませて CM カットやフィルタをかける
  4. 疑似 Wav ファイルを fawcle.exe を用いて aac ファイルに戻す
  5. avs4x265 を用いて x265 エンコを行う
  6. muxer.exe を用いて x265 エンコをした動画を MP4 に格納
  7. muxer.exe を用いて aac ファイルを MP4 に格納
  8. remuxer.exe を用いて MP4 に格納した動画, 音声を 1 つの MP4 に格納する

 上記手順で avs ファイルの編集に手作業が必要。主に CM カットや必要であればロゴ除去、インタレ解除等々。
 よって 1~2 をバッチファイルで自動化、4~8 をまた別のバッチファイルで処理して自動化するとかなり楽が出来る。

 1~2 をバッチファイルにした例としてサンプルぺたり。
 DGIndex の引数は TOKYO MX 用。放送局毎に異なる場合があるので各自で要調整。
 aac ファイルを疑似 Wave 形式に変換するとき、テンポラリパス内から aac ファイルを探して変換する。出力ファイル名は固定化しているので、複数の aac ファイルがある場合は問題が起こる。エンコード後に手動、若しくはバッチファイル内でエンコード処理後に削除若しくは “別フォルダへの移動” を推奨。

@echo off
:: プログラムパスの定義
set DGINDEX="D:\TS\Utils\DGIndex\DGIndex.exe"
set FAWCL="D:\TS\Utils\fawcl.exe"

:: テンポラリパスの指定
set TSTMP=D:\TS\temporary

:: DGIndex を用いて TS ファイルを動画と音声に分離
echo ** DGIndex for TOKYO MX1
%DGINDEX% -i %1 -o %TSTMP%\demux -ap 112 -vp 111 -pp 100 -om 2 -minimize  -exit 

echo.
echo ** AAC to WAV(fake)
:: テンポラリパス内に aac ファイルが複数あるとダメ。処理する 1 つだけにする事。
for %%1 in (%TSTMP%\demux*.aac) do %FAWCL% -s1 "%%1" %TSTMP%\faw.wav

 4~8 の手順をバッチファイルにした例としてサンプルをぺたぺた
 大体が環境変数の定義。パスは各自利用環境に合わせて書き換え推奨。
 avs4x265.exe は自身専用の引数と x265.exe の引数が必要。自分が使用したい x265 を用いる事が出来るので自分は 10bit 版をダウンロードしてきて使用している。
 mux 時には動画と音声ともにエンコードしたフレームレートを指定してやらなければ盛大に音ズレが発生するので要注意。この例では 24000/1001 として 23.976fps のままとしている。
 x265 エンコード自体のオプションは X265_OPT を弄れば良い。

@echo off
:: 実行ファイルが置かれているパス (「"」で囲わない)
set BIN=D:\TS\Utils

:: Avisynth スクリプトファイルへのフルパス (「"」で囲う)
set AVS="D:\TS\temporary\demux.avs"

:: チャプターファイルへのフルパス (「"」で囲う)
:: チャプター不要の場合、次行をコメントにする事。
set CHAP="D:\TS\temporary\chapter.txt"

:: 実行ファイル名の指定 (「"」で囲う)
set AVS4X265="%BIN%\avs4x265.exe"
set X265="%BIN%\x265_1.3+212_x86_16bpp.exe"
set AVS2WAV="%BIN%\avs2wav.exe"
set FAWCL="%BIN%\fawcl.exe"
set MUXER="%BIN%\L-SMASH\muxer.exe"
set REMUXER="%BIN%\L-SMASH\remuxer.exe"

:: エンコード及び Mux 時のオプション指定 (FPS 以外「"」で囲わない)
set FPS="24000/1001"
set AVS4X265_OPT=--x265-binary %X265%
set X265_OPT=--crf 20 --preset fast --tune ssim


:: 作業用テンポラリパス指定 (「"」で囲わない)
set TSTMP=D:\TS\temporary

:: ファイル名をユニークな物にする為に時間取得
set dt=%date:~0,4%%date:~5,2%%date:~8,2%
set tmTemp=%time: =0%
set tm=%tmTemp:~0,2%%tmTemp:~3,2%%tmTemp:~6,2%%tmTemp:~9,2%
:: MP4 出力ファイル名のフルパス指定
set MP4="%TSTMP%\!!comp%dt%%tm%x265.mp4"

:: x265 を用いた動画エンコード処理
%AVS4X265% %AVS4X265_OPT% %X265_OPT% -o %TSTMP%\x265enc.265 %AVS%

:: AVS に合わせた音声のトリミング及び変換処理
%AVS2WAV% %AVS% "%TSTMP%\editedWave.wav"
%FAWCL% "%TSTMP%\editedWave.wav" "%TSTMP%\final.aac"

:: Mux 処理 - 動画と音声をそれぞれ MP4 のコンテナに格納
%MUXER% -i "%TSTMP%\x265enc.265"?fps=%FPS% -o "%TSTMP%\265.mp4"
%MUXER% -i "%TSTMP%\final.aac"?fps=%FPS% -o "%TSTMP%\265.m4a"

:: MP4 の動画と音声の 2 つを MP4 のコンテナに格納
:: チャプターファイル指定の有無で条件分岐
if defined CHAP (
	%REMUXER% --chapter %CHAP% -i "%TSTMP%\265.mp4" -i "%TSTMP%\265.m4a" -o %MP4%
) else (
	%REMUXER% -i "%TSTMP%\265.mp4" -i "%TSTMP%\265.m4a" -o %MP4%
)

:: 中間ファイルの削除 (残したい場合はコメントする)
del "%TSTMP%\editedWave.wav" "%TSTMP%\final.aac" "%TSTMP%\x265enc.265"
del "%TSTMP%\265.mp4" "%TSTMP%\265.m4a" 

 この様な感じでエンコードしてみると、FX-8350@4.3GHz で平均 15fps 前後でエンコード可能だった。d2v ファイルの参照先は別 PC にあるから、I/O 的な物もありローカルに置くよりも若干遅めでもこれだけ速度が出る。一昔前であれば 720p でも 1fps 前後だったんでやっと実用的になってきたかなと。ただ、再生する側のサポートが不十分なんでそこを踏まえるとまだかな~とも思う。
 ちなみに x264 で “–preset fast –tune animation –crf 19 –threads auto” とした場合は 40fps 位でるんで速度面はまだまだ x264 に優位性がある。 ハズ。
0920_x265

 エンコード後の画質比較は絵的な問題やら知識が足りないやらで下手に行うよりも、他サイトを参照された方が良いと思われるので書かない。

* 2014/09/21 1:46 追記
 上の方法にてエンコした動画のプロパティを MediaInfo 0.7.70 で見たらこうなっていた。

全般
完全名称                                     : D:\TS\temporary\!!comp2014092100563246x265.mp4
フォーマット                                   : MPEG-4
プロファイル                                   : Base Media / Version 2
コーデック ID                                 : mp42
サイズ                                      : 389 MiB
ながさ                                      : 24分 0秒
OBR モード                                  : VBR モード
オーバルビットレート                               : 2 268 Kbps
エンコード日                                   : UTC 2014-09-20 16:30:48
タグ付け日                                    : UTC 2014-09-20 16:30:48

ビデオ
ID                                       : 1
フォーマット                                   : HEVC
フォーマット/情報                                : High Efficiency Video Coding
プロファイル                                   : Main 10@L3.1
コーデック ID                                 : hvc1
コーデック ID/情報                              : High Efficiency Video Coding
ながさ                                      : 23分 59秒
ビットレート                                   : 2 012 Kbps
幅                                        : 1 280 ピクセル
高さ                                       : 720 ピクセル
解像度                                      : 16:9
モード                                      : CFR モード
フレームレート                                  : 23.976 fps
ColorSpace                               : YUV
ChromaSubsampling                        : 4:2:0
BitDepth/String                          : 10 ビット
ビット/(ピクセル*フレーム)                          : 0.091
ストリームサイズ                                 : 345 MiB (89%)
使用したライブラリ                                : x265 1.3+212-54ad38a84a69:[Windows][MSVC 1800][32 bit] 16bpp
エンコードライブラリの設定                            : wpp / ctu=64 / tu-intra-depth=1 / tu-inter-depth=1 / me=1 / subme=2 / merange=57 / no-rect / no-amp / max-merge=2 / no-early-skip / no-fast-cbf / rdpenalty=0 / no-tskip / no-tskip-fast / strong-intra-smoothing / no-lossless / no-cu-lossless / no-constrained-intra / fast-intra / open-gop / interlace=0 / keyint=250 / min-keyint=23 / scenecut=40 / rc-lookahead=15 / bframes=4 / bframe-bias=0 / b-adapt=0 / ref=2 / weightp / no-weightb / aq-mode=2 / aq-strength=1.00 / cbqpoffs=0 / crqpoffs=0 / rd=2 / psy-rd=0.00 / psy-rdoq=0.00 / signhide / lft / sao / sao-lcu-bounds=0 / sao-lcu-opt=1 / b-pyramid / cutree / rc=crf / crf=20.0 / qcomp=0.60 / qpmin=0 / qpmax=51 / qpstep=4 / ipratio=1.40 / pbratio=1.30
エンコード日                                   : UTC 2014-09-20 16:30:48
タグ付け日                                    : UTC 2014-09-20 16:30:48

オーディオ
ID                                       : 2
フォーマット                                   : AAC
フォーマット/情報                                : Advanced Audio Codec
プロファイル                                   : LC
コーデック ID                                 : 40
ながさ                                      : 24分 0秒
ビットレートモード                                : VBR モード
ビットレート                                   : 252 Kbps
チャンネル                                    : 2 チャンネル
チャンネルの位置                                 : Front: L R
サンプルレート                                  : 48.0 KHz
ストリームサイズ                                 : 43.3 MiB (11%)
エンコード日                                   : UTC 2014-09-20 16:30:48
タグ付け日                                    : UTC 2014-09-20 16:30:48

メニュー
00:02:27.948                             : Chapter 01
00:12:03.990                             : Chapter 02
00:23:34.980                             : Chapter 03
スポンサーリンク