Flash Player 9 Update 3では、FLVPlaybackコンポーネントは更新され、高解像度H.264ビデオ形式のサポートが追加されます。 メタデータ(MPEGコンテナ内にグループ化された情報)により、ビデオファイルおよびオーディオファイルからアルバムアート、ソングタイトル、チャプター、その他のテキスト、画像など、便利で興味深い様々な情報にアクセスして表示できます。 FLVファイル形式は、メタデータパケットを使用してこの情報を保存します。 非FLV H.264ファイルのメタデータ機能をサポートするために、onImageData()およびonTextData()という2つの新しいNetStreamコールバックが追加されました。
ここでは、次のトピックについて説明します。
FLVPlaybackコンポーネントを使用する場合、onMetaData()コールバックが処理されるので、MetadataEvent.METADATA_RECEIVEDイベントのリスナーを追加できます。
次の例では、onMetaData()関数がメタデータイベントをリッスンします。
import fl.video.*;
myFLVPlayback.addEventListener(MetadataEvent.METADATA_RECEIVED,
handleMetadata);
function handleMetadata(e:MetadataEvent):void {
var data:Object = e.info;
...
}
または、メタデータプロパティにアクセスすることで、そのイベントの後いつでもメタデータにアクセスできます。 Flash Playerは、MP4ファイルを解析するとき、拡張メタデータ情報を返すデータメッセージを生成します。
次のフィールドがサポートされています。
progressivedownloadinfo:「pdin」atomからの情報を提供するオブジェクトです。 これはオプションで、多くのファイルにはこのフィールドはありません。
注: atomはデータの「箱」で、オーディオ、ビデオ、テキストなど他のデータトラックを格納する、階層構造のデータオブジェクトです。各atom名には特定の特性があり、ファイルコンテナの非常に単純な基礎的要素を表しています。 例えば、「moov」atomは、他のatom以外のコンテンツを持たない親atomです。「mdat」atomは、未フォーマットのオーディオストリームおよびビジュアルストリームを格納します。「ilst」atomはID3と同等で、Apple iTunesはこれを使用して、ソングタイトル、アーティスト名、アルバムなどのメタデータを格納します。「pdin」atomは、プログレッシブダウンロード情報を格納します。
public function
onMetaData(data:Object):void {
if ( data.tags != undefined
&& data.tags.covr != undefined ) {
// see if we have cover artwork
for ( var i:int;
i<data.tags.covr.length; i++ ) {
var loader:Loader = new
Loader();
loader.loadBytes(data.tags.covr[i]);
addChild(loader);
}
}
}
使用可能なメタデータタグの確定されたリストはありません。 Flash Playerはキーと値のペアを読み込むだけで、多くの場合、実際のキーは参照しません。 ObjectUtilを使用してonMetaDataメッセージをイントロスペクトし、その内容を把握することをお勧めします。 これは、ここにリストされていないその他の情報を確認するためにも効果的です。メタデータは固定されておらず、サポートされているメタデータのリストは、時間の経過と共に増える傾向にあるからです。
次の例では、onMetaData関数を検出してコンテンツを検索するために、ObjectUtilが使用されています。
import mx.utils.ObjectUtil;
public function onMetaData(data:Object):void {
trace(ObjectUtil.toString(data));
}
onImageDataメソッドは、onMetaDataと同様のコールバックで、画像データをバイト配列としてAMF0データチャンネルを介して送信します。 画像データは、JPEG、PNG、またはGIF形式を使用できます。 情報はバイト配列なので、この関数は、ActionScript 3.0クライアントSWFでのみサポートされています。 次の例では、画像データにアクセスして表示するために、onImageDataが使用されています。
public function onImageData(imageData:Object):void {
// this is the track number this sample is associated with
trace(imageData.trackid);
var loader:Loader new Loader();
// imageData.data is a ByteArray object.
loader.loadBytes(imageData.data);
addChild(loader);
}
注:FLVPlaybackプログラミングでは、onImageData()関数は、カスタムクライアントのコンテキストにある必要があります。
onTextDataメソッドは、onMetaDataと同様のコールバックで、テキストデータをAMF0データチャンネルを介して送信します。 テキストデータは必ずUTF-8形式で、3GP timed text仕様に基づく形式についての追加情報を含めることができます。 この関数は、バイト配列を使用しないので、ActionScript 2.0および3.0で完全サポートされています。 次の例では、トラックID番号と対応するトラックテキストデータを出力ウィンドウに表示するために、onTextDataが使用されています。
public function onTextData(textData:Object):void {
// this is the track number this sample is associated with
trace(textData.trackid);
// prints the text, can be a null string which indicates that
// the old string on this track should be erased
trace(textData.text);
}
注:FLVPlaybackプログラミングでは、onTextData()関数は、カスタムクライアントのコンテキストにある必要があります。
FLVPlaybackコンポーネントは、fl.video.VideoPlayerClientクラスのインスタンスを自動的に作成し、それをNetStreamのクライアントプロパティに割り当て、NetStreamを介して着信するすべてのコールバックメッセージを処理します。 デフォルトのfl.video.VideoPlayerClientクラスは、onMetaData()コールバックとonCuePoint()コールバックのみ処理します。 これらのメッセージはどちらもイベント(MetadataEvent.METADATE_RECEIVEDおよびMetadataEvent.CUE_POINT)を生成するので、これらのコールバックを処理するカスタムクラスを登録する必要はありません。
ただし、カスタムコールバックを使用する場合、カスタムクライアントクラスを登録する必要があります。 fl.video.VideoPlayerClientを拡張して、VideoPlayerおよびFLVPlaybackにより提供されるonMetaData()とonCuePoint()の処理が継続して適切に実行されるようにする必要があります。
カスタムクライアントの実装の要件を以下に示します。
fl.video.VideoPlayerインスタンスを受け取る必要があります。readyプロパティを含める必要があります。NetStreamの開始時に、予期されるすべてのメッセージが受信されたとき、このプロパティをtrueに設定する必要があります。 VideoPlayerクラスは、ビデオの正しいサイズおよび継続時間にアクセスするために、ビデオを最初非表示にし、ファイルの開始部分を再生します。このため、この手順は必須です。 その後、このクラスは、ビデオを初めまですばやく巻き戻して、ビデオの非表示を解除します。 VideoPlayerがファイルの開始時にすべてのメッセージを受信する前に、巻き戻しが発生すると、それらのメッセージが受信されない場合があります。fl.video.VideoPlayerClientを拡張して、onMetaData()とonCuePoint()の処理が適切に実行されるようにすることをお勧めします。カスタムクライアントクラスを登録するには、次のコードを使用します。
import fl.video.*; VideoPlayer.netStreamClientClass = MyCustomClient;
netStreamClientClassプロパティは(上の例で示されているように)クラス自体に設定することも、クラスのストリング名に設定することもできます。 ストリング名に設定すると、クラスのSWFへの組み込みが強制されないため、別の方法で強制する必要があります。 例えば、その型の変数を宣言して、クラスが確実に組み込まれるようにします。
netStreamClientClassプロパティを無効な値に設定すると、次のエラーコードと共にVideoErrorがスローされます。 NETSTREAM_CLIENT_CLASS_UNSET。
次の拡張された例は、onImageData()を処理するサンプルクライアントクラスを示しています。
package {
import fl.video.VideoPlayer;
import fl.video.VideoPlayerClient;
import flash.display.Loader;
import flash.display.DisplayObjectContainer;
import flash.utils.ByteArray;
/**
* MyVideoClient subclasses VideoPlayerClient, the default
* VideoPlayer.netStreamClientClass value. This way all
* the metadata and cue point handling built in the
* VideoPlayer works properly.
*
* The class is declared dynamic so if any other
* messages are received that we do not support in
* this class (onTextData(), other custom
* messages) no runtime errors will occur.
*/
dynamic public class ImageDataVideoClient extends VideoPlayerClient
{
/**
* This variable is set in onImageData and is used to help
* determine when the ready property should be true.
*/
protected var gotImageData:Boolean;
/**
* The constructor must take a VideoPlayer as its
* only parameter. It needs to pass that argument
* along to the super constructor.
*/
public function ImageDataVideoClient(vp:VideoPlayer) {
super(vp);
gotImageData = false;
}
/**
* Handling for onImageData() message
* Loads the image bytes into a flash.display.Loader
* and adds the image to the
*/
public function onImageData(info:Object):void {
// Only handle onImageData() once. Any time we seek to the
// start of the file, the message will call this function
// again
if (gotImageData)
return;
var loader:Loader = new Loader();
loader.loadBytes(info.data);
var parent:DisplayObjectContainer = _owner.root as DisplayObjectContainer;
if (parent) {
parent.addChildAt(loader, 0);
}
gotImageData = true;
}
public function onTextData(info:Object):void {
trace(info);
recurseTrace(info, "");
}
private function recurseTrace(info:Object, indent:String):void
{
for (var i:* in info) {
if (typeof info[i] == "object") {
trace(indent + i + ":");
recurseTrace(info[i], indent + " ");
} else {
trace(indent + i + " : " + info[i]);
}
}
}
/**
* property that specifies whether early messages have been
* received so it is OK for the player to rewind back to the
* beginning. If we allow the VideoPlayer to rewind before
* all messages at the very beginning of the file are received,
* we may never receive them.
*
* The default class, VideoPlayerClient, only requires
* onMetaData() to be received before rewinding. onImageData()
* also appears at the beginning of the file, so we might miss
* that if we do not override this property and include a check
* for this data.
*/
override public function get ready():Boolean {
return (super.ready && gotImageData);
}
}
}
次の2つの新しい通知が、再生コンポーネントの実装を支援します。
NetStream.Play.FileStructureInvalid: プレイヤーが無効なファイル構造のMP4を検出すると、このイベントが送信されます。 Flash Playerは、無効なファイル構造のファイルを再生できません。NetStream.Play.NoSupportedTrackFound: プレイヤーがサポートされているトラックを検出できない場合、このイベントが送信されます。 サポートされているビデオ、オーディオ、またはデータトラックを検出できない場合、Flash Playerはファイルを再生しません。この記事では、Flash Player 9 Update 3をインストールした後、FLVPlaybackコンポーネントがどう変わるかについて概要を示しました。
FLVPlaybackコンポーネントの変更の詳細については、『Controlling Flash video with FLVPlayback programming*』(Dan Carr著)を参照してください。