« FLVの「On2 VP6 with alpha channel」(VP6A)の仕様等について | トップページ | DirectShowでFLVを再生するために必要なものの導入手順 »

2010年1月13日 (水)

DirectShowでFLVを再生するための仕組み等について

Windows Media Playerなどの一般プレイヤーの多くは、
動画や音声ファイルの再生にDirectShowという仕組みを利用しています。
DirectShowでFLVファイルを再生できるようにするためには、
  1.FLVコンテナから映像ストリームや音声ストリームを取り出すスプリッター
  2.取り出したストリームをデコードするデコーダー
といった「DirectShowフィルター」が必要になります。

これらのDirectShowフィルターが内部フィルターとして含まれているプレイヤーもありますが、
内部フィルターは、そのプレイヤーでしか効果がありません。
一般プレイヤーでの再生はもちろんとして、DirectShow経由での編集ソフトへの読み込みなども
行なえるようにするには、汎用的なDirectShowフィルターをシステムにインストールする必要があります。

このエントリでは、代表的なFLVスプリッターやデコーダーについての
調査結果(中途半端ですが)や、その導入方法などを書いてみます。

なお、スプリッターやデコーダー、各種コーデックなどがひとまとめになった、
  K-Lite Codec Pack
  CCCP(Combined Community Codec Pack)
  WECP(Windows Essentials Codec Pack)
といった「コーデックパック」と呼ばれるものもあります。
よくわからなくても、これらをインストールしておけばたいていのファイルはうまく再生できるようになるでしょう。
ですが、個人的にはコーデックパックは余計なものを色々入れてしまうので嫌いです。
そのためここでは、これらがインストールされていないことを前提として話を進めます。
インストールしている場合は、競合しておかしくなったりする可能性もありますのでご注意ください。
 

 
では、スプリッターの導入とデコーダーの導入について、順に解説していきます。
なお、筆者のPCのOSは、Windows XP SP2です。
Windows7とかだと事情がちょっと変わってきたりするかもしれないのでご注意下さい。

■代表的なFLVスプリッターについて

  以下に、主なFLVスプリッターと、それに含まれるDirectShowフィルターの一覧を示します。
  (一部のものにはデコーダーも含まれています)
  なお、メリット値というのはそれぞれのフィルターの優先度のようなものです。

各種FLVスプリッターに含まれているフィルタ名と、そのメリット値
FLVスプリッターフィルタのファイル名含まれるDirectShowフィルタの名前メリット値
Guliverkli
(2006.3.20 v1.0.0.1)
FLVSplitter.ax FLV Splitter 00600000
FLV Source 00600000
Flash Video Decoders
(2006.5.3 v1.0.0.1)
FLVSplitter.ax  FLV Splitter 00600000
FLV Source 00600000
FLV Video Decoder 00600000
Guliverkli2
(2009.4.28 v1.0.0.5)
FLVSplitter.ax  FLV Splitter 00800001
FLV Source 00600001
FLV4 Video Decoder 00400000
MPC-HC StandAloneFilters
(2009.8.26 v1.3.1249.0)
FLVSplitter.ax MPC - FLV Splitter (Gabest) 00600000
MPC - FLV Source (Gabest) 00600000
On2 Flix Pro
(2008.12.2 v8.545)
flvsplit.dll
flvdecvp6.dll
On2 Flv Splitter Filter 00800000
On2 Video Decoder Filter 00800000

  このうち、上の4つ(FLVSplitter.ax)は、いわゆる「Gabest系のFLVスプリッター」です。
  よく知りませんがGabest氏を中心として開発が行なわれてきたものなのかな?
  見ての通り、上の3つは古いバージョンですので、今更使う必要はないでしょう。
  最新のMPC-HCプロジェクトのものを使うのがよいと思います。
  MPC-HCプロジェクトは、
     「MediaPlayerClassic - HomeCinema
  という有名なオープンソースのメディアプレイヤーを開発しているプロジェクトです。
  プレイヤーだけでなく、プレイヤーでも採用されている様々なDirectShowフィルターを詰め合わせた
  「StandAloneFilters」というパッケージの中に、FLVSplitter.axが含まれています。
  x64版のDirectShowフィルター等も、MPC-HCプロジェクトで開発されています。

  一番下の「On2 Flix Pro」は、VP6コーデックを開発したOn2 Technology社の製品です。
  製品自体はエンコードソフトなのですが、その中にFLV再生用のDirectShowフィルタが含まれています。
  有償(249ドル)の製品ですが、メールアドレスを登録すれば30日間のデモ版をダウンロード可能です。
  また、デモ期間が終わっても、FLV再生用のDirectShowフィルタは、そのまま使い続けることができます。
  VP6コーデックの開発元だけあって、優れたデコーダーも含まれています。

 
