FLV動画のエンコードサンプルが見つかりました。初稿から9年、まさかこんな長きに渡ってテコ入れすることになるとは。Expressによる埋め込み用FLV/H.264出力ffmpegでFLVとMP4の無劣化変換その他配信向けのポイントこのへんについて調べてる人には役立つかもしれない。Videoの略なのだろう。ポテンシャルは秘めていたものの、初代FLV1は鑑賞目的としては正直使い物にならなかった。FLV4≒VP6は素晴らしい。いやニコニコ動画が偉大なのか。Player910が対応しているのは次の3つ4つ。Sparkとも呼ばれる。Mediaが開発に関わってる、H.263のサブセット。携帯端末のような低解像度での利用が前提なので、実用に耐えうるのはせいぜいQVGAまで。2010-01-19追記:自分メモで書きだしたのだけれども、予想以上に見てる人が多そうなので念のため補足しとくと、FLV1としたのは文脈上、広義のFLVなのか狭義の(コンテナバージョンとしての)FLVなのかわかりにくくすることを避けるためで、もともとそういう呼び方をされていたかどうかは知らない。Sparkがそう呼ばれるようになったのではないかと思うのだが、H.263とは別にFLV1というFourCCも存在する。H.263のCodecIDは2だったりして、ややこしい。実力はニコニコ動画でご存知の通り。FLV5H.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が使えることで、映像により多くのデータを振り分けることができるのがメリットではないかと思う。ソフトウェアおもなもの。)ほかにもAviuUtilにいろいろ突っ込むなりあるんだろうが。ニコ動とか、配信先を特化したツールについてはあんまり詳しくないので割愛するよ(2005年執筆当時のツールもそのまま載せてるので「そんなのもうねえよ!」とかいわれても知らん。EncoderH.263、つまりFLV1のみ対応。昔は重宝されたけどフリーでFLV4エンコできるツールも増えたし、今更これを使う必要はないと思う。Encoder今やAdobeさんのお取り扱いになってしまった本家FlashにもFLVエンコード機能がある。普段使いすることはないと思いつつも比較実験のために405MBという嫌がらせのような体験版CS3を落としてみる。・・・おれの環境では重くて使い物にならなかった。mencoder_vp6set最近知った。Mencoderのコマンドシェルみたいなもの。その名の通りVP6=FLV4にエンコしてくれる。CodecのDLLなどのほか、ニコ動向け?サンプルバッチ(512*384の16対9&4対3)が同梱されてるのでまずはこれで動きを試してみるとよい。バッチの中身を見るとけっこういろいろパラメータをいじれることがわかる。動やYouTubeにうpできりゃいい、って人には大変便利であろう。v2必須)やiriverterなどいろいろあるので好きなのを使うとよい。一時期仕事で使ってた。VP6(FLV4)の画質の違いを比較してみる。8000Kbps)でエンコード時に解像度を320x240512x384に設定。ビットレートは映像512Kの音声96K、フレームレートは15。動きの激しい部分は1分44秒、緩やかな部分は1分46秒、あと1分50秒くらいで一時停止すると比較しやすいと思われ。停止時のイメージは元ソースからなので注意。Disco、音量注意(ゲイン調整してない。1passのエンコード時間は実時間くらい。画質は鑑賞にはちょっと耐えられない。VBR2passでもエンコード時間はVP6の1passとさして変わらない。画質は意外と悪くないもののブロックはけっこう目立つ。1passだとさほどクオリティは高くない。エンコード時間は実時間の倍程度。ブロックは止め絵にしなければそれほど気にならない。CBRさすがに2passではかなりエンコード時間が増えるものの、驚くべきクオリティ。ブロックもほとんど目立たない。これだけで結論付けるのは危険だが、VP6は画質の低下よりもブロック化を極力避けることを重視する傾向があるように見える。Sparkもなかなか使えそう。いずれにしても使うなら2pass。VP6はクソ高いライセンスを別途購入しないと画面上にロゴが入るようになっている。本体だけでも高いのに買えるかっての。ExpressのFLVプラグインを導入することを検討中。FLV4MPEG1/2のエンコードで定評のあるペガシスの有償ソフト(以下TM4E)。Squeezeの出番は消滅した。ダウンロード版の本体が9800円なのにプラグインだけで4980円はちょっと高いと思ったのだが、結局買ってしまった。反面、セッティングはあまりきめ細かくない。そこはときどき不満が出る。Squeezeは同時に複数のコーデック&異なるビットレートで大量エンコ、なんて場合には便利と思う。H.264でダイジェスト、の組み合わせしか考えられないのでTM4Eで十分。動利用者などで高ビットレート対応を望む声をけっこう見かけるが、ウェブでの再生を目的としたエンコードの場合、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ソースからのエンコード。MP3、2pass高画質。MP2)も置いておく。シャドウに強いVP6の特性上、今回のサンプルのように全体的に暗めの映像であれば破綻はほとんど生じない。逆にハイライト部はわりと乱れを確認できる。AVC+AACでエンコードできることが望ましい。FLVは所詮コンテナであり、FLV5の実態はMP4である。TM4EはMPEG4に標準対応しているのだから、最初からH.264+AACでエンコードしてやればよい。ファイルの拡張子はFLVでもMP4でも構わないだろうが、MP4にしておいたほうが視認上都合がよいだろう。2009-04-09追記:FLV5とMP4にコンテナとしての互換性はない。46【質問】の>>481から20レスくらいが参考になる。Player9がMP4コンテナにも対応していることで、俺も含めFLV5=MP4という誤解が広まったのかもしれない。FLV5≒MP4ということで。そんなわけで、セッティングは512x384、512kbps、14.985fps、96Kbs、48KHz、メインプロファイルを使用してエンコードしてみた。VP6と同等かそれ以上のクオリティに見えるが、輝度の高い部分はH.264のがキレイ。全画面にした際の違和感も少ない。余談だがVP6はどうも指定したビットレートからの推定値に対して生成ファイルサイズが若干大きくなる傾向があるのだけど、H.264はほぼ理論値に近いサイズに収まる。プログレッシブダウンロードの再生にならない(読み込みながら随時再生ではなく、ダウンロードし切ってから再生になってしまう)のが気になる。プロファイルをBaselineにしたらいいのかしら。...ファイルがキャッシュに残ってると事実上プログレッシブ再生状態になるので、比較したい人は面倒でもキャッシュをクリアしてからどうぞ。Player9はMP4コンテナに対応しているので再生自体は可能なのだが、プログレッシブ再生とならないのはMP4とFLVにコンテナの互換性がないことが原因のようだ。やってFLV5にしたらよいのかは後述のffmpegで。音声コーデックはAAC-LCなら128~160KbpsでMP3とは比べ物にならない高音質を得られる。映像優先であればHE-AACでさらに低ビットレートに挑戦したいところだが、残念ながらTM4Eは未対応。頼みの綱、ffmpegを使ってMP4をFLVに変換する、またはその逆バイナリ持ってる前提だが、いろんなところで紹介されてるので各自入手しる。試しにこんな感じで出力させてみた。ffmpegは特に出力フォーマットの指定(-f)がない場合には拡張子を見てコンテナを決めているようなので、出力ファイルの拡張子は必ずflvにしておく。引数-*codecの値をcopyにしてやるとストリームをそのままコピー、つまりコンテナに互換性がなくても格納ストリームが同じであれば無劣化で変換できるはず・・・入力と出力を逆にすればFLV→MP4も無劣化変換できるわけ。"path\filename.mp4"-threadsは読んで字の如しエンコードのスレッド数。2スレッドしかないのに4とか8とか無茶しないこと。あとコマンドライン慣れしてる人には何を今さら、な話とは思うが、2バイト文字は何かと面倒なので、変換時はとりあえずファイル名をASCIIのみにしておく。パスにも日本語が含まれたりしないほうがいいので“C:\Temp”とかシンプルなパスにしとくといいだろう。ffmpegはバージョンによって引数(オプションな)が異なるので自分でも確認しる。rev.18302(Core2最適化版)。1.447414%小さいファイルなので2秒くらいで終わった。#0.1の内容が同じになってるか確認しておく。曲は元ちとせの「いつか風になる日」の拾いもの。今度はちゃんとプログレッシブ再生される。コンテナの問題だったようだ。元ファイルの音声のサンプリング周波数を48KHzにしていても44.1KHzに強制変換されたので完全に無劣化とはいえない(これは恐らくFLVの仕様であろう、というかffmpegが賢い)。技術ネタ保管庫この程度の変換ならコマンドラインのほうが楽と思うのだけれども、ffmpegには携帯動画変換君ほか多くのフロントエンドがあるので、面倒な人はそちらを使えばよい(引数の互換性には注意)。ffmpeg単体でよいのでは?最新はどうか知らないが、ffmpegはすっぴんの状態ではAACはデコードのみとなっているので(サンプリング周波数のトランスコードはできるようだが)、自力でlibFAACなりのライブラリを含めてコンパイルし直すか、携帯動画変換君のような追加済みのバイナリ探してくるか、俺みたく一旦MP4作って無劣化変換の二度手間かますか、音声にMP3を使うかの四択と思われる。VP6のエンコードには対応してるので、FLV4なら問題ない(ならmencoder_vp6set使え)。FLVだったら最後の拡張子をmp4ではなくflvにしてやるだけ。この状態でインデックス情報とかどうなってるのかは気になるよね。そんなわけで、ffmpegで手持ちのMKVをFLVに無劣化変換かましたのをうpしてみた。飛翔戦隊プライドファイブ」、主演は東尾真子嬢。300MBくらいあるので注意。いちおうプログレッシブダウンロードにはなってるんだけど、真空波動研で調べるとフレームレートが1000.00fpsとかアホみたいなことになっとる。補記:FLV5の結合(=F4Vの結合)とかこれを検索ワードにやってくる人がいるようなので。仮に解像度やビットレートが同じ条件でエンコードされたファイルでも、後述のインデックス情報の関係でMKVやWMV連結のような単純なバイナリ結合はできないと思う。再エンコせずに、という前提であれば俺なら面倒でもffmpegでMP4に無劣化変換してからTM4Eで分離&多重化とかするかな。どんな手法を取るかは元ソースと作業量によるよ(それをいっちゃ身も蓋もない。いちおうコマンド的にはこんな感じ。dest.mp4concat=n=のところで結合元のファイル数を指定してやる。結合元ファイルはsrc0、src1、src2・・・な感じで列記。最後に結合後のファイル名としてdest.mp4、と。FLVでもできるかどうかはわかんない(ソース用意するのが面倒なので試してない。解像度やビットレートが違ったりするとたぶんはじかれると思う。SparkとVP62の格納コンテナはFLV、H.264(+AAC)をサポートしたコンテナはF4V(ffmpeg未対応)となっている。FLV5≒F4Vと考えてもよい。いうか、これまで調べた限り、Adobe自身はFLV4とも5とも呼んでないっぽい。Videoの項にFourCCにおける映像コーデック識別子とある(ほんとか?FOURCCのサイト見ても載ってないのだが...)。そんなわけで、冒頭の説明は微妙におかしい。VP62をサポートしたコンテナ。FourCCはそれぞれFLV1及びFLV4らしい。音声に使用できるのはMP3。F4VH.264をサポートしたコンテナ。FourCCはFLV5らしいAVC1。音声に使用できるのはAAC。アルファチャネル及びキューポイントはサポートしない。これで少しすっきりした。いうWikiのFLVの記述(※現在は修正されている)を信じたばっかりにえらく混乱してしまった。大事なことは自分で調べないといけない。SWF形式の独自の埋め込み型プレイヤーでの再生サポートについてはパブリッシュしたFlashなどのバージョンに依存するが、基本的にプレイヤーのそれと同じと考えてよい(SWFファイルのパブリッシュバージョンが9以降であればH.264をサポートしている、ということ)。2009-07-22追記:いちおう補足しておくと、YouTubeのコンテンツなんかを見る限り、MP4自体がプログレッシブ再生未対応というわけではないと思う。Playerの問題なのだろう(コンテナはサポートしてるがプログレッシブ再生には対応してない、みたいな)。2010-01-19追記:本件について俺にはもう情熱が残ってないのだが、ありがたいことにgoldenhige氏がさらなる追及をされていた。channelのために予約されていたようだ。これでH.264/AVCのFLVは少なくともFLV5ではないことがわかってスッキリ。詳しくは「H.264/AVCのFLV」を「FLV5」と呼んではいけない理由を参照されたし。手元にあるffmpegはF4Vには未対応なので、変換したファイルのコンテナはFLVのはずだが問題なくプログレッシブ再生できてしまっている。それが目的でいろいろ調べていたのだから結果オーライではあるものの、原因がわからないままというのはどうにも気持ちが悪い。拡張子が異なるだけで格納フォーマット自体は同じというわけでもあるまいし。いうか理屈は理解できた。インデックス情報がファイル末尾にあるからで、これを前にもってこないと「全部ダウンロードするまで再生できない」という状態なのだな、考えてみりゃ単純な話。インデックス情報の格納場所がMP4の仕様で規定されてなくてエンコーダによって任意だったりするのかな。さっきの設定でffmpeg通してFLVにしてやるとヘッダにくる、ってことかしら(コンパイルや環境依存かもしれんので鵜呑みにしないこと)。atomをファイルの先頭に配置することです。このように配置しないと、ファイル全体をダウンロードしてから再生を開始する必要があります。atomは、ファイル全体のインデックス情報を保持しているファイルの一部です。Effectsなどのツールでは、この情報はファイルの末尾に配置されてしまいますが、アドビは、CS3ビデオ作成ツールの将来のアップデートでこの問題を修正するよう作業を進めています。atomつまりインデックス情報の配置に関する指定ができないようなので(※大嘘だった!)、対応してくれるまではffmpegなりでFLVコンテナに変換するか、TM4Eはフロントエンドに徹してVFAPIで配置の指定ができるアプリと連携させる、なんて方法を取らないといけないようだ(もちろんTM4E使わない、という選択もあるが俺はものぐさなのでなるだけエンコ環境変えずに楽したいのだ)。atomという言葉にもう少し触れると、atomはQuickTimeやMPEG-4の用語でボックスを意味する。ボックスはコンテナと思ってもらって構わない。moovはISOベースメディアファイルフォーマット(限りなくMPEG-4のこと)におけるメタデータのことを指す。メタ情報のためのサブコンテナ、というわけ。別にAppleが勝手に作った言葉ではない。AVIコンテナのidxと思ってほぼ問題ない。CS3なんてとてもとても。atomの配置変更だけやってくれるツールなんてないかなあ(AIRにはあるらしい)。...ひょっとしたらと試しにもう一回、ffmpegを通してみた。atomが先頭の状態が維持されるなら幸いなのだが。曲はSalyuの「新しいYES」、解像度はちょっと奮発して1280x720。※残念ながら代替コンテンツがありません。('A`)やっぱりだめぽ。MP4Boxを通してみる...そんなわけで、鯖側にMP4Box組み込もうかと思ったものの、たぶんx264とかffmpegあたりの組み込みとか、いろいろ事前作業がめんどくさそう。Windows環境で使えそうなものをちょっと調べたらYAMBという携帯向け動画ツールにMP4Boxが含まれてるようなので、これを使ってみた。デフォルトでMP4Boxが組み込まれているのはインストーラ版のほうらしい(ZIP版は自分でインスコ)。起動して、[作成]→[MP4作成]で開くウインドウで、Inputに元のMP4ファイルをぶちこんでみる(Outputは適当にリネームするなりしる)。作成というか変換処理は一瞬で終了。※残念ながら代替コンテンツがありません。mark2あたりで撮ったのかな。被写界深度がやたら狭いシーンが多々ある。atomをファイル先頭部分に移動(゚д゚)ウマーとなった。これでFLVと決別できるかな?出力コンテナの見直しいや完全に見落としだ。atomがファイル先頭に配置されるようだ。[3GPP]でもいけそうなものだが、ダメだった。feat.安藤裕子」、調子に乗ってこいつも1280x720、レートは半分の14.985でエンコード。※残念ながら代替コンテンツがありません。今までの苦労はなんなんだ。これでようやく、TM4E単体で(゚д゚)ウマー、となった。最初からサポートに聞けってな。ファイル出力のストリーム選択と機能がごっちゃだよ)。Yambだって膨大な数のMP4ファイルをいちいち再エンコせずにatomの配置替えできるツールと思えば入れとく意味ある。何事にも前向きな、はじめ男爵である。考えんとやってられんわ。あと何か気になることがあるとすれば、埋め込み再生時に一瞬コマ落ちするようなことが多いので、その対処。落ちるのは映像だけなのでフレームレートとIフレームの間隔とか、そのへんが影響してるのかなあ。ローカル再生時には何の問題もないのだよ。なるとやっぱりFlash側なのかねぇ...。5Ver.5から仰々しい名前に生まれ変わった(以下TVMW5)。デフォルトの読み込みフォーマットが増え、H.264/AVCのエンコードエンジンをMainConcept製からx264に変更したほか出力にMKVも選択できるようになり、とさらに便利になったっぽいので、俺はもう仕事で動画に関わってないんだけど買ってしまった。バージョンアップ初期は不具合続出するの目に見えてたので、アップグレードではなく単体購入(2013年3月現在はおおむね落ち着いたと思う)。全体の雑感や通常エンコードに関しては別途取り上げるとして、FLV絡みのエンコードにおけるポイントなどを簡単に。H.264のエンコード。セコいっちゃセコいが、恐らくOn2=GoogleのVP6に対するライセンスの問題なのだろうな。新規やアップグレード版でTVMW5を購入した人は買うしかないけど、俺みたく単体でTVMW5買ってTM4Eを共存させているならそっちで出力させれば済む話。VP6を使う積極的な理由があるかもわからんが。atom...要するにインデックス情報の配置はデフォルトテンプレートのMP4ファイル出力では設定できないウンコ仕様となっている。出力するストリーム形式でMP4を選択、詳細設定のMP4オプションでストリーミング向けに出力する、にチェックを入れる。映像設定のMPEG出力へ移行を選択。要するにx264のウリであるオプションの詳細な設定をするならMPEGファイル出力でやってくれって話。実際の運用はカスタムテンプレートが主体になるとはいえ、こういうわかりにくさは相変わらず。想像するに、詳細設定の項目によっては選べるコンテナが変わってしまうので機能の割り当てをあちこちに分散させてるんじゃないかな。これは良し悪しではなくアプリケーションの設計思想の問題かね。それはまあいいとしても独自解釈の用語は極力避けてほしい。なんだけど、こっちは選択肢がめちゃくちゃわかりにくいw)。62014年12月にVer.6が登場した(以下TVMW6)。atomの配置はVer.5同様に詳細設定のMP4オプションでストリーミング向けに出力で行う)。コンテナを選ぶ理由はあまりない。ファイル出力のほうが融通が利いてよい。ちなみにエンコーダーはx264のほかQSVやNVENCによるハードウェア支援も選べる。6その他VirtualDubModeやAVIUtilなんかはもっと詳しい解説がいくらでもあるので割愛。設定で気をつけたいポイントなど。配信向け映像とVBR結論からいえばVBRそのものは何の問題も無い。CBRは出力がほぼ想定どおりのサイズでエンコードもデコードも安定した処理が期待できるほか、AVIコンテナのような古い規格との相性もよい。半面、画質に関しては無駄が多く効率が悪い。処理時間はかかるが、画質優先であれば迷わず2passのVBRを選ぶべき。俺も検証とかやっつけ作業以外、動画でCBRは使ってない(音楽鑑賞向けのMP3はジョイントステレオのCBRが多いけどね)。ストリーミング配信のように様々な視聴環境が混在し帯域に制約があるようなケースでは大幅なビットレートの変動は好ましくない。最大ビットレートの設定は慎重に。ソースの内容や平均をいくつにもっていくかにも拠るけど、ADSLの8Mbpsあたりを目安に通信品質(安定性)も考慮すると現時点ではせいぜい上限4000Kbps程度じゃないかな。帯域別に複数の配信素材を用意する、ということであれば、爆速環境向けにがんばっちゃっても構わないんでないの。VBRでも1pass固定品質(固定量子化)だとビットレートの変動幅も出力サイズも見当が付かないので配信に用いるのはナンセンス。そんなわけで、ストリーミング向けのエンコードではCBRを使うのが一般的、というお話。配信向けのプロファイルとレベルプロファイルは規定に含まれるアルゴリズムなどの要件のうちどれを使うかを定義したもの。携帯など処理能力の低い端末の場合、複雑なアルゴリズムを使わないといった配慮ができる。レベルは処理するデータ量と思えばいい。Profile)モバイル端末向けの最低限の画質だが、ロジックが簡略化されているぶん再生環境は幅広い。Profile)DVD(SD)やPC鑑賞を目的とした画質。ぶっちゃけMPEG2と大差ないけど圧縮率は高い。Profile)フルHDや4K2K向けの超高画質。メインプロファイルの画質がMPEG2と大差ないのに業を煮やしたPHLがH.264の限界に挑んだ成果らしい。画質は申し分ないがエンコもデコードもクソ重い。ProfileのLevel3.1もしくは自動設定という決め打ちで特に問題はない。心配ならBaselineの3.1で。先に触れたとおりプロファイルとレベルは再生環境のスペックと密接な関係がある。言い換えれば再生側で受け入れ可能な上限が設定されてる、ということ。そのためうかつに高品位を狙った設定をするとどんな低ビットレートで処理負荷が軽かったとしてもスマホでの再生がエラーになったりするから、何事も程ほどにしておくのがよいだろう。具体的にはSD映像でMain@3.0、フルHD映像でもHigh@4.1あれば十分足りる。High@5.0なんて4K2K映像レベルに対応するアルゴリズムらしい。煮詰めるなら別の部分。参考:H.264のプロファイルとレベルについて逆に出力が1920x1080のフルHDなのにBaselineやMainの3.0なんて低いプロファイルとレベルでエンコードするとブロックノイズだらけになるし、たとえどんだけビットレートを高く設定しようが得られる画質には上限がある。補記いっときは“FLV5”でググって二番目にヒットするのがこのページだったくらいで、2009年前後のFLV5に関する誤解が広がるのを食い止めるのにそれなりに貢献できたのではないかと思われる。