「H.264/AVCのFLV」を「FLV5」と呼んではいけない理由
今回は、前回のエントリで、
「映像がH.264/AVCでエンコードされたFLVを「FLV5」と呼ぶのは間違い」
と述べた根拠等について、詳細を書いてみます。
まあ、ちょっと追加しただけなので、内容はまとめ記事とあまり変わりませんが・・・。
自分もよくわからないまま「FLV5って何ぞや」と思って調べていった内容ですし、
推測の部分もあるので、間違っていたらツッコミをお願いします。
調査にあたっては、B地区exさんの「FLV動画のエンコード」の記事がとても参考になりました。
この場で感謝申し上げます。
まず、FLVコンテナの仕様を規定しているのは、Adobe社です。
現時点で最新の仕様書は、Adobe社の「FLV/F4V Technology Center」にある
「Video File Format Specification Version 10」
となっています。
また、「SWF Technology Center」にある
「SWF File Format Specification Version 10」
にも、FLVの各ストリームの細かい仕様などが書かれています。
この仕様書の中では、FLVで使用できる映像コーデックの種類が以下のように規定されています。
FLV規定の CodecID | コーデック名 |
---|---|
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 |
しかし、これらの仕様書の中には、「FLV5」はもちろんのこと、
「FLV1」「FLV4」といった表現すら出てきません。
では、「FLV1」や「FLV4」という呼び方はいったい何なのでしょう?
ポイントになるのは、Adobe社が規定している内容は
「FlashPlayerで再生するためのFLVというコンテナフォーマットの規定」
だということです。
しかし、FLVが動画ファイルフォーマットである以上、
「FlashPlayer以外の一般プレイヤーでFLVを再生したい」
という要望が出てくるのは当然です。
一般プレイヤーとは、例えばWindows Media Playerとかですね。
一般プレイヤーの多くは、WindowsのDirectShowという仕組みを使って動画などを再生します。
DirectShowでの動画ファイルの再生の仕組みを大雑把に言うと、
1.動画ファイルから、スプリッターで映像ストリームと音声ストリームを分離
2.分離した各ストリームをデコーダーでデコードし、出力デバイスに渡す
という感じになります。図で表すと、以下のようになります。
そのため、
「FLVをDirectShowで再生するための、スプリッターやデコーダー」
の開発が進められました。
スプリッターやデコーダーの開発を行なっていったのは、Adobe社ではなく、
●FFmpeg(libavcodec)
●ffdshow (現在はffdshow tryouts)
●Gabest氏のFLV Splitter (guliverkli、Guliverkli2、MPC-Homecinema)
といったオープンソースプロジェクトが中心だったのだと思います。
(この他にも個人や企業で開発されていたかもしれませんが。)
開発にあたって、映像ストリームを適切なデコーダーに振り分けるために、
「映像ストリームを圧縮しているコーデックの識別子」
いわゆる
「FourCC(Four Character Code)」
と呼ばれる識別子が必要になるということで、FLVでサポートされている各コーデックに
対応したFourCCを決めることになり、その結果決められたFourCCが、
「FLV1」「FLV4」「VP6F」「VP6A」
なんだと思います。
どのグループが決めたのかとか、決めた経緯などは調べても全くわかりませんでしたが、
これらのFourCCについては、
●FLV1
FLVで使われている「Sorenson H.263」は、通常のH.263とは仕様が少し異なるので、
既存のFourCCを使うことはできず、専用のFourCCとして「FLV1」が用意された。
●FLV4(VP6F)
FLVで使われている「VP6」の映像ストリームは、映像の上下が反転しているので、
"VP62"といった既存のFourCCを使うことはできず、
専用のFourCCとして「FLV4」「VP6F」が用意された。
●VP6A
FLVの「VP6 with Alpha Chnannel」は、通常のVP6では扱えない
アルファチャンネルを含んだ映像ストリームとなるため、
専用のFourCCとして「VP6A」が用意された。
ということなんだと思います。
このへんの詳細は、また別エントリでまとめてみたいところです。
さて、本題に戻ります。問題なのは「FLV5」についてでした。
ここまでの流れを踏まえて考えると、
●FLV仕様書でCodecID=7と規定されているAVC(H.264)コーデックについて、
スプリッターやデコーダーの開発のために新しいFourCCを用意する必要があったのか?
●そしてそれは"FLV5"だったのか?
というのがポイントになります。
H.264/AVCコーデックは、
ITU-T: H.264
ISO/IEC: ISO/IEC 14496-10「MPEG-4 Part 10 Advanced Video Coding」
として標準化されたコーデックです。
そのFourCCにはいくつかバリエーションがあるようですが、Apple社の「AVC1」が代表的なのかな。
そうなると問題は、
「FLVに含まれるAVC映像ストリームに、"AVC1"というFourCCをそのまま使ってもよいのか」
という点になります。
そしてその答えは、
「"AVC1"をそのまま使っても問題なし」
だったのでしょう。
実際、Gabest氏のFLV Splitterでは、「AVC1」というFourCCでデコーダーに渡しています。
標準化された技術をそのまま採用しているわけですから、当然といえば当然ですね。
FLV4のように上下反転してるとか、そういう問題もなかったということなのでしょう。
以上により、
「映像がH.264/AVCでエンコードされたFLVを"FLV5"と呼ぶ理由はない」
ということになります。
また、まとめの記事にも書いたとおり、On2 Flix Proに含まれている、
「On2 Flv Splitter Filter」では、FLVのコーデックIDとFourCCを、
以下のように関連づけしています。
FLV規定の CodecID | コーデック名 | FourCC |
---|---|---|
1 | JPEG (currently unused) | - |
2 | Sorenson H.263 | FLV1 |
3 | Screen video | FLV3 |
4 | On2 VP6 | FLV4 |
5 | On2 VP6 with alpha channel | FLV5 |
6 | Screen video version 2 | 未対応 |
7 | AVC | 未対応 |
見てわかるとおり、「FLV5」は、「On2 VP6 with Alpha Channel」のために使用されています。
つまり、
「映像がH.264/AVCでエンコードされたFLVを"FLV5"と呼んではいけない。
"FLV5"は"On2 VP6 with Alpha Channel"のためのFourCCとして使われている。」
ということになります。
さらに、FFmpegやffdshowで「VP6A」が使われていることを踏まえると、
FLV5=VP6A
ということにもなるのかな・・・。
もっとも、「On2 VP6 with alpha channel」のことをFLV5と呼んでいるのはOn2社だけな気がするので、
何とも微妙なところですが・・・。
まあ、「On2 VP6 with Alpha Channel」が使われる機会は少ないですし、
FLV5についての間違った認識がある程度広まってしまってる以上、
「FLV5」という表現はなるべく使わないほうがよいと思います。
でもそうなると、「H.264/AVCのFLV」を呼ぶための簡単な呼称がなくなりますね。
あえて作るなら「FLV7」ということになるんでしょうが、そんなFourCCがあるわけでもないし、
「AVC-FLV」とでも呼んだほうがいいのかもしれませんね。
| 固定リンク
この記事へのコメントは終了しました。
コメント
いつも読ませていただいているのですが、大変参考になります!
私の知識では何かを指摘したりとかできないのですが、
これからも更新がんばってください!!
正式な略称が存在するのかどうか分かりませんが、
「AVC-FLV」という呼び方でいいかもしれませんね。
投稿: SELF | 2009年10月26日 (月) 00時25分
ありがとうございます。
とりあえず「FLV5」という呼び方はあまり広まらないほうがいいなと思って書いたエントリですが、
自分の調査や知識不足なところもあるかもしれないので、なかなか自信をもって書けないのがつらいところです。
なるべく根拠を明確にしながら書いていきたいと思いますので、何かありましたらよろしくお願いいたします。
投稿: 金の髭 | 2009年10月26日 (月) 00時48分