« libvorbisで高音質化したWebM対応ffmpeg | トップページ | AviUtl+拡張x264GuiEx v1.43でのニコニコ動画向けエンコード設定例 »

2010年5月28日 (金)

WebM公式サイトのDirectShowフィルターがv0.9.7.0にバージョンアップ。ソースも公開。

WebM公式サイトで5/24に
  「WebM/VP8 DirectShow Filters v0.9.6.0」
がリリースされてMuxerが改善されたよーという記事を書こうとしていたら、
いつのまにか5/26(日本時間だと5/27かな)に
  「WebM/VP8 DirectShow Filters v0.9.7.0
がリリースされていました。はえぇ。

当初のv0.9.5.0から改善されたところや、READMEにより新たに判明した点などもあるので、
今回はそのあたりを少し書いてみます。

 ----------------------------------------------------
  1.v0.9.6.0からインストーラがついた
 ----------------------------------------------------

  v0.9.5.0ではコマンドラインからregsvr32コマンドを実行してインストールする必要がありましたが、
  v0.9.6.0からインストーラ(install_webmdshow.exe)がついたので、楽にインストールできるようになりました。

  すでにv0.9.5.0をインストールしている人は、登録した古いDLL(webmsource.dll等)のある
  ディレクトリに移動した上で

regsvr32 /u webmsource.dll webmsplit.dll vp8decoder.dll vp8encoder.dll webmmux.dll

 
  を実行して古いフィルターの登録を解除してから、v0.9.7.0のインストーラを実行したほうがよいかも?
  (そのままインストールした場合にどうなるかは試していません)

  インストールされたDLLは
     C:\Program Files\Common Files\WebM Project\webmdshow
  に置かれるようです。
  アンインストールしたい時は、コントロールパネルの「プログラムの追加と削除」から。

 ----------------------------------------------------
  2.v0.9.6.0からREADME.txtがついた
 ----------------------------------------------------

  v0.9.6.0で、詳細なREADME.TXTが添付されるようになりました。

  これを読むと、やはりVorbis音声の再生にはffdshowを使うことになるようですね。
  Xiph.orgのDirectShowフィルターは、「Vorbis音声のエンコードをしたい場合に必要」と
  書いてありますので、デコーダーはWebM用としては使えないようです。

  ちなみにこのREADMEでは、
    「Vorbis音声の再生にはWindows Essentials Codec Packに含まれているffdshowを使っている」
  と書いてますが、個人的にはWECPはあまりオススメできません。
  自動更新が売りのはずなのに、昨年7月のリリース以来まったく更新していないように見えますし
  FLV Splitterが古いため、H.264/AVC+AACのFLVの再生ができないという話も聞きます。
  自分で使ったことはないので、実際にそうなのかどうかは確認していませんが。
  それに、Haali Media Splitterも最近重要な更新(edtsバグの修正等)を行なっていますので、
  WECPに含まれる古いものを使うのはオススメできません。

  特にコーデックパックなどを入れてないのなら、ffdshow tryoutsを単体で
  インストールして、オーディオデコーダーでVorbisを有効にしておけば良いと思います。
  また、Haali Media Splitterも、最新の2010/5/20版でWebMに対応していることですし、
  更新しておいたほうがよいでしょう。

  ついでに言うなら、FLV用のDirectShowフィルターについては、
  以前の記事で書いたように、MPC-HCのFLV Splitterと
  On2 Flixについてくるフィルターを併用するのがオススメです。

 ----------------------------------------------------
  3.各種フィルターの不具合修正や機能強化が行なわれた
  ----------------------------------------------------

  前の記事で書いたように、v0.9.5.0では「Xiph.org Vorbis Encoder」と
  「WebM Muxer Filter」を接続して音声をMuxしようとすると
  WebM Muxer Filterでエラーが発生していたのですが、
  v0.9.6.0では、このエラーは出なくなりました。
  WebMファイルの作成方法の1手段として利用できそうです。

  また、v0.9.5.0のリリース当初から「makewebm.exe」というDirectShowを利用した
  エンコード用プログラムが同梱されていたのですが、これまではオプション等も
  ほとんど設定できず、上記のMuxerの不具合などもあって、あまり意味がないものでした。
  しかし、v0.9.7.0では、これが大幅に強化されたらしく、
  VP8の細かいエンコードパラメータを指定することが可能になっているようです。
  makewebmだけでなく、各種フィルター自体も大幅に強化されたということなのかな?
  これについては下でもう少し詳しく書いてみようと思います。

  また、再生用にplaywebm.exeという簡易再生用のプログラムが同梱されており、
  出来上がったwebmファイルをこの実行ファイルにD&Dすれば、
  Active Movie Windowが立ち上がり、インストールしたDirectShowフィルターによって
  webmファイルが再生されるようになっています。
  オプションで再生に利用するDirectShowフィルターを切り替えることが可能です。
     -s ・・・ WebM Source Filter を利用
     -S ・・・ File Source(Async.)+WebM Splitter Filter を利用。
  なお、playwebm自体はv0.9.5.0の頃から入っており、特に機能強化はされていないかも。

 ----------------------------------------------------
  4.v0.9.7.0からDirectShowフィルターのソースが公開された
 ----------------------------------------------------

  v0.9.7.0から、DirectShowフィルターのソースファイルが同梱されるようになりました。
  まあオイラはソースなんぞ見れないんですけど、
  吉里吉里2のプラグインでWebMに対応しようとしている楓softwareさんなど、
  開発者の人にとっては嬉しいニュースだと思われます。

 ----------------------------------------------------
  5.v0.9.7.0のmakewebm.exeの使い方
 ----------------------------------------------------

  上で少し書いたように、同梱されているmakewebm.exeが大幅に機能強化され、
  VP8の細かいエンコード設定が可能になっているようです。
  2passエンコードは出来ないようですが、ivfencで指定できていたパラメータがいくつか指定できるようです。
  記事の最後に、makewebm.exe -hh で出力したヘルプを載せておきます。

  上述したとおり、makewebmはDirectShowフィルターを利用してエンコードを行なうものです。
  GraphStudioでイメージを示すと、以下のような形でグラフを生成し、エンコードとファイル生成を行ないます。