■各FLVスプリッターのコーデック対応状況

  FLVフォーマットでは、様々な映像・音声コーデックがサポートされています。
  以下に、FLV仕様書v10に載っている映像コーデックおよびサウンドフォーマットの一覧を示します。

Video File Format Specification Version 10」で
定義されている映像コーデックとサウンドフォーマット
映像コーデックサウンドフォーマット

1: JPEG (currently unused)
2: Sorenson H.263
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel
6: Screen video version 2
7: AVC

※4,5,6はFlash8以降
※AVC(H.264)はFlashPlayer 9.0.115.0以降

0 = Linear PCM, platform endian
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16-kHz mono
5 = Nellymoser 8-kHz mono
6 = Nellymoser
7 = G.711 A-law logarithmic PCM
8 = G.711 mu-law logarithmic PCM
9 = reserved
10 = AAC
11 = Speex
14 = MP3 8-Khz
15 = Device-specific sound

※0は非推奨とされている
※7,8,14,15は内部予約番号
※AACはFlashPlayer 9.0.115.0以降
※SpeexはFlashPlayer 10以降

  しかし、現在のところ、全てのコーデックに対応したFLVスプリッターは見当たりません。
  上で挙げた各FLVスプリッターのコーデック対応状況を以下に示します。
  いくつかのスプリッターにはデコーダーが含まれていますので、それについても対応を示しました。
  調査にはWindowsSDKに含まれているGraphEditを使用しました。
  (WindowsSDKはサイズが1GBくらいあるので、フリーソフトのGraphStudioを使うのもよいですね。
   メリット値の変更など、GraphEditにはない機能も備わっていますし。)
  ただ、自分が調べられる範囲でしか調べていませんし、エンコードに使ったソフトなどの条件によっては
  対応しているコーデックでもうまく再生されない可能性もあります。参考程度ということで。

各種FLVスプリッターのコーデック対応状況
機能(※1)GuliverkliFlashVideo
Decoders
Guliverkli2MPC-HC
StandAloneFilters
On2 Flix Pro
スプリッター          映像  2 Sorenson H.263
(FourCC=FLV1)

(FourCC=FLV1)

(FourCC=FLV1)

(FourCC=FLV1)

(FourCC=FLV1)
3 Screen Video × × × ×
(FourCC=FLV3)
(※2)
4 On2 VP6 ×
(FourCC=FLV4)
(VP6-S等の
振り分けは不可)

(FourCC=FLV4)

(FourCC=FLV4)

(FourCC=FLV4)
5 On2 VP6
with
  alpha
  channel
×
(FourCC=FLV4として
振り分けを行なうため
アルファは無視される)
(VP6-S等の
振り分けは不可)

(FourCC=FLV4として
振り分けを行なうため
アルファは無視される)

(FourCC=FLV4として
振り分けを行なうため
アルファは無視される)

(FourCC=FLV5)
7 AVC(H.264) × ×
(FourCC=AVC1)

(FourCC=AVC1)
×
音声    1 ADPCM(※3) × × ×
2 MP3
3 LinearPCM
(LittleEndian)
× × × ×
6 Nellymoser(※3) × ×
10 AAC × × ×
デコーダー 映像 FLV4(VP6F)
(FourCC=FLV4,VP62)
(VP6-S等の
デコードは不可)

(FourCC=FLV4)
(VP6-S等の
デコードは不可)

(FourCC=FLV4)
(※4)
VP6A
(FourCC=FLV5
として受け付け、
アルファも処理する)

※1・・・検証できたもののみ記載。ScreenVideo v2やSpeexなどについてはサンプルが入手できなかったため未検証。
※2・・・FLV3として振り分けているが、この呼び方はOn2独自だと思われるため、対応するデコーダーは多分無い。
※3・・・ADPCMとNellymoserについては、VP6F+MP3のFLVの音声をffmpegでADPCMやNellymoserに変換したFLVで確認。
※4・・・On2 Video Decoder Filterは、Gabest系のFLV Splitterとは接続できないため、
     「FLV4の抽出をGabest系のスプリッターで行なって、デコードだけOn2 Flix Proで行なう」ということはできない。

 
