exB - extreme B-AREA -

修行するぞ、修行するぞ、徹底的にハードな修行するぞ

お勉強:マルチメディア - FLV動画のエンコード

サンプルが見つかりました。

初稿から9年、まさかこんな長きに渡ってテコ入れすることになるとは。 最終更新:2014-03-27

  • FLVの分類とFLV5に関する誤解
  • TMPGEnc4.0 Expressによる埋め込み用FLV/H.264出力
  • ffmpegでFLVとMP4の無劣化変換
  • その他配信向けのポイント

このへんについて調べてる人には役立つかもしれない。

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がそう呼ばれるようになったのではないかと思うのだが、H.263とは別にFLV1というFourCCも存在する。ただし、FLVの仕様書(FLV and F4V File Format Specification)におけるSorenson H.263のCodecIDは2だったりして、ややこしい。。
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が使えることで、映像により多くのデータを振り分けることができるのがメリットではないかと思う。

ソフトウェア

おもなもの。

  • Riva FLV Encoder
  • Flash Video Encoder
  • Mencoder + VP6 VFW Codec
  • Sorenson Squeeze
  • TMPGEnc 4.0 Express with Movie Plug-in FLV4
  • TMPGEnc Video Mastering Works 5 (with Movie Plug-in FLV4)
  • ffmpeg ( + libFAAC )

ほかにもAviuUtilにいろいろ突っ込むなりあるんだろうが。ニコ動とか、配信先を特化したツールについてはあんまり詳しくないので割愛するよ(2005年執筆当時のツールもそのまま載せてるので「そんなのもうねえよ!」とかいわれても知らん。)。

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などいろいろあるので好きなのを使うとよい。

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

MPEG1/2のエンコードで定評のあるペガシスの有償ソフト(以下TM4E)。これも仕事で使い出したけど、その勝手のよさにSorenson Squeezeの出番は消滅した。ダウンロード版の本体が9800円なのにプラグインだけで4980円はちょっと高いと思ったのだが、結局買ってしまった。だって楽なんだもの。反面、セッティングはあまりきめ細かくない。そこはときどき不満が出る。

Sorenson Squeezeは同時に複数のコーデック&異なるビットレートで大量エンコ、なんて場合には便利と思う。うちの場合、メインエンコード:WMV or H.264で本編フル、サブエンコード:FLV4 or 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ソースからのエンコード。セッティングは映像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にしてやるとストリームをそのままコピー、つまりコンテナに互換性がなくても格納ストリームが同じであれば無劣化で変換できるはず・・・入力と出力を逆にすればFLV→MP4も無劣化変換できるわけ。

ffmpeg -threads 4 -y -i "path\filename.flv" -vcodec copy -acodec copy "path\filename.mp4"

-threadsは読んで字の如しエンコードのスレッド数。2スレッドしかないのに4とか8とか無茶しないこと。あとコマンドライン慣れしてる人には何を今さら、な話とは思うが、2バイト文字は何かと面倒なので、変換時はとりあえずファイル名をASCIIのみにしておく。パスにも日本語が含まれたりしないほうがいいので“C:\Temp”とかシンプルなパスにしとくといいだろう。

なお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単体でよいのでは?

最新はどうか知らないが、ffmpegはすっぴんの状態ではAACはデコードのみとなっているので(サンプリング周波数のトランスコードはできるようだが)、自力でlibFAACなりのライブラリを含めてコンパイルし直すか、携帯動画変換君のような追加済みのバイナリ探してくるか、俺みたく一旦MP4作って無劣化変換の二度手間かますか、音声にMP3を使うかの四択と思われる。なおVP6のエンコードには対応してるので、FLV4なら問題ない(ならmencoder_vp6set使え)。

YouTubeやニコにうpされてるファイルを変換するニーズのほうが多いだろうから、最近はFLVtoMP4みたいにFLV→MP4無劣化変換のツールもよく見かけるけど(FLVtoMP4は.NETFramework4以上必須なので使うならあらかじめ入れとけ)、ほとんどはffmpegのフロントエンドなのでffmpegのコマンドはある程度覚えておいて損はないと思うよっ!特にオプションのmap使いこなせたら音声のマルチトラックなんかも自由自在さ!

ついでに、MKVからMP4への変換についても同じでソースのMKVの中身がH.264+AAC以外の音声コーデックだったら、

ffmpeg -i -y "path\filename.mkv" -vcodec copy "path\filename.mp4"