Makewebm

 
  なお、makewebmの使い方については、2点ほど注意が必要です。

  まず1つ目は、音声もエンコードしたいなら、
  Xiph.orgのDirectShowフィルター(oggcodecs)が必要ということです。
  oggcodecsに含まれている、Xiph.Org Vorbis Encoderフィルターが利用されます。

  2つ目は、入力ファイルの映像コーデックによってはエンコードできないということです。
  例えば、AVIファイルの場合、映像コーデックがDivXやVP6などの場合は問題ありませんが、
  無圧縮RGBやHuffyuv、UtVideoなどの場合は、

Unable to connect demux outpin to VP8 encoder filter inpin.

 
  というエラーが出て、エンコードに失敗します。
  (Huffyuvなどをffdshowでデコードしている場合はffdshowの出力設定にもよりますが。)

  これは、WebM VP8 Encoderフィルターが、入力色空間として
     YV12、I420、YUY2、YUYV
  の4種類しか受け付けていないからだと思われます。
  HuffyuvやUtVideoだと、AVI DecompressorがRGBで出力しようとするので、
  WebM VP8 Encoderフィルターと接続できず、エラーになるようです。
  DivXやVP6などはAVI DecompressorがYUY2で出力してくれるので問題ないようです。

Makewebmpoint

 
  入力できるのはAVIだけではありませんし、デコードは各自の環境にも依存するので、
  とりあえず上のエラーでエンコードに失敗するようなら、
  Avisynthを利用して、入力ファイルをYUY2かYV12にしたavsファイルを作り
  そのavsファイルをmakewebmの入力ファイルとして使ってやればよいと思います。

#avsファイルの例
AVISource("D:\HuffyuvRGB_PCM.avi")
ConvertToYV12()

 
  試しに、WebM公式サイトの「VP8 Encoder Parameter Guidelines」を見て
  「1-Pass Good Quality VBR Encoding」のパラメータ設定をmakewebmで再現(?)してみました。

  ※オプションを見て適当にあてはめていっただけなので正しいかどうかは自分でもよくわかってません。
    ivfencの例にある --minsection-pct と --maxsection-pct って、
    2パス用のパラメータらしいんですけど、なんで1パス用の設定で指定してるんでしょう?

 

■ivfencでの「1-Pass Good Quality VBR Encoding」のパラメータ
 ivfenc  input_1280_720_30fps.yuv output_vp8.ivf \
   --i420 -w 1280 -h 720 -p 1 -t 4 \
   --good --cpu-used=0 --target-bitrate=2000 --end-usage=0 \
   --timebase=1000/30000 -v \
   --minsection-pct=5 --maxsection-pct=800 \
   --kf-min-dist=0 --kf-max-dist=360 \
   --token-parts=2 --static-thresh=0 \
   --min-q=0 --max-q=63

 