■どのFLVスプリッターを導入すべきか?

  「On2 Flix Pro」に付属する「On2 Flv Splitter Filter」はH.264/AVCや、AACに対応していません。
  Youtubeなどでは「H.264/AVC+AAC」という形式のFLVが使われていますし、
  それらに対応しているMPC-HC版のFLVスプリッターは導入しておいたほうが良いと言えるでしょう。

  しかし、「On2 Flix Pro」にも、
     1.優れたVP6デコーダーが含まれている
     2.VP6Aをアルファチャンネルつきでデコードできる
  というメリットがあります。
  まあこれらはスプリッターではなくデコーダーである「On2 Video Decoder Filter」の機能なのですが、
  「On2 Video Decoder Filter」は、スプリッタとして「On2 Flv Splitter Filter」の使用を前提としているため、
  「On2 Video Decoder Filter」だけを導入しても使えません。

  そんなわけで、ここでは
     「MPC-HC版のFLVSplitter.axと、On2 Flix Proの両方を導入する」
  という使い方を推奨します。

  この2つのスプリッターは共存可能です。
  On2 Flix Proの「On2 Flv Splitter Filter」のほうがメリット値が高いので優先して使用され、
  それで対応できないものについてはMPC-HC版が使用されることになります。
  主なFLVの処理について大雑把に言うと、
     ・「FLV1+MP3」「FLV4+MP3」は、On2 Flix Proの「On2 Flv Splitter Filter」で処理
     ・「H.264/AVC+AAC」はMPC-HC版の「FLV Splitter」で処理
  という形になります。(詳細は後述)

  ただし以下のようなデメリットもありますので、On2 Flix Proを導入するかどうかは
  これらの条件を各自で天秤にかけて考えたうえで決めるとよいと思います。
  (厳密に調べたわけではないので、他にもメリットやデメリットがあれば教えてください。)

  ●MPC-HC版とOn2 Flix Proを併用する場合

    ◎メリット

      ○FLV4(VP6F)の安定再生
        On2 Flix Proには高性能なFLV4デコーダーが含まれています。
        ffdshowだと、VP6Fのデコード時におかしなノイズが混じったりすることもありますが、
        On2 Flix ProはVP6コーデックの開発元が作った製品ですので、そのようなことはありません。
        また、うちの環境では、ffdshowだとカクついてしまうような重いFLVでも、
        On2 Flix Proならスムーズに再生可能でした。

      ○VP6Aのアルファチャンネルを読み込むことができる

    ◎デメリット

      ○映像コーデックと音声コーデックの組み合わせの自由度がやや低くなる。(詳細は後述)
       (ただし一般的なFLVは「FLV1+MP3」「FLV4+MP3」「H.264/AVC+AAC」という組み合わせなので
        それらの再生については特に問題ない。)

  ●On2 Flix Proを導入せず、MPC-HC版だけを使う場合

    ◎メリット

      ○映像コーデックと音声コーデックの組み合わせの自由度がやや高い(詳細は後述)

    ◎デメリット

      ○FLV4(VP6F)のデコードにはffdshowを使うことになるが、その場合品質が低く負荷も高い。

      ○VP6Aのアルファチャンネルが無視される

 
■正常に再生できる映像コーデックと音声コーデックの組み合わせ

  あるFLVを再生する場合、映像コーデックと音声コーデックの組み合わせによっては、
     「映像だけが再生され、音声が再生されない」
     「音声だけが再生され、映像が再生されない」
  という現象が起きることがあります。
  これはスプリッターだけでなく、「対応するデコーダーが存在するかどうか」といった問題も絡んできますが、
  とりあえずスプリッターが対応している組み合わせでなければ、正常に再生することはできません。
  また、MPC-HC版とOn2 Flix Proを併用するかどうかによっても、対応できる組み合わせは変わってきます。

  以下に、On2 Flix Proを併用する場合としない場合、それぞれで対応できる組み合わせを記述します。
  繰り返しになりますが、以下の表はあくまでもスプリッターレベルでの対応状況であり、
  実際に正常に再生するには、それぞれのコーデックに対応したデコーダーが必要です。
  (確認できた範囲のみ記載しています。ScreenVideo v2やSpeexなど未検証のコーデックは省略。)

MPC-HC版とOn2 Flix Proとを併用した場合に
映像・音声が両方とも正常に再生される
コーデックの組み合わせ

映像コーデック音声コーデック
2: Sorenson H.263
4: On2 VP6
5: On2 VP6 with alpha channel
2 = MP3
3 = Linear PCM, little endian
6 = Nellymoser
7: AVC(H.264) 1 = ADPCM
10 = AAC

※例えば「AVC(H.264)+MP3」という組み合わせのFLVを再生しようとすると、
     「メリット値が高いOn2 Flv Splitterは、映像コーデックのAVCの振り分けには対応していないが、
      音声コーデックのMP3には対応しているため、映像は無視してMP3音声だけを抽出して振り分けを行なう。」
  という挙動になってしまい、映像が再生されない。

On2 Flix Proを導入せずMPC-HC版だけを使用した場合に
映像・音声が両方とも正常に再生されるコーデックの組み合わせ
映像コーデック音声コーデック
2: Sorenson H.263
4: On2 VP6
5: On2 VP6 with alpha channel
7: AVC(H.264)