としてやると勝手に128kbpsのAACにしてくれる(AACだったら -vcodec copy -acodec copyでおk。FLVだったら最後の拡張子をmp4ではなくflvにしてやるだけ。ただこの状態でインデックス情報とかどうなってるのかは気になるよね。そんなわけで、ffmpegで手持ちのMKVをFLVに無劣化変換かましたのをうpしてみた。元ネタは「ヒロイン妊娠・乳姦・産卵・白目・アヘ顔昇天地獄 飛翔戦隊プライドファイブ」、主演は東尾真子嬢。300MBくらいあるので注意。

いちおうプログレッシブダウンロードにはなってるんだけど、真空波動研で調べるとフレームレートが1000.00fpsとかアホみたいなことになっとる。うーむ。

補記:FLV5の結合(=F4Vの結合)とか

これを検索ワードにやってくる人がいるようなので。仮に解像度やビットレートが同じ条件でエンコードされたファイルでも、後述のインデックス情報の関係でMKVやWMV連結のような単純なバイナリ結合はできないと思う。再エンコせずに、という前提であれば俺なら面倒でもffmpegでMP4に無劣化変換してからTM4Eで分離&多重化とかするかな。まあどんな手法を取るかは元ソースと作業量によるよ(それをいっちゃ身も蓋もない。

いちおうコマンド的にはこんな感じ。

ffmpeg -i src0.mp4 -i src1.mp4 -filter_complex concat=n=2 dest.mp4

concat=n=のところで結合元のファイル数を指定してやる。結合元ファイルはsrc0、src1、src2・・・な感じで列記。んで最後に結合後のファイル名としてdest.mp4、と。FLVでもできるかどうかはわかんない(ソース用意するのが面倒なので試してない。解像度やビットレートが違ったりするとたぶんはじかれると思う。

…気になること

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はそれぞれFLV1及び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ビデオ作成ツールの将来のアップデートでこの問題を修正するよう作業を進めています。

※追記:moov atom優先の配置を一部でFast Startって呼んでるらしいぜ!なんだかカッコいいな!

残念ながらTM4EによるMP4エンコードではmoov atomつまりインデックス情報の配置に関する指定ができないようなので(※大嘘だった!)、対応してくれるまではffmpegなりでFLVコンテナに変換するか、TM4Eはフロントエンドに徹してVFAPIで配置の指定ができるアプリと連携させる、なんて方法を取らないといけないようだ(もちろんTM4E使わない、という選択もあるが俺はものぐさなのでなるだけエンコ環境変えずに楽したいのだ)。

なおmoov atomという言葉にもう少し触れると、atomはQuickTimeやMPEG-4の用語でボックスを意味する。ボックスはコンテナと思ってもらって構わない。moovはISOベースメディアファイルフォーマット(限りなくMPEG-4のこと)におけるメタデータのことを指す。つまりメタ情報のためのサブコンテナ、というわけ。別にAppleが勝手に作った言葉ではない。AVIコンテナのidxと思ってほぼ問題ない。

参考: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あたりで撮ったのかな。被写界深度がやたら狭いシーンが多々ある。

そんなわけで、俺手順としては

  1. ソースファイル入手
  2. TM4EでMP4エンコ
  3. YAMBでmoov atomをファイル先頭部分に移動
  4. (゚д゚)ウマー

となった。これでFLVと決別できるかな?

出力コンテナの見直し

いや完全に見落としだ。MPEG-4出力設定で出力コンテナに[標準]ではなく[iPod ビデオ]を選んでやるだけで、ちゃんとmoov atomがファイル先頭に配置されるようだ。なお[3GPP]でもいけそうなものだが、ダメだった。

曲は冨田ラボ「あの木の下で会いましょう feat.安藤裕子」、調子に乗ってこいつも1280x720、レートは半分の14.985でエンコード。

※残念ながら代替コンテンツがありません。

今までの苦労はなんなんだ。これでようやく、TM4E単体で(゚д゚)ウマー、となった。最初からサポートに聞けってな。まあ、おかげでいろいろ余計な知識を貯め込むことができたわけだし、そもそもFLVに疑問を抱かなければMPEG-4での出力コンテナ選択の違いがmoov atomの配置に影響するなんてわかるはずもなく(そもそもなんでインデックスの配置がコンテナ選択になるんだよw ファイル出力のストリーム選択と機能がごっちゃだよ)。Yambだって膨大な数のMP4ファイルをいちいち再エンコせずにatomの配置替えできるツールと思えば入れとく意味ある。と何事にも前向きな、はじめ男爵である。そうでも考えんとやってられんわ。

あと何か気になることがあるとすれば、埋め込み再生時に一瞬コマ落ちするようなことが多いので、その対処。落ちるのは映像だけなのでフレームレートとIフレームの間隔とか、そのへんが影響してるのかなあ。でもローカル再生時には何の問題もないのだよ。となるとやっぱりFlash側なのかねぇ…。

TMPGEnc Video Mastering Works 5

Ver.5から仰々しい名前に生まれ変わった(以下TVMW5)。デフォルトの読み込みフォーマットが増え、H.264/AVCのエンコードエンジンをMainConcept製からx264に変更したほか出力にMKVも選択できるようになり、とさらに便利になったっぽいので、俺はもう仕事で動画に関わってないんだけど買ってしまった。バージョンアップ初期は不具合続出するの目に見えてたので、アップグレードではなく単体購入(2013年3月現在はおおむね落ち着いたと思う)。全体の雑感や通常エンコードに関しては別途取り上げるとして、FLV絡みのエンコードにおけるポイントなどを簡単に。

VP6でのF4V出力は別途専用プラグインが必要

標準で可能なのはMPEG-1、MPEG-2 及びH.264のエンコード。セコいっちゃセコいが、恐らくOn2=GoogleのVP6に対するライセンスの問題なのだろうな。新規やアップグレード版でTVMW5を購入した人は買うしかないけど、俺みたく単体でTVMW5買ってTM4Eを共存させているならそっちで出力させれば済む話。まあ、今さらVP6を使う積極的な理由があるかもわからんが。

H.264/AVCの配信向けMP4出力について

TM4Eでハマった罠、moov atom…要するにインデックス情報の配置はデフォルトテンプレートのMP4ファイル出力では設定できないウンコ仕様となっている。

テンプレート:MPEGファイル出力
出力するストリーム形式でMP4を選択、詳細設定のMP4オプションでストリーミング向けに出力する、にチェックを入れる。
テンプレート:MP4ファイル出力
映像設定のMPEG出力へ移行を選択。後は上記の通り。

要するにx264のウリであるオプションの詳細な設定をするならMPEGファイル出力でやってくれって話。実際の運用はカスタムテンプレートが主体になるとはいえ、こういうわかりにくさは相変わらず。

想像するに、詳細設定の項目によっては選べるコンテナが変わってしまうので機能の割り当てをあちこちに分散させてるんじゃないかな。これは良し悪しではなくアプリケーションの設計思想の問題かね。それはまあいいとしても独自解釈の用語は極力避けてほしい。出力するストリームの種類とかかえって分かりづらいわ、出力コンテナでいいだろが(Ver.4では出力コンテナの種類なんだけど、こっちは選択肢がめちゃくちゃわかりにくいw)。

TMPGEnc Video Mastering Works 6

2014年12月にVer.6が登場した(以下TVMW6)。FLV関連でいえば出力フォーマットに単独項目が追加されたけど、格納コンテナがFLV形式になるだけで映像コーデックは H.264/AVC しか選べないから実用上MPEG出力やMP4出力と大差ない(その場合、moov atomの配置はVer.5同様に詳細設定のMP4オプションでストリーミング向けに出力で行う)。

Flash の機能をフルに活用するのでもない限り積極的に FLV コンテナを選ぶ理由はあまりない。強いて挙げるなら FLVにしておけば moov atom の配置設定に頭を悩ませることがない、くらいか(それにしても YouTube 向け MPEG ファイル出力のほうが融通が利いてよい。

ちなみにエンコーダーはx264のほかQSVやNVENCによるハードウェア支援も選べる。

参考:お買い物 - Pegasys TMPGEnc Video Mastering Works 6

その他

VirtualDubModeやAVIUtilなんかはもっと詳しい解説がいくらでもあるので割愛。とりあえず設定で気をつけたいポイントなど。

配信向け映像とVBR

結論からいえばVBRそのものは何の問題も無い。CBRは出力がほぼ想定どおりのサイズでエンコードもデコードも安定した処理が期待できるほか、AVIコンテナのような古い規格との相性もよい。半面、画質に関しては無駄が多く効率が悪い。処理時間はかかるが、画質優先であれば迷わず2passのVBRを選ぶべき。俺も検証とかやっつけ作業以外、動画でCBRは使ってない(音楽鑑賞向けのMP3はジョイントステレオのCBRが多いけどね)。

ただしストリーミング配信のように様々な視聴環境が混在し帯域に制約があるようなケースでは大幅なビットレートの変動は好ましくない。最大ビットレートの設定は慎重に。ソースの内容や平均をいくつにもっていくかにも拠るけど、ADSLの8Mbpsあたりを目安に通信品質(安定性)も考慮すると現時点ではせいぜい上限4000Kbps程度じゃないかな。もちろん帯域別に複数の配信素材を用意する、ということであれば、爆速環境向けにがんばっちゃっても構わないんでないの。なおVBRでも1pass固定品質(固定量子化)だとビットレートの変動幅も出力サイズも見当が付かないので配信に用いるのはナンセンス。

そんなわけで、ストリーミング向けのエンコードではCBRを使うのが一般的、というお話。

配信向けのプロファイルとレベル

プロファイルは規定に含まれるアルゴリズムなどの要件のうちどれを使うかを定義したもの。たとえば携帯など処理能力の低い端末の場合、複雑なアルゴリズムを使わないといった配慮ができる。レベルは処理するデータ量と思えばいい。

ベースラインプロファイル(Baseline Profile)
モバイル端末向けの最低限の画質だが、ロジックが簡略化されているぶん再生環境は幅広い。
メインプロファイル(Main Profile)
DVD(SD)やPC鑑賞を目的とした画質。ぶっちゃけMPEG2と大差ないけど圧縮率は高い。ただ負荷もけっこう高め。
ハイプロファイル(High Profile)
フルHDや4K2K向けの超高画質。メインプロファイルの画質がMPEG2と大差ないのに業を煮やしたPHLがH.264の限界に挑んだ成果らしい。画質は申し分ないがエンコもデコードもクソ重い。

配信であればMain 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に関する誤解が広がるのを食い止めるのにそれなりに貢献できたのではないかと思われる。