2013年3月1日金曜日

Mini-ITX PT3サーバ ~AviUlt エンコード編②~

さて、AviutlによるTSファイル→H264 AVC + AAC エンコード編第2弾です!

前に Mini-ITX PT3サーバ ~AviUlt エンコード編①~ と称して、「AACをFAW化して読み込むプラグイン」を用いてAACファイルを読み込んだ際に音声なしのmp4ファイルができてしまう問題に対処しました。
それから順調にエンコード作業の方は進んでいましたが、Aviultのエンコードって正直遅くないですか?8コアCPUを積んでるのに、マルチコアを生かせていない。そんな疑問が私にも浮かびました。では、今回のトラブルは以下の通りです。

【今回のトラブル】
AviUltのエンコードが遅く、全てのCPUコアを使い切っていない


今回のトラブルはこのようなものです。自分のAviUtlの環境を以下に示しました。

【AviUtl環境】
 >PCスペック(エンコード機)
  • 【CPU】AMD Phenom II X4 960T (6コア化済み, 3.6GHz OC)
  • 【RAM】DDR3-1600 4GB*2枚
  • 【M/B】MSI 890GXM-G65
  • 【VGA】AMD 890GX内蔵 Radeon HD4290
  • 【SSD】CFD CSSD-S6T60NTS2Q (SATA3, 60GB)
  • 【HDD】WD Caviar Blue (SATA2, 7200rpm, 160GB)
  • 【OS】Windows 7Pro x64

 >使用フィルタ
  • クリッピング&リサイズ
  • バンディング低減フィルタMT
  • 透過性ロゴ
  • エッジレベル調整 Ver0.7 【←今回の問題はここ

 >インターレース解除
  • 自動フィールドシフト

 >エンコーダ
  • x264guiEx.exe
  • fawcl.exe

【トラブルの見極め方】
このようなトラブルが起きている場合、エンコード中のCPU使用率が50%付近で上下して、コアの使用率が上がりません。


【トラブルの考察】
このトラブルを解決するには、自分が使っているAviUltのフィルタを見直す必要があります。どういうことかというと、使用しているフィルタがマルチスレッドでの処理に対応していないということです。AviUltの処理工程は分からないのですが、推測で言うと、動画をエンコードする際にAviUltは設定されたフィルタの効果を動画1フレームごとにかけながらエンコーダに渡してエンコードするようなものだと思います。このフィルタ処理プログラムが2つの並行処理までしか対応していない場合、AviUltの同時フィルタ処理数は2つまでになり、他のフィルタが多スレッド処理に対応していてもそこがボトルネックになるでしょう。
そういうわけで、私は1つずつフィルタを無効・有効にしてみてこのボトルネックを探しました。そうすると、エッジレベル調整 Ver0.7というフィルタを有効にしたときのみ著しくエンコード速度が低下しました。このエッジレベル調整 Ver0.7というフィルタが多スレッド処理に対応していないのが原因だと私は考えました。
しかし、このエッジレベル調整 Ver0.7は素晴らしいフィルタで、画像がくっきりし、なおかつノイズも生じにくいという逸品です。この場を借りて設計者の方に感謝を申し上げます。

【トラブルの解決法】
調べてみたところ、エッジレベル調整 MT ver 0.7というマルチスレッド処理に対応した全く同じフィルタがありました。掲載サイトへのリンクは貼れないので、どうかご自分で検索してみてください。

プラグイン名: edgelevelMT.auf

このaufファイルをAviUltのpluginフォルダに入れるだけです。設定などはエッジレベル調整 Ver0.7と全く同じです。なお添付のテキストファイルには、フィルタの設計者の方が作ったエッジレベル調整 Ver0.7を改良者の方がマルチスレッド化したものと書いてありました。

【結果】
エッジレベル調整 Ver0.7からエッジレベル調整 MT ver 0.7に変更したことで、エンコード時間が約半分まで短縮しました。すなわち、約24分のTSファイルをH264 AVC + AACにエンコードする際、エッジレベル調整フィルタ以外は同じ設定とすると、
エッジレベル調整 Ver0.7: 約2時間30分
 エッジレベル調整 MT ver 0.7: 約1時間20分
 まで短縮化できました。これでエンコードも捗りますね。

【余談】
インターレース解除には自動フィールドシフトプラグインを使っているのですが、自動フィールドシフトの設定に「スレッド」なるものを発見してしまいました。デフォルトでは「スレッド: 2」になってるのですが、この際にCPUスレッド数の6にしてみると、エンコードのfpsが向上しました。



このように、スレッド数の設定を確認してみるのも時間短縮化につながりますね。

それでは失礼します。

0 件のコメント:

コメントを投稿