※ただしOn2 VP6 with alpha channeはアルファ無効
1 = ADPCM
2 = MP3
6 = Nellymoser
10 = AAC

 
■FLV用のデコーダーについて

  さて、FLVスプリッターについては上記の2つを使用することにしましたが、
  FLVスプリッターの仕事はあくまでも映像ストリームと音声ストリームを取り出すだけですから、
  今度は取り出したストリームをデコードする「デコーダー」が必要になります。

  上で説明したように、MPC-HC版のFLVSplitter.axには、デコーダーはついていません。
  On2 Flix Proには、FLV4(On2 VP6)とVP6Aをデコードできるデコーダーがついていますが、
  その他の映像や音声については、それぞれのコーデックに応じたデコーダーを導入してやる必要があります。

  デコーダーとして一般的によく利用されているのが、
     「ffdshow tryouts
  です。
  上記ホームページからダウンロードできる「「Beta6(2008/12/21版)」は、ちょっと古くてバグもあるので、
  SourceForgeのffdshow tryoutsプロジェクトページに行って、比較的新しいファイルを使ったほうが良いと思います。
  私の場合、現時点では、「ffdshow_rev3119_20091027_clsid.exe」を使用しています。
  今だともっと新しいバージョンが出ていますので、それを使ったほうがよさそうですね。

  ffdshowは、
     ・VFW(Video for Windows)の各種映像コーデック(エンコーダー、デコーダー)
     ・各種DirectShowフィルタ(デコーダー、映像処理フィルタ、音声処理フィルタ等)
  などを、ひとつのプログラムとしてまとめたものです。
     「個別のコーデックやフィルタをシステムにインストールするのではなく、
      ffdshowという1つのプログラムをコーデックやフィルタとして登録し、
      エンコードやデコードなどの処理を行なう。
      VFWコーデックやフィルタそのものをシステムにインストールした場合は、
      それを無効にするにはアンインストールやレジストリの操作が必要になることが多いが、
      ffdshowではプログラムの設定画面から簡単にそれぞれのコーデックや
      処理フィルタなどの機能をON/OFFすることができる。」
  という便利なものと考えればよいと思います。
  なお、ffdshowにはスプリッターは含まれていません。

  さて、ffdshowでFLVのデコードを行なうためには、以下の設定をしてやる必要があります。

    ●「ビデオデコーダーの設定」→「コーデック」で、以下の設定を行なう

       1.「形式」が「H.264/AVC」の「デコーダー」の部分を「libavcodec」にする。
         (ffmpeg-mtでもよいかも)

       2.「形式」が「FLV1」の「デコーダー」の部分を「libavcodec」にする。

       3.On2 Flix Proを使わない場合は、「形式」が「VP6F」の「デコーダー」の部分を「libavcodec」にする。
         (On2 Flix Proを使う場合は「無効」でよい)

    ●「オーディオデコーダーの設定」→「コーデック」で、以下の設定を行なう

       1.「形式」が「AAC」の「デコーダー」の部分を「libfaad2」にする。

       2.「形式」が「Other ADPCM」の「デコーダー」の部分を「libavcodec」にする。
         (音声にADPCMを使ったFLVはあまり見かけないので無効のままでもよい)

       3.「形式」が「Nellymoser」の「デコーダー」の部分を「libavcodec」にする。
         (音声にNellymoserを使ったFLVはあまり見かけないので無効のままでもよい)
 

■FLVの再生

  上記のインストールおよび設定を行なうことで、DirectShowでFLVを再生できるようになります。
  ためしにWindows Media PlayerでFLVを再生してみて、再生できれば成功です。
  また、DirectShowで再生できるようになれば、AviutlやNiVEのDirectShow入力プラグインを使って
  FLVファイルをそれぞれのソフトで読み込むことが可能になります。
  (FLVをDirectShowで編集ソフトに読み込むのが良いことかどうかは別として)

  なお、記事の最初にも書いたとおり、プレイヤーによっては内部フィルターが使われることもあるため、
  上で導入したMPC-HC版のFLVSpliter.axや、On2 Flix Proのフィルターが使われるとは限りません。
  内部フィルターを使っても良いとは思いますが、そうしたくない場合は内部フィルターをオフにすることも
  できると思いますので、各自で調べてみるとよいと思います。
 
 
書いておいてなんですが、解説が変に細かすぎて、導入手順がよくわかりませんね・・・。
手順だけ別にまとめなおしてみるかな。(´・ω・`)

 (2010.1.14追記)
   導入手順だけまとめ直しました。
      →DirectShowでFLVを再生するために必要なものの導入手順

|

« FLVの「On2 VP6 with alpha channel」(VP6A)の仕様等について | トップページ | DirectShowでFLVを再生するために必要なものの導入手順 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: DirectShowでFLVを再生するための仕組み等について:

« FLVの「On2 VP6 with alpha channel」(VP6A)の仕様等について | トップページ | DirectShowでFLVを再生するために必要なものの導入手順 »