ADOBE®   MEDIA SERVER 5.0.3

デベロッパーズガイド


翻訳:株式会社サムライズ

 

注意

Adobe Media Server® バージョン 5についての本ドキュメントは第三者によって翻訳されたものであり、Adobe Systems Incorporated(アドビ システムズ社)は本翻訳物の正確性や完全性を査閲していません。

 

ライブストリームへのメタデータの追加

 

メタデータについて

アドビ システムズ社の伝道者 Jens Loeffler の記事「Working with metadata for live Flash video streaming」を参照してください。

 

ストリーミングメディアのメタデータを使用すると、受信者は、表示しているメディアに関する情報を取得できます。メタデータには、タイトル、著作権情報、ビデオの再生時間、または作成日など、ビデオについての情報を含めることができます。クライアントはメタデータを使用して、ビデオ Playerの幅と高さを設定できます。

記録されたストリームでは、メタデータを提供するメディアファイルの先頭に特殊なデータメッセージが挿入されます。 Adobe Media Serverに接続するすべてのクライアントは、記録されたストリームの再生時にメタデータを受信します。ただしクライアントはブロードキャスト中にライブストリームに接続するとデータキーフレームを受信できなくなります。

 

クライアントがライブストリームに接続するたびにクライアントにメタデータを送信するよう、Adobe Media Serverに指示するコードを記述できます。サーバーに接続しているクライアントは、遅れて接続した場合でも、ライブビデオを再生するとメタデータを受信します。

また、この機能を使用すると、ブロードキャスト中の任意の時点で、ライブストリームにメタデータを追加することもできます。

 

注意DVRアプリケーションは記録されたストリームを使用するので、データキーフレームを使用してメタデータをクライアントにプッシュする必要はありません。DVRアプリケーション(およびすべての記録されたビデオアプリケーション)ではonMetaData()メソッドはストリームの先頭や、検出および一時停止などのイベント間で呼び出されます。

 

 

ライブストリームへのメタデータの送信

クライアントがライブストリームに接続したときにクライアントにメタデータを送信するには、特別なコマンドである@setDataFrameをクライアントサイドの NetStream.send()メソッドまたはサーバーサイドの Stream.send()メソッドに渡します。このコマンドの送信元がクライアントとサーバーのどちらであるかにかかわらずsend()メソッドからのメッセージを処理する場合と同じように、クライアント上のデータを処理します。ハンドラー名を send() メソッドに渡し、データを処理する関数をそのハンドラー名で定義します。

クライアントからコマンドを送信するにはNetStream.send()  メソッドを呼び出します。

 

NetStream.send(@setDataFrame, onMetaData [,metadata ])

 

