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 パラメーターは、受信したメタデータを処理する関数を指定します。複数のデータキーフレームを作成することができます。データキーフレームはそれぞれ固有のハンドラーを使用する必要があります(例えば onMetaData1、 onMetaData2 など)。
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 という名前で保存します。
3 次のコードを 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");
}
}
}
}
4 ファイルを保存します。
5 File / New / Flash File(ActionScript 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=200と y=300はコンフリクトしていないので、これらの値はメタデータとして保存されます。audiocodecid、videocodecid、creationdate など、サーバーが設定する他のプロパティは、そのままファイルに保存されます。
ストリームが記録されると、キーフレームから記録が始まります。また、キーフレームまたは I フレームで即座に記録が停止します。
最終更新日 2013/9/30