■makewebmで同様の設定を目指してみた
 makewebm.exe -i D:\source_YV12.avs \
  --thread-count 4 --deadline good --target-bitrate 2000 \
 --end-usage VBR -v --keyframe-min-interval 0 --keyframe-max-interval 360 \
 --token-partitions 2 --min-quantizer 0 --max-quantizer 63 \
 -o D:\dest.webm

 
最後に、「makewebm.exe -hh」で出力したmakewebm.exeのヘルプを掲載しておきます。

usage: makewebm <opts> <args>
-i, --input   input filename
-o, --output   output filename
--deadline   max time for frame encode (in microseconds)
--decoder-buffer-size   buffer size (in milliseconds)
--decoder-buffer-initial-size   before playback (in milliseconds)
--decoder-buffer-optimal-size   desired size (in milliseconds)
--end-usage   {"VBR"|"CBR"}
--error-resilient   defend against lossy or noisy links
--keyframe-mode   {"disabled"|"auto"}
--keyframe-min-interval   min distance between keyframes
--keyframe-max-interval   max distable between keyframes
--lag-in-frames   consume frames before producing
--min-quantizer   min (best quality) quantizer
--max-quantizer   max (worst quality) quantizer
--require-audio   quit if no audio encoder available
--script-mode   print progress in script-friendly way
--target-bitrate   target bandwidth (in kilobits/second)
--thread-count   number of threads to use for VP8 encoding
--token-partitions   number of sub-streams
--undershoot-pct   percent of target bitrate for easier frames
--overshoot-pct   percent of target bitrate for harder frames
-l, --list print   switch values, but do not run app
-v, --verbose   print verbose list or usage info
-V, --version   print version information
-?, -h, --help   print usage
-??, -hh, --?   print verbose usage

The order of appearance of switches and arguments
on the command line does not matter.

Long-form switches may be abbreviated, and are case-insensitive.
They may also be specified using Windows-style syntax, using a
forward slash for the switch.

The input filename must be specified, as either a switch
value or as a command-line argument.

The output filename may be specified as either a switch
value or command-line argument, but it may also be omitted.
If omitted, its value is synthesized from the input filename.

The deadline value specifies the maximum amount of time
(in microseconds) allowed for VP8 encoding of a video frame.
The following distinguished values are also defined:
0 (or "best", or "infinite") means take as long as necessary to achieve best quality
1 (or "realtime") means real-time encoding
1000000 (or "good") means good quality (the default)

|

« libvorbisで高音質化したWebM対応ffmpeg | トップページ | AviUtl+拡張x264GuiEx v1.43でのニコニコ動画向けエンコード設定例 »

コメント

>HuffyuvやUtVideoだと、AVI DecompressorがRGBで出力しようとするので、WebM VP8 Encoderフィルターと接続できず、エラーになるようです。
そういう時はcolorspace converterなりffdshowのフィルターなりを入れて、RGB->YUVしてやればいいです。

投稿: | 2010年6月20日 (日) 16時42分

Color Space ConverterをGraphStudoでつなげようとしてみましたが、AVI Decompressorの出力とはつながってくれるのですが、
出力がRGB系のみとなり、YUV系が出てこないのでVP8 Encoderとうまくつながってくれないようです。
ffdshowについてはデコーダのコーデック設定のRawVideoで全RGB型を有効にしておき、
出力でYV12などのYUV系にチェックを入れておけばちゃんとVP8 Encoderとつながってくれるようですね。
この方法でmakewebmでもうまくエンコードできるようになるのを確認しました。ありがとうございます。

投稿: 金の髭 | 2010年6月28日 (月) 18時25分

>ivfencの例にある --minsection-pct と --maxsection-pct って、
>2パス用のパラメータらしいんですけど、なんで1パス用の設定で指定してるんでしょう?

「1-Pass Good Quality VBR Encoding」の設定から消えてる模様

ひげさんなら把握してそうだけど、ivfファイルはmkvtoolnixが対応したそうな。

投稿: Oyaji | 2010年6月30日 (水) 16時26分

すっかりblog放置してました・・・すみません。
ほんとだ、パラメータ消えてますね。間違いだったのですな。情報ありがとうございます。
mkvtoolnixについては自分もちょっとだけ使ってみました。
Rawなデータの作り方とかそのへんも含めたivfencの使い方を下書きしてみたもののまだ記事にできてなかったりします・・・。

投稿: 金の髭 | 2010年7月13日 (火) 12時18分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1278146/34927473

この記事へのトラックバック一覧です: WebM公式サイトのDirectShowフィルターがv0.9.7.0にバージョンアップ。ソースも公開。:

« libvorbisで高音質化したWebM対応ffmpeg | トップページ | AviUtl+拡張x264GuiEx v1.43でのニコニコ動画向けエンコード設定例 »