onMetaData  パラメーターは、受信したメタデータを処理する関数を指定します。複数のデータキーフレームを作成することができます。データキーフレームはそれぞれ固有のハンドラーを使用する必要があります(例えば onMetaData1onMetaData2  など

 

metadata パラメーターには、ストリーム内に設定するメタデータを含むオブジェクトまたは配列(またはサブクラス)を指定します。メタデータの各アイテムは名前と値がセットになったプロパティでありmetadataオブジェクト内に設定されます。任意の名前を使用することができますが、分かりやすいメタデータの設定のため、アドビ システムズ社では一般的な名前を使用することをお勧めします。

メタデータをクライアントサイドスクリプトでライブストリームに追加するには、次のコードを使用します。

 

var metaData:Object = new Object();

metaData.title = "myStream";

metaData.width = 400;

metaData.height = 200;

ns.send("@setDataFrame", "onMetaData", metaData);

メタデータをクライアントサイドスクリプトでライブストリームから消去するには、次のコードを使用します。

ns.send("@clearDataFrame", "onMetaData");

メタデータをサーバーサイドスクリプトでライブストリームに追加するには、次のコードを使用します。

s = Stream.get("myStream");

metaData = new Object();

metaData.title = "myStream";

metaData.width = 400;

metaData.height = 200;

s.send("@setDataFrame", "onMetaData", metaData);

メタデータをサーバーサイドスクリプトでライブストリームから消去するには、次のコードを使用します。

s.send("@clearDataFrame", "onMetaData");

 

メタデータの取得

メタデータは、クライアントサイドのコードだけから取得できます。サーバーサイドのコードからは取得できません。サーバーから @setDataFrameメッセージを送信する場合でも、メタデータはクライアントサイドのコードを使用して取得してください。

メタデータを取得するにはNetStream.client プロパティをオブジェクトに割り当てます次のようにそのオブジェクトでonMetaData 関数を定義します。

 

netstream.client = this;

 

function onMetaData(info:Object):void {

var key:String;

for (key in info) {

trace(key + ": " + info[key]);

}

}

この関数は、サーバーにより追加されたメタデータと@setDataFrame  とともに送信されたメタデータを出力します。

@setDataFrame  メッセージとともに送信するすべてのメッセージに加えて、サーバーにメタデータを追加させるには、次のように"record"フラグまたは "append"フラグを使用してビデオをパブリッシュします。

 

netstream.publish("mycamera", "record");

netstream.publish("mycamera", "append");

"live" フラグを使用してまたは typeパラメーターなしでライブビデオをサーバーにパブリッシュするとサーバーはビデオを記録しません。この場合は、サーバーは標準のメタデータをファイルに追加しません。

 

ストリームを再生するにはNetStream.play()を呼び出して startパラメーターの値を渡し、ストリームが記録されたライブストリームであることを示します。

 

netstream.play("mycamera", 0); // Plays a recorded live stream.

 

startパラメーターとして 0以上の値を渡すと、クライアントは、記録されたストリームを、所定の時刻から再生します。記録されたストリームには、サーバーによって追加される標準のメタデータが含まれます。サーバーが記録されたストリームを見つけられない場合はplay()メソッドを無視します。

 

startパラメーターとして -2または -1を渡すと、クライアントはライブビデオを再生し、標準のメタデータを受け取りません。

 

netstream.play("mycamera", -2); // Looks for a live stream first.

netstream.play("mycamera", -1); // Plays a live stream.

 

例:ライブビデオへのメタデータの追加

この例では、クライアントアプリケーションは以下の動作を行います。

•   ビデオをキャプチャしエンコードします。

•   キャプチャした状態でビデオを表示します。

•    ビデオをクライアントから Adobe Media Server にストリーミングします。

•   メタデータを、ライブストリームを再生するときクライアントに送信するサーバーに送信します。

•    ボタンを押すと、逆にビデオを Adobe Media Server からクライアントにストリーミングします。

•   サーバーからストリーミングされたビデオを表示します。

•   TextArea コンポーネントでサーバーから送信されたメタデータを表示します。

注意このコードをテストするには、サーバーに RootInstall/applications/publishlive フォルダーを作成します。次に、RootInstall/documentation/samples/metadata/Metadata.swf  ファイルを開いてアプリケーションに接続します。

1    Adobe Media Server に、RootInstall/applications/publishlive フォルダーを作成します。

2    Flash で、ActionScript ファイルを作成して Metadata.as という名前で保存します。

 次のコードを Script ウィンドウにコピーアンドペーストします。

 

package {

import flash.display.MovieClip;

import flash.net.NetConnection;

import flash.events.NetStatusEvent;

import flash.events.MouseEvent;

import flash.events.AsyncErrorEvent;

import flash.net.NetStream;

import flash.media.Video;

import flash.media.Camera;

import flash.media.Microphone;

import fl.controls.Button;

import fl.controls.Label;

import fl.controls.TextArea;

public class Metadata extends MovieClip {

private var nc:NetConnection;

private var ns:NetStream;

private var nsPlayer:NetStream;

private var vid:Video;

private var vidPlayer:Video;

private var cam:Camera;

private var mic:Microphone;

private var clearBtn:Button;

private var startPlaybackBtn:Button;

private var outgoingLbl:Label;

private var incomingLbl:Label;

private var myMetadata:Object;

private var outputWindow:TextArea;

 

public function Metadata(){

setupUI();

nc = new NetConnection();

nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);

nc.connect("rtmp://localhost/publishlive");

}

 

/*

*  Clear the MetaData associated with the stream

*/

private function clearHandler(event:MouseEvent):void {

if (ns){

trace("Clearing MetaData");

ns.send("@clearDataFrame", "onMetaData");

}

}

 

private function startHandler(event:MouseEvent):void {

displayPlaybackVideo();

}

 

private function onNetStatus(event:NetStatusEvent):void {

trace(event.target + ": " + event.info.code);

switch (event.info.code)

{

case "NetConnection.Connect.Success":

publishCamera();

displayPublishingVideo();

break;

case "NetStream.Publish.Start":

sendMetadata();

break;

}

}

 

private function asyncErrorHandler(event:AsyncErrorEvent):void {

trace(event.text);

}

private function sendMetadata():void {

trace("sendMetaData() called");

myMetadata = new Object();

myMetadata.customProp = "Welcome to the Live feed of YOUR LIFE, already in progress.";

ns.send("@setDataFrame", "onMetaData", myMetadata);

}

private function publishCamera():void {

cam = Camera.getCamera();

mic = Microphone.getMicrophone();

ns = new NetStream(nc);

ns.client = this;

ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);

ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);

ns.attachCamera(cam);

ns.attachAudio(mic);

ns.publish("myCamera", "record");

}

