ちょっと仕事ひと段落したので書きたかったエントリーを。 今回リニューアル時に躓いたflv/mp4関連のことを書いておきます。結構これ目当てでこのブログに来てくれる人も多いみたいですし。

------------------------------------

中途半端にポイントを書いてくと良く分からなくなるので、まずはflvを外部から読み込んで、再生するまでの手順を簡単に書いておきます。まぁここら辺はググればいくらでもあると思いますが。
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.media.Video;

	//略

//NetConnection作る
var nc:NetConnection = new NetConnection();
nc.connect(null);

//NetStream作る
var ns:NetStream = new NetStream(nc);

//video作る
_video:Video = new Video()
_video.attachNetStream(ns)

//NetStreamを再生して、表示する
ns.play("ファイル名.flv");
addChild(_video);
こんな感じです。順番はちょっとやそっと間違えても大丈夫ですきっと。 flvのギャラリーを作る時なんかはflvファイルからサイズや全体の長さを取得できると便利ですよね。ここで登場するのがメタデータ(metaData)です。flvファイルには動画データ以外に
  • 動画全体の尺
  • ビットレート
  • フレームレート
  • サイズ
などの説明情報を保持しています。 これを再生前に取得するためには、以下のようにします。
//取得したメタデータを格納しておく場所を用意しておく
private var videoMetaData:Array;

//クライアント作る
var clientObj:Object = new Object();
	
clientObj.onMetaData = function(param:Object):void
{
	videoMetaData = new Array(param.width, param.height, param.duration);
	setLayout(); //取得後に実行したいメソッドとか
};

//NetStreamのクライアントにオブジェクトを設定
ns.client = clientObj;

オブジェクトインスタンスを仲介しないといけないんですね。
メタデータは通常NetStream.play();直後、動画の1フレーム目が表示されるまでの間に取得されるらしいので、clientObj.onMetaData = function()内でメソッドを呼び出せば、開始直前にVideoインスタンスのサイズとかを設定できます。

が!

私がこれをした時は、何故か動画が最後まで読みこまれてからsetLayoutが呼び出されました。要するにストリーミングされないのです。これではURLLoaderを使うのと変わりませんw

ググっても中々同様の症状が見つからず、やっと見つけたのがこちら。

Adobe - デベロッパーセンター : Flash Playerにおける高解像度H.264ビデオおよびAACオーディオのサポートについての説明

薄い字で次のように書いてあります。
注:H.264ビデオファイルをプログレッシブダウンロードとして再生する場合に重要なのは、moov atomをファイルの先頭に配置することです。このように配置しないと、ファイル全体をダウンロードしてから再生を開始する必要があります。 moov atomは、ファイル全体のインデックス情報を保持しているファイルの一部です。 Adobe PremiereやAfter Effectsなどのツールでは、この情報はファイルの末尾に配置されてしまいますが、アドビは、CS3ビデオ作成ツールの将来のアップデートでこの問題を修正するよう作業を進めています。 ただし、これはH.264ビデオファイルのストリーミングに関する問題ではないため、Flash Media Serverのユーザには影響ありません。
・・・moov atom?
どうやらメタデータのことのようですが、症状はまさに私のと同じでした。エンコーダによっては、ファイルの最後にこのmoov atomをつけてしまうみたいで、そうすると動画が最後まで読みこまれない限りメタデータは読み込まれず、再生もされないんですね。やられました。というかこんな大事なことを薄字で書かないで欲しい。何度も読み飛ばしてました・・・。(単に自分の不注意なんですけどね)

自分の使ったエンコーダはTMPGEncなので、同様の症状に陥る人は他にもいるはずです。。 解決方法としては、この海外ブログのエントリーが役立ちました。私と同じ境遇に陥ったみたいですね・・・。

Flash H264: Moving the MOOV Atom, 14/05/08, [Ux]

エンコード後でも、ここに紹介されているAIRアプリを使うことによって、MOOV Atomのメタデータを動画データの前に持ってくることが可能です。これで変換を行った後、再度読み込みをテストすると、無事ストリーミングされました。めでたしめでたし。

Home

Comments:2

kmxs 2009年2月20日 11:14

metaデータ埋め込みうまくできないエンコーダー結構あるみたいね。
俺も結構ハマった記憶がある。。。それ以前の問題だったっていうw

映像やるとすごい総合的な知識がいるから半ば諦めておりますハッハ
超高機能FLVプレーヤーライブラリお待ちしておりますっ!(他人任せ

guponex 2009年2月20日 15:56

>kmxsさん

まさかファイル側に問題があるとは思ってもみず・・・気づいた時、既にコードはグチャグチャでしたw

ライブラリ作成って凄く敷居が高く思えてしまいます。「ライブラリを作成する上で注意するべき*個のこと」みたいな記事を誰か書いてくれないかなあ・・・Sparkな方々とか。

Comment Form