DTV - FLV動画制作への道
サンプルが見つかりました。
初稿から4年、ひとまず完成かな? 最終更新:2010-03-07
このページ、なんのかんのちょこちょこ更新してるなあ…サマリーでも書いとくか。
- FLVの分類とFLV5に関する誤解
- TMPGEnc4.0 Expressによる埋め込み用FLV/H.264出力
このへんについて調べてる人には役立つかもしれない。
FLV動画のエンコード
たぶんFLash Videoの略なのだろう。ポテンシャルは秘めていたものの、初代FLV1は鑑賞目的としては正直使い物にならなかった。FLV4≒VP6は素晴らしい。いやニコニコ動画が偉大なのか。
分類
Flash Player910が対応しているのは次の3つ4つ。
- FLV1
- 採用コーデックはSorenson H.263、Sorenson Sparkとも呼ばれる。その名の通りSorenson Mediaが開発に関わってる、H.263のサブセット。もともと携帯端末のような低解像度での利用が前提なので、実用に耐えうるのはせいぜいQVGAまで。
- 2010-01-19追記:自分メモで書きだしたのだけれども、予想以上に見てる人が多そうなので念のため補足しとくと、FLV1としたのは文脈上、広義のFLVなのか狭義の(コンテナとしての)FLVなのかわかりにくくすることを避けるためで、もともとそういう呼び方をされていたかどうかは知らない。次のFLV4=VP6対応により相対的にSorenson Sparkがそう呼ばれるようになったのではないかと思うのだが・・・。
- FLV4
- 採用コーデックはOn2 TechnologiesのTrueMotion VP6、正確にはVP62R Heightened Sharpness Profile。実力はニコニコ動画でご存知の通り。
- FLV5
- H.264対応、になるのかな。同時にようやくオーディオストリームでMP3以外にPCM、ADPCM、AAC、HE-AACが利用できるようになった(FLV4でせめてAAC対応してほしかった)。
ぶっちゃけ、まんまMP4。 - 2009-04-08追記:H.264+AACを格納できるという点においてはMP4と同じだが、コンテナとしての互換性はない。つまり拡張子をMP4からFLVにしても無意味。詳しくは後述の気になることへ。
- MP4
- 中身が同じなのでMP4コンテナにも対応してみました、という感じ。ニコ動でうpできるのはこれ。
正直、同じ500Kbps程度ではFLV4も5も体感差はそれほどないと思われる(少なくともFLV1→4のような感動はない)。ただ音声にAACが使えることで、映像により多くのデータを振り分けることができるのがメリットではないかと思う。
ソフトウェア
おもなもの。
- Sorenson Squeeze
- TMPGEnc 4.0 Express with Movie Plug-in FLV4
- Riva FLV Encoder
- Flash Video Encoder
- Mencoder + VP6 VFW Codec
- ffmpeg ( + libFAAC )
ほかにもいろいろあるんだろうが。
Sorenson Squeeze
FLV1で採用されたH.263コーデックの開発元であるSorenson Mediaのエンコードスイート、Sorenson Squeezeを使ってSorenson Spark Pro(FLV1)とOn2 VP6(FLV4)の画質の違いを比較してみる。すべてソースはVOB(M2P 8000Kbps)でエンコード時に解像度を320x240512x384に設定。ビットレートは映像512Kの音声96K、フレームレートは15。動きの激しい部分は1分44秒、緩やかな部分は1分46秒、あと1分50秒くらいで一時停止すると比較しやすいと思われ。なお停止時のイメージは元ソースからなので注意。
曲はPerfumeのChocolate Disco、音量注意(ゲイン調整してない。
Sorenson Spark Pro 1pass CBR
まずはSorenson Sparkをテスト。1passのエンコード時間は実時間くらい。画質は鑑賞にはちょっと耐えられない。
Sorenson Spark Pro 2pass VBR
2passでもエンコード時間はVP6の1passとさして変わらない。画質は意外と悪くないもののブロックはけっこう目立つ。
On2 VP6 1pass CBR
続いてVP6。1passだとさほどクオリティは高くない。エンコード時間は実時間の倍程度。ブロックは止め絵にしなければそれほど気にならない。
On2 VP6 2pass CBR
さすがに2passではかなりエンコード時間が増えるものの、驚くべきクオリティ。ブロックもほとんど目立たない。
これだけで結論付けるのは危険だが、VP6は画質の低下よりもブロック化を極力避けることを重視する傾向があるように見える。また動きの少ないソースであればSorenson Sparkもなかなか使えそう。いずれにしても使うなら2pass。なおVP6はクソ高いライセンスを別途購入しないと画面上にロゴが入るようになっている。本体だけでも高いのに買えるかっての。
ほかにFLV4のエンコードソフトはSimple Mencoder Shell GUIとかいろいろあるようなのだけど、極力作業環境を統一したいので今後はTMPGEnc ExpressのFLVプラグインを導入することを検討中。
TMPGEnc 4.0 Express with Movie Plug-in FLV4
ダウンロード版の本体が9800円なのにプラグインだけで4980円はちょっと高いと思ったのだが、結局買ってしまった。だって楽なんだもの。反面、セッティングはあまりきめ細かくない。そこはときどき不満が出る。
ニコ動利用者などで高ビットレート対応を望む声をけっこう見かけるが、ウェブでの再生を目的としたエンコードの場合、ADSLな人のことも考ると映像+音声で5~600Kbps程度に抑えるべきだろう(だいたいそれ以上のビットレートを使うなら何もFLVである必要がなくなってしまうと思うのだ)。ただ、いかにVP6でも映像400K程度だとかなり画質が落ちる。そこでフレームレートをオリジナルの半分にしてあげるとお手軽に劣化を抑えることができる。なおPVであればソースのレートはたいてい29.97fpsなので、14.985fpsにしてやる。下手に15fpsなんかにするとエンコード時間がものすごく伸びるし、ときどき音ズレが発生したりとあまりよいことがなかった(元が30fpsなら15fpsでよい)。
解像度は今更QVGAはナンセンスだが、VGAだと画質への影響がそれなりに出る。512×384がバランスがよい(ただ全画面での見やすさが落ちる)。
音声はジョイントステレオの96kbps。データ全体のうち音声データの占める比率が高すぎなのだけど、いかんせんMP3ではこれ以下に落とすこともできない。それこそAACでも使えればよいのだけど、こればかりはFLV5対応を待つしかない。もっとも、音質がさほど問われないソース(競馬中継とか、な)ならサンプリング周波数を22.1KHzの48Kbpsくらいまで落としてもいいかも。
TM4EでFLV4エンコードサンプル
DVDソースからのエンコード。セッティングは映像512Kbpsの14.985fps + 音声96Kbs 44.1KHz MP3、2pass高画質。比較のためにMPEG2(8000Kbps 29.97fps + 384Kbps 48KHz MP2)も置いておく。
曲はparis matchのSUMMER BREEZE。
シャドウに強いVP6の特性上、今回のサンプルのように全体的に暗めの映像であれば破綻はほとんど生じない。逆にハイライト部はわりと乱れを確認できる。
TM4EでFLV5MP4エンコードサンプル
将来的にPSPなどのポータブル機器とのマルチユースを想定するとH.264/MPEG-4 AVC+AACでエンコードできることが望ましい。またFLVは所詮コンテナであり、FLV5の実態はMP4である。TM4EはMPEG4に標準対応しているのだから、最初からH.264+AACでエンコードしてやればよい。ファイルの拡張子はFLVでもMP4でも構わないだろうが、MP4にしておいたほうが視認上都合がよいだろう。なおFLV5対応はFlash Player Ver9以降。
2009-04-09追記:FLV5とMP4にコンテナとしての互換性はない。FLV5の詳細は現在調査中(Ver.10の仕様書を読みかじっているが、FLVTAGとかMP4には明らかに存在しない項目があるので、やはり別モノなのだろう)、とりあえず【ニコニコ動画】FLV/MP4エンコードスレ 46【質問】の>>481から20レスくらいが参考になる。中身が同じかつFlash Player9がMP4コンテナにも対応していることで、俺も含めFLV5=MP4という誤解が広まったのかもしれない。せいぜいFLV5≒MP4ということで。
そんなわけで、セッティングは512x384、512kbps、14.985fps、96Kbs、48KHz、メインプロファイルを使用してエンコードしてみた。
VP6と同等かそれ以上のクオリティに見えるが、輝度の高い部分はH.264のがキレイ。かつ、全画面にした際の違和感も少ない。余談だがVP6はどうも指定したビットレートからの推定値に対して生成ファイルサイズが若干大きくなる傾向があるのだけど、H.264はほぼ理論値に近いサイズに収まる。ただ、プログレッシブダウンロードの再生にならない(読み込みながら随時再生ではなく、ダウンロードし切ってから再生になってしまう)のが気になる。プロファイルをBaselineにしたらいいのかしら。
…ファイルがキャッシュに残ってると事実上プログレッシブ再生状態になるので、比較したい人は面倒でもキャッシュをクリアしてからどうぞ。
2009-04-09追記:Flash Player9はMP4コンテナに対応しているので再生自体は可能なのだが、プログレッシブ再生とならないのはMP4とFLVにコンテナの互換性がないことが原因のようだ。じゃあどうやってFLV5にしたらよいのかは後述のffmpegで。
音声コーデックはAAC-LCなら128~160KbpsでMP3とは比べ物にならない高音質を得られる。PVならこれ。映像優先であればHE-AACでさらに低ビットレートに挑戦したいところだが、残念ながらTM4Eは未対応。
頼みの綱、ffmpegを使ってMP4をFLVに変換する
バイナリ持ってる前提だが、いろんなところで紹介されてるので各自入手しる。試しにこんな感じで出力させてみた。
ffmpeg -i sample.mp4 -vcodec copy -acodec copy sample.flv
ffmpegは特に出力フォーマットの指定(-f)がない場合には拡張子を見てコンテナを決めているようなので、出力ファイルの拡張子は必ずflvにしておく。引数-*codecの値をcopyにしてやるとストリームをそのままコピー、つまりコンテナに互換性がなくても格納ストリームが同じであれば無劣化で変換できるはず(入力と出力を逆にすればFLV5→MP4も無劣化変換できるわけ)。
なおffmpegはバージョンによって引数等が異なるので自分でも確認しる。今回俺が使ったのはあべちん氏のバイナリ、FFmpeg rev.18302(Core2最適化版)。
Seems stream 0 codec frame rate differs from container frame rate:
29.97 (54000000/1801799) -> 14.99 (15000/1001)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sample.mp4':
Duration: 00:04:57.70, start: 0.000000, bitrate: 610 kb/s
Stream #0.0(eng):
Video: h264, yuv420p, 512x384 [PAR 1:1 DAR 4:3],
14.99 tbr, 14.99 tbn, 29.97 tbc
Stream #0.1(eng):
Audio: libfaad, 44100 Hz, stereo, s16
Output #0, flv, to 'sample_.flv':
Stream #0.0(eng):
Video: libx264, yuv420p, 512x384 [PAR 1:1 DAR 4:3],
q=2-31, 1k tbn, 14.99 tbc
Stream #0.1(eng):
Audio: libfaac, 44100 Hz, stereo, s16
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
(略)
video:18553kB audio:3498kB global headers:0kB muxing overhead 1.447414%
小さいファイルなので2秒くらいで終わった。念のためInputとOutputでStream #0.0とStream #0.1の内容が同じになってるか確認しておく。曲は元ちとせの「いつか風になる日」の拾いもの。
今度はちゃんとプログレッシブ再生される。やはりコンテナの問題だったようだ。なお、元ファイルの音声のサンプリング周波数を48KHzにしていても44.1KHzに強制変換されたので完全に無劣化とはいえない(これは恐らくFLVの仕様であろう、というかffmpegが賢い)。
この程度の変換ならコマンドラインのほうが楽と思うのだけれども、ffmpegには携帯動画変換君ほか多くのフロントエンドがあるので、面倒な人はそちらを使えばよい(引数の互換性には注意)。
いっそffmpeg単体でよいのでは?
最新はどうか知らないが、ffmpegはすっぴんの状態ではAACはデコードのみとなっているので(サンプリング周波数のトランスコードはできるようだが)、自力でlibFAACなりのライブラリを含めてコンパイルし直すか、携帯動画変換君のような追加済みのバイナリ探してくるか、俺みたく一旦MP4作って無劣化変換の二度手間かますか、音声にMP3を使うかの四択と思われる。
なおVP6のエンコードには対応してるので、FLV4なら問題ない(ならmencoder_vp6set使え)。
…気になること
Adobeのサポートを読み解くと、Sorenson SparkとVP62の格納コンテナはFLV、H.264(+AAC)をサポートしたコンテナはF4V(ffmpeg未対応)となっている。つまりFLV5≒F4Vと考えてもよい。というか、これまで調べた限り、Adobe自身はFLV4とも5とも呼んでないっぽい。いったいFLV5はどこから出てきたのか?と思ったら、WikipediaのFlash Videoの項にFourCCにおける映像コーデック識別子とある(ほんとか?FOURCCのサイト見ても載ってないのだが…)。そんなわけで、冒頭の説明は微妙におかしい。
Flash Videoのフォーマット
- FLV
- Solenson Spark及びOn2 VP62をサポートしたコンテナ。FourCCはそれぞれFLV及びFLV4らしい。音声に使用できるのはMP3。
- F4V
- H.264をサポートしたコンテナ。FourCCは
FLV5らしいAVC1。音声に使用できるのはAAC。アルファチャネル及びキューポイントはサポートしない。
これで少しすっきりした。従来のFLVコンテナに代わりMP4コンテナが採用されている
というWikiのFLVの記述(※現在は修正されている)を信じたばっかりにえらく混乱してしまった。やはり大事なことは自分で調べないといけない。
なお、SWF形式の独自の埋め込み型プレイヤーでの再生サポートについてはパブリッシュしたFlashなどのバージョンに依存するが、基本的にプレイヤーのそれと同じと考えてよい(SWFファイルのパブリッシュバージョンが9以降であればH.264をサポートしている、ということ)。
2009-07-22追記:いちおう補足しておくと、YouTubeのコンテンツなんかを見る限り、MP4自体がプログレッシブ再生未対応というわけではないと思う。恐らくJW FLV Playerの問題なのだろう(コンテナはサポートしてるがプログレッシブ再生には対応してない、みたいな)。
2010-01-19追記:本件について俺にはもう情熱が残ってないのだが、ありがたいことにgoldenhige氏がさらなる追及をされていた。FLV5はOn2 VP6 with alpha channelのために予約されていたようだ。これでH.264/AVCのFLVは少なくともFLV5ではないことがわかってスッキリ。詳しくは「H.264/AVCのFLV」を「FLV5」と呼んではいけない理由を参照されたし。
謎は残ってる。手元にあるffmpegはF4Vには未対応なので、変換したファイルのコンテナはFLVのはずだが問題なくプログレッシブ再生できてしまっている。それが目的でいろいろ調べていたのだから結果オーライではあるものの、原因がわからないままというのはどうにも気持ちが悪い。拡張子が異なるだけで格納フォーマット自体は同じというわけでもあるまいし。
なんとなく解決。というか理屈は理解できた。インデックス情報がファイル末尾にあるからで、これを前にもってこないと「全部ダウンロードするまで再生できない」という状態なのだな、考えてみりゃ単純な話。インデックス情報の格納場所がMP4の仕様で規定されてなくてエンコーダによって任意だったりするのかな。んでさっきの設定でffmpeg通してFLVにしてやるとヘッダにくる、ってことかしら(コンパイルや環境依存かもしれんので鵜呑みにしないこと)。
TM4EでMP4というかH.264+AACにおけるプログレッシブダウンロードについて
ちゃんとAdobeに解説があったよ!
注:H.264ビデオファイルをプログレッシブダウンロードとして再生する場合に重要なのは、moov atomをファイルの先頭に配置することです。このように配置しないと、ファイル全体をダウンロードしてから再生を開始する必要があります。 moov atomは、ファイル全体のインデックス情報を保持しているファイルの一部です。 Adobe PremiereやAfter Effectsなどのツールでは、この情報はファイルの末尾に配置されてしまいますが、アドビは、CS3ビデオ作成ツールの将来のアップデートでこの問題を修正するよう作業を進めています。
残念ながらTM4EによるMP4エンコードではmoov atomつまりインデックス情報の配置に関する指定ができないようなので(※大嘘だった!)、対応してくれるまではffmpegなりでFLVコンテナに変換するか、TM4Eはフロントエンドに徹してVFAPIで配置の指定ができるアプリと連携させる、なんて方法を取らないといけないようだ(もちろんTM4E使わない、という選択もあるが俺はものぐさなのでなるだけエンコ環境変えずに楽したいのだ)。
参考:Flash Playerにおける高解像度H.264ビデオおよびAACオーディオのサポートについての説明
悪いがそのためだけにFlash CS3なんてとてもとても。moov atomの配置変更だけやってくれるツールなんてないかなあ(AIRにはあるらしい)。
…ひょっとしたらと試しにもう一回、ffmpegを通してみた。ffmpeg -i Salyu_atarashii_YES_HD.flv -vcodec copy -acodec copy Salyu_atarashii_YES_HD.mp4 (※実際には改行は入りません)これでmoov atomが先頭の状態が維持されるなら幸いなのだが。曲はSalyuの「新しいYES」、解像度はちょっと奮発して1280x720。
('A`)やっぱりだめぽ。鯖側でMP4Box使うしかないのかなあ…
YAMB included MP4Boxを通してみる
…そんなわけで、鯖側にMP4Box組み込もうかと思ったものの、たぶんx264とかffmpegあたりの組み込みとか、いろいろ事前作業がめんどくさそう。Windows環境で使えそうなものをちょっと調べたらYAMBという携帯向け動画ツールにMP4Boxが含まれてるようなので、これを使ってみた。なおデフォルトでMP4Boxが組み込まれているのはインストーラ版のほうらしい(ZIP版は自分でインスコ)。
とりあえず起動して、[作成]→[MP4作成]で開くウインドウで、Inputに元のMP4ファイルをぶちこんでみる(Outputは適当にリネームするなりしる)。作成というか変換処理は一瞬で終了。
おお!ついにMP4コンテナでのプログレッシブ再生に性交成功した!何かに勝利した気分だ!ところでこの映像、5D mark2あたりで撮ったのかな。被写界深度がやたら狭いシーンが多々ある。
そんなわけで、俺手順としては
- ソースファイル入手
- TM4EでMP4エンコ
- YAMBでmoov atomをファイル先頭部分に移動
- (゚д゚)ウマー
となった。これでFLVと決別できるかな?
出力コンテナの見直し
いや完全に見落としだ。MPEG-4出力設定で出力コンテナに[標準]ではなく[iPod ビデオ]を選んでやるだけで、ちゃんとmoov atomがファイル先頭に配置されるようだ。なお[3GPP]でもいけそうなものだが、ダメだった。
曲は冨田ラボ「あの木の下で会いましょう feat.安藤裕子」、調子に乗ってこいつも1280x720のハーフレートでエンコード。
今までの苦労はなんなんだ。これでようやく、TM4E単体で(゚д゚)ウマー、となった。最初からサポートに聞けってな。まあ、おかげでいろいろ余計な知識を貯め込むことができたわけだし、そもそもFLVに疑問を抱かなければMPEG-4での出力コンテナ選択の違いがmoov atomの配置に影響するなんてわかるはずもなく。Yambだって膨大な数のMP4ファイルをいちいち再エンコせずにatomの配置替えできるツールと思えば入れとく意味ある。と何事にも前向きな、はじめ男爵である。そうでも考えんとやってられんわ。
あと何か気になることがあるとすれば、埋め込み再生時に一瞬コマ落ちするようなことが多いので、その対処。落ちるのは映像だけなのでフレームレートとIフレームの間隔とか、そのへんが影響してるのかなあ。でもローカル再生時には何の問題もないのだよ。となるとやっぱりFlash側なのかねぇ…。
Main ProfileとHigh Profileの比較
帯域に限界のあるウェブ埋め込みでの再生に関してはあまり高いビットレートを設定できないのでMain Profileで特に問題はないのだが、ローカル保存用となると話が違ってくる。当初H.264は高ビットレートに見合った画質向上がそれほどなく、ぶっちゃけMPEG2にも劣っていた。これに我慢ならなかったパナソニックの中の人が業を煮やして開発したのがHigh Priofileである。
参考:本田雅一のAVTrends「PHLにおけるMPEG-4 AVC/H.264エンコーダ開発の今」
そんなわけで、とりあえずDVDソースからの比較をしてみようかと思ったのだが、もはやFLVとは関係ない次元なので、ここではさわり程度に留める。試しに720x480のMPEG2 のPV(5分)をH.264 High、1440x1080、フルレート59.97fps、16Mbps~レートが倍なので1フレームあたりの情報量はハーフレートの8Mbps相当である~でエンコードしたら1時間半掛った。俺のマシンもそこそこのスペックのはずなのだが、HDクラスのエンコードは相応のマシンが要求されるぞ、と。ちなみに画質のほうだが、俺のモニタの解像度がSXGA(1280x1024)なので、その状態の全画面でしか比較した感じでは動画では差はわからなかった。静止画にした際に元ファイルは無理やり伸ばした感じが若干わかるけれども、後者のほうが自然だった程度。再生時間の20倍かけるほどのものではない。もちろん元ソースがHD等であればはっきりとした差がでるのだろうが、2Mbps程度で使う意味はほとんどないと思われる。
Riva FLV Encoder
H.263、つまりFLV1のみ対応。昔は重宝されたけどフリーでFLV4エンコできるツールも増えたし、今更これを使う必要はないと思う。
Flash Video Encoder
今やAdobeさんのお取り扱いになってしまった本家FlashにもFLVエンコード機能がある。当たり前か。まず普段使いすることはないと思いつつも比較実験のために405MBという嫌がらせのような体験版CS3を落としてみる。
・・・おれの環境では重くて使い物にならなかった。
mencoder_vp6set
最近知った。Mencoderのコマンドシェルみたいなもの。その名の通りVP6=FLV4にエンコしてくれる。解凍するとMencoder本体とVP6 VFW CodecのDLLなどのほか、ニコ動向け?サンプルバッチ(512*384の16対9&4対3)が同梱されてるのでまずはこれで動きを試してみるとよい。バッチの中身を見るとけっこういろいろパラメータをいじれることがわかる。とりあえずニコ動やYouTubeにうpできりゃいい、って人には大変便利であろう。なおMencoderはMPlayer付属のツールであるが、フロントエンドにはSMSG(Microsoft .NET Framework v2必須)やiriverterなどいろいろあるので好きなのを使うとよい。
補記
FLVに関しては本家Adobeの英語の仕様書くらいしか信頼できそうな情報を見つけられなかった。前述のようにWikiの記事もあやふやだし(英語版WikiのFLVの項にはFLV4だの5といった記述はない)、それどころか“FLV5”でググって二番目にヒットするのがこのページなんて狂ってるとしか思えない(つか、うちのサイトで最もPVがあるのがこのページというあたり、みな混乱しているのがよくわかるな)。普及させようというのなら日本語ドキュメントくらい用意しる(俺がもっと英語読みこなせればいいだけの話)。
そんなわけで、Gooooooogle大先生なんかでたどり着いた人も、ここに書いてある情報もそのまま鵜呑みにせず、自分で調べるなり試してみてほしい。その結果間違いや新たなことがわかったらそれをブログなり2ちゃんなりにフィードバックしてくれると俺としてもいろいろ書いた甲斐があったというものだ(ピュア。
・・・個人的な見解を言わせてもらうと、(今となっては)AdobeがFLV5に関する混乱をどこまで把握してるか知らないが、すでに言葉が一人歩きしてしまった以上、使われてるのまるで見たことないOn2 VP6 with alpha channelの替わりにH.264/AVCなFLVのFourCCをFLV5とするよう働きかけてもよいのではないか?と思ってしまった。それで困る人などほとんどいないだろうし、On2と協議の上、実情に合わせ融通を利かせるくらいの気配りがほしい。そうでないなら「H.264/AVCなFLVはFLV5じゃねーよハゲ」「おまいらAVC1て知ってますのかね」くらいのことを公式にアナウンスしろよ。