private function displayPublishingVideo():void {

vid = new Video(cam.width, cam.height);

vid.x = 10;

vid.y = 10;

vid.attachCamera(cam);

addChild(vid);

}

private function displayPlaybackVideo():void {

nsPlayer = new NetStream(nc);

nsPlayer.client = this;

nsPlayer.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);

nsPlayer.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);

nsPlayer.play("myCamera", 0);

vidPlayer = new Video(cam.width, cam.height);

vidPlayer.x = cam.width + 100;

vidPlayer.y = 10;

vidPlayer.attachNetStream(nsPlayer);

addChild(vidPlayer);

}

 

private function setupUI():void {

outputWindow = new TextArea();

outputWindow.move(250, 175);

outputWindow.width = 250;

outputWindow.height = 150;

 

outgoingLbl = new Label();

incomingLbl = new Label();

outgoingLbl.width = 150;

incomingLbl.width = 150;

outgoingLbl.text = "Publishing Stream";

incomingLbl.text = "Playback Stream";

outgoingLbl.move(30, 150);

incomingLbl.move(300, 150);

 

startPlaybackBtn = new Button();

startPlaybackBtn.width = 150;

startPlaybackBtn.move(250, 345);

startPlaybackBtn.label = "View Live Event";

startPlaybackBtn.addEventListener(MouseEvent.CLICK, startHandler);

 

clearBtn = new Button();

clearBtn.width = 100;

clearBtn.move(135,345);

clearBtn.label = "Clear Metadata";

clearBtn.addEventListener(MouseEvent.CLICK, clearHandler);

 

addChild(clearBtn);

addChild(outgoingLbl);

addChild(incomingLbl);

addChild(startPlaybackBtn);

addChild(outputWindow);

}

 

public function onMetaData(info:Object):void {

var key:String;

for (key in info){

outputWindow.appendText(key + ": " + info[key] + "\n");

}

}

}

}

 ファイルを保存します。

5    File New Flash FileActionScript 3.0)を選択しOK」をクリックします。

6    ファイルを Metadata.as ファイルと同じフォルダーに、Metadata.fla という名前で保存します。

7    コンポーネントパネルを開き、Buttonおよび TextAreaコンポーネントをステージまでドラッグして削除します。

この操作により、コンポーネントがライブラリに追加されます。コンポーネントは実行時にアプリケーションに追加されます。

 

8    ファイル/パブリッシュ設定を選択します。[Flash] タブをクリックしますScript Settings」をクリックし、 Metadata Document クラスとして入力します。チェックマークをクリックしてパスを検証します。

9    ファイルを保存し、Control Test Movie を選択してアプリケーションを実行します。

 

Flash Media Live Encoder のメタデータプロパティ

Flash Media Live Encoder は、次のメタデータプロパティと値を設定します。ユーザーがライブストリームにこれらのメタデータを追加する必要はありません。

 

メタデータのプロパティ名

データ型

説明

lastkeyframetimestamp

数値

最後にビデオのキーフレームが記録されたときのタイムスタンプ。

width

数値

ビデオの幅(ピクセル単位

height

数値

ビデオの高さ(ピクセル単位

videodatarate

数値

ビデオのビットレート。

audiodatarate

数値

オーディオのビットレート。

framerate

数値

記録されているビデオの 1 秒あたりのフレーム数。

creationDate

文字列

ファイルの作成日。

createdby

文字列

ファイルのクリエータータイプ。

audiocodecid

数値

ファイルで使用されているオーディオコーデック ID。値は次の通りです。

0 非圧縮

1 ADPCM

 

2 MP3

5 Nellymoser 8 kHz モノラル

 

6 Nellymoser

 

10HE-AAC

 

11Speex

videocodecid

数値

ファイルで使用されているビデオコーデック ID。値は次の通りです。

2 Sorenson H.263

3 Screen video

 

4 On2 VP6

5 On2 VP6(透過情報付き)

 

7 H.264

audiodelay

数値

オーディオコーデックで発生する遅延(秒単位

 

記録されるライブストリームのメタデータプロパティ

ストリーミング時にファイルを記録する場合、次の表に示されるメタデータが Adobe Media Server によって追加されます。サーバーにパブリッシュするときにファイルを記録するには、次のように「record」パラメーターを使用します。

 

ns.publish("myCamera", "record");

 

メタデータのプロパティ名

データ型

説明

audiocodecid

数値

ファイルで使用されているオーディオコーデック ID。値は次の通りです。

0 非圧縮

1 ADPCM

 

2 MP3

5 Nellymoser 8 kHz モノラル

 

6 Nellymoser

 

10HE-AAC

 

11Speex

canSeekToEnd

ブール値

最後のビデオフレームがキーフレームかどうか(キーフレームの場合はtrue、それ以外は false

createdby

文字列

ファイルの作成者の名前。

duration

数値

ファイルの全体の長さを秒数で示します。

creationDate

文字列

ファイルの作成日。

videocodecid

数値

ファイルで使用されているビデオコーデック ID。値は次の通りです。

2 Sorenson H.263

3 Screen video

 

4 On2 VP6

5 On2 VP6(透過情報付き)

 

7 H.264

 

NetStream.publish() 呼び出しでrecordフラグを使用すると、サーバーはユーザーのメタデータプロパティと標準のメタデータプロパティとマージしようとします。両者の間にコンフリクトがあると、サーバーは標準のメタデータプロパティを使用します。例えば、ユーザーが次のメタデータプロパティを追加するとします。

 

duration=5

x=200

y=300

サーバーによってビデオの記録が開始されるとdurationを含む独自のメタデータプロパティのファイルへの書き込みを開始します記録時間が 20秒の場合サーバーはメタデータに duration=20を追加しますその際ユーザーが指定した値は上書きされます。ただしx=200y=300はコンフリクトしていないので、これらの値はメタデータとして保存されます。audiocodecidvideocodecidcreationdat など、サーバーが設定する他のプロパティは、そのままファイルに保存されます。

ストリームが記録されると、キーフレームから記録が始まります。また、キーフレームまたは I フレームで即座に記録が停止します。

 

 

 

最終更新日 2013/9/30