うちのCPUは合計8コアも(!)あるんだけど、全てのコアを有効に活用してエンコードできていないので、2コアの場合に比べてそれほどエンコード速度を向上できなかった、というのが
前回の記事です。
理由としては、AviUtlに使用しているフィルタが8スレッドには対応していないってところ。
ソフトウェアがマルチスレッドに対応していない限り、マルチコアCPUの真価が発揮できないわけ。
ところが今回ボクが思いついた「分割同時エンコード」方法を使えば、ビックリするぐらいエンコード速度を向上できる。
原理としては、AviUtlを複数個同時に動かして、手動でマルチスレッド化するだけです。
やり方の流れは以下の通り。
1.AviUtlをマルチスレッド化したい数だけコピーする。それぞれAviUtl(1)とかAviUtl(2)と呼称する。
2.AviUtl(1)で、クリップ、CMカット、フィルタの適用、動画・音声のコーデックの設定をしておいて、プロジェクトを保存する。
3.AviUtl(2)で上記のプロジェクトを開く。
4.AviUtl(1)で前半部分を選択しておく。AviUtl(2)で後半部分を選択しておく。
5.AviUtil(1),(2)ともにエンコードをスタートする。それぞれ出力ファイル名を変えておく。
6.AviUtil(1),(2)ともにエンコードが完了したら、出力されたファイルを結合して完了。
4つとか、8つとかにしたい場合は、その数だけAviUtlをコピー&起動して、動画もその数だけ分割すればいいよ。
この方法の肝は、1つの動画ファイルを複数個に分割して、同時にエンコードをすることにあります。
マルチコアを有効に使うには、同時に沢山のプログラムを走らせればいいとよく言われてますし、同時にエンコードすればいいとは良く聞く話。
でも、そんなに複数の動画を同時にエンコードする機会ってあんまりないし、それよりも1つの動画を速くエンコードできるようになった方が良い!
ってことで、今回の「分割同時エンコード」を思いついたのだった。
どのぐらい速くなるかを測定して、グラフにしてみた↓
エンコード条件:
対象:大正野球娘。第2話(24:29)
フィルタ:WarpSharp,Nonlinearsharpen,prefilter for nonlinersharpen, Dedot, 自動フィールドシフトVF
x264, MP3
分割しないで普通にエンコードした場合
157分
2分割してエンコードした場合
92分
(内訳:92分、89分)
4分割してエンコードした場合
72分
(内訳:72分、72分、70分、60分)
分割エンコードでは、全てのAviUtlのエンコードが同時に完了しないので、最も遅いものに最終的なエンコード時間が支配されます。
なので、結果には最も遅かった時間を記載し、内訳としてそれぞれの分割AviUtlの時間を記載しました。
分割なしに比べれば、2分割ではエンコード時間を40%削減できました。
4分割なら50%削減。
僕の環境では、確かに2分割よりも、4分割した方がわずかに速くなりますが、4分割するための手作業時間が結構かかるので、2分割でエンコードするのが最適な気がします。
あと、普通のPC環境だと、4分割同時エンコードはメモリを食いすぎちゃって実行不能になるかもしれません。
んで、分割エンコードのやり方をハードコピーつきで微妙に説明してみる。
AviUtl(1)で前半部分を選択してエンコードする。
分割点は、AパートとBパートの境目でもいいし、ちょうど半分の点でもいい。
結合した時に分割点で動きがおかしくなるとかってことは今のところ確認されていませんので、お気軽に。
AviUtl(2)で後半部分を選択してエンコードする。
AviUtl(1)よりも1コマ進めたところからエンコードすればいいんだよ。
2つのAviUtlを同時にエンコードしているところ。
CPU使用率は66%になってるな。
ちなみに分割なしのエンコードだと40%ぐらいだ。
メモリ使用量は3GB超えてるな…。まあ、64bit環境が必要になるかもしれません。
気をつけなきゃいけないのは、バッチ出力でエンコード終了時にウインドウズを休止するっていうのを選ぶ場合は、遅くなる方に休止チェックを入れること。
先にエンコードが終わった側で休止しちゃうと、後の方のエンコードが止まっちゃうので。
ついでに4つ同時エンコード。
CPU使用率は93%!
メモリ使用量は5GBを超えてます。
んで、全部のエンコードが終わったら、結合する。
AviUtlにそれぞれのファイルを順番に読み込む。
このとき、フィルタは全て無効にしておかないと、二重にフィルタがかかっちゃう。
AVI出力のときに、ビデオ・オーディオとも「再圧縮無し」にチェックを入れること。
すでに圧縮されてるしね。
んで、結合中の画面。
結合は数十秒で終わります。
もしも時間がかかるようであれば、フィルタが有効になっていたり、再エンコードされてたりするので設定を見直しましょう。
あと、同時複数エンコードをする場合の注意点を列挙しておく。
・AviUtl本体自体を複数コピーするだけでなく、設定ファイルやフィルタとかもコピーしておく。フォルダごとコピーしておくのがいいと思う。
・メモリをいっぱい食うので、メモリの増設しておく方がいいかも。64bitOSを使ってドーンとメモリを入れれば?僕はWindows7 RC版を使っていたり。
・分割点では映像の乱れは発生しないと思うけど、不安な人は画面の切り替え点で分割すれば?
・分割点の取り方で、最終的なエンコード時間が変わります。前半、後半でちょうどエンコード時間が一緒になる点が最適だ!でも、せいぜい数分しか違わないだろうから、まあ適当に。
・AviUtl本体、フィルタ、エンコーダそれぞれも出来るだけマルチスレッド対応の設定にしておいた方が、きっと幸せになれる(気がする)
- 関連記事
-