Preview only show first 10 pages with watermark. For full document please download

Adobe Flash Media Server 3.5 開発者ガイド

   EMBED


Share

Transcript

ADOBE FLASH MEDIA SERVER 3.5 開発者ガイド ® ® © 2009 Adobe Systems Incorporated. All rights reserved. Adobe® Flash® Media Server 3.5 開発者ガイド 本マニュアルがエンドユーザー使用許諾契約を含むソフトウェアと共に提供される場合、本マニュアルおよびその中に記載されているソフトウェアは、エンドユーザー使 用許諾契約にもとづいて提供されるものであり、当該エンドユーザー使用許諾契約の契約条件に従ってのみ使用または複製することが可能となるものです。当該エンド ユーザー使用許諾契約により許可されている場合を除き、本マニュアルのいかなる部分といえども、Adobe Systems Incorporated(アドビ システムズ社)の書面による 事前の許可なしに、電子的、機械的、録音、その他いかなる形式・手段であれ、複製、検索システムへの保存、または伝送を行うことはできません。本マニュアルの内容 は、エンドユーザー使用許諾契約を含むソフトウェアと共に提供されていない場合であっても、著作権法により保護されていることにご留意ください。 本マニュアルに記載される内容は、あくまでも参照用としてのみ使用されること、また、なんら予告なしに変更されることを条件として、提供されるものであり、従って、 当該情報が、アドビ システムズ社による確約として解釈されてはなりません。アドビ システムズ社は、本マニュアルにおけるいかなる誤りまたは不正確な記述に対して も、いかなる義務や責任を負うものではありません。 新しいアートワークを創作するためにテンプレートとして取り込もうとする既存のアートワークまたは画像は、著作権法により保護されている可能性のあるものであるこ とをご留意ください。保護されているアートワークまたは画像を新しいアートワークに許可なく取り込んだ場合、著作権者の権利を侵害することがあります。従って、著 作権者から必要なすべての許可を必ず取得してください。 例として使用されている会社名は、実在の組織を示すものではありません。 Adobe, the Adobe logo, Adobe AIR, Adobe Premiere, ActionScript, Acrobat Connect, Creative Suite, Dreamweaver, Flash, Flash Lite, Flex, Flex Builder, and XMP are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries. Java is a trademark or registered trademark of Sun Microsystems, Inc. in the United States and other countries. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Mac is a trademark of Apple Inc., registered in the United States and other countries. All other trademarks are the property of their respective owners. This work is licensed under the Creative Commons Attribution Non-Commercial 3.0 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/3.0/us/ Sorenson Spark™ video compression and decompression technology licensed from Sorenson Media, Inc. Speech compression and decompression technology licensed from Nellymoser, Inc. (www.nellymoser.com) Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA. Notice to U.S. Government End Users. The Software and Documentation are “Commercial Items,” as that term is defined at 48 C.F.R. §2.101, consisting of “Commercial Computer Software” and “Commercial Computer Software Documentation,” as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202, as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States. Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, USA. For U.S. Government End Users, Adobe agrees to comply with all applicable equal opportunity laws including, if appropriate, the provisions of Executive Order 11246, as amended, Section 402 of the Vietnam Era Veterans Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the regulations at 41 CFR Parts 60-1 through 60-60, 60-250, and 60-741. The affirmative action clause and regulations contained in the preceding sentence shall be incorporated by reference. iii 目次 第 1 章:はじめに サーバーエディションについて Flash Media Server の概要 開発環境設定 ............................................................................................. 1 ................................................................................................ 1 ............................................................................................................. 3 Hello World アプリケーションの作成 アプリケーションの作成 ....................................................................................... 3 ................................................................................................... 6 アプリケーションのテスト ................................................................................................. 8 アプリケーションのデプロイメント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 第 2 章:ストリーミングサービス ストリーミングサービスについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ライブサービスの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 VOD サービスの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 ストリーミングサービス用のクライアントの作成 ストリーミングサービス API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 第 3 章:メディアアプリケーションの開発 メディアアプリケーションについて サーバーへの接続 接続の管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 記録済みメディアファイルのストリーミング エラーの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 再生リストの操作 動的ストリーミング 帯域幅の検出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 ストリームの長さの検出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 第 4 章:ビデオの操作 ライブビデオのキャプチャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 ライブビデオへの DVR 機能の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 ライブストリームへのメタデータの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 サーバーからサーバーへのパブリッシュ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 第 5 章:インタラクティブアプリケーションの開発 インタラクティブアプリケーションについて 共有オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 アセットに対するアクセスの許可または拒否 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 FLASH MEDIA SERVER 3.5 開発者ガイド iv 目次 クライアントの認証 ユーザーの認証 索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 1 第 1 章:はじめに サーバーエディションについて Adobe® Flash® Media Server は、ストリーミングメディアと対話機能を組み合わせた、リッチなメディアアプリケーション を構築するための製品です。Flash Media Server は、迅速に機動することができます。また、ライブビデオストリームや、 ユーザーの帯域幅に基づいた可変ストリーミングレートの機能も備えています。 Flash Media Server には、次の 3 種類のエディションがあります。 Flash Media Interactive Server サーバーのすべての機能を備えたエディションです。 Flash Media Development Server Flash Media Interactive Server の開発用バージョンです。同等の機能をすべてサ ポートしていますが、接続数に制限があります。 Flash Media Streaming Server ライブストリーミングサービスと VOD ストリーミングサービスのみをサポートしてい ます。このサーバーエディションでは、サーバーサイドスクリプトやストリームの記録はサポートされません。 各エディションがサポートする機能の詳細については、www.adobe.com/go/learn_fms_techov_jp にある『技術概要』を 参照してください。 Flash Media Server の概要 クライアントサーバーアーキテクチャ Flash Media Server はハブとして機能します。アプリケーションは、Real-Time Messaging Protocol を使用してハブに接 続します。サーバーは、接続されている多くのユーザーとの間でデータを送受信できます。ユーザーは、Adobe Flash Player や Adobe AIR™ を実行しているコンピュータに接続された PC カメラやマイクを使用してライブのビデオやオーディ オをキャプチャし、それをサーバーにパブリッシュして世界中の多数のユーザーにストリーミングすることができます。世 界中のユーザーが 1 つのオンラインゲームに参加しているかのように、すべての動きが同期されてすべてのユーザーに届け られます。 ユーザーはネットワーク接続によってサーバーに接続します。接続は大きなパイプのようなものであり、多数のデータスト リームを伝送することができます。それぞれのストリームは 1 方向に向かっており、1 つのクライアントとサーバーとの間 でコンテンツを伝送します。1 台のサーバーは同時に多数の接続を扱うことができます。接続数はサーバーの処理能力に よって異なります。 Flash Media Server 上で実行されるアプリケーションは、クライアントサーバーアーキテクチャに基づいています。クライ アントアプリケーションは Adobe Flash または Adobe Flex™ で開発され、Flash Player、Adobe AIR または Flash Lite™ 3 で実行されます。クライアントアプリケーションは、オーディオやビデオのキャプチャや表示と、ユーザーとの対話の処理 を実行できます。サーバーアプリケーションはサーバー上で実行され、クライアント接続と権限の管理、サーバーのファイ ルシステムへの書き込みなどのタスクを実行します。 サーバーへの接続は、クライアント側から開始される必要があります。接続されると、クライアントはサーバーや他のクラ イアントと通信することができます。より具体的に言えば、クライアントはサーバー上で実行されるアプリケーションの 「インスタンス」に接続します。アプリケーションインスタンスの例として、さまざまなユーザーグループ用に異なる部屋が 用意されたオンラインゲームがあります。この場合、それぞれの部屋が 1 つのインスタンスに例えられます。 多数のアプリケーションインスタンスを同時に実行することができます。各アプリケーションインスタンスは固有の名前を 持ち、クライアントに対して固有のリソースを提供します。複数のクライアントが同一のアプリケーションインスタンスに 接続したり、異なるインスタンスに接続したりすることができます。 FLASH MEDIA SERVER 3.5 開発者ガイド 2 はじめに scrabble/room 2 Flash インターフェイス sudoku/room 1 Flash Player sudoku/room 2 ブラウザ Flash インターフェイス Flex インターフェイス Flash Player Flash Player ブラウザ ブラウザ Flash Media Server 上で実行される複数のアプリケーション(sudoku、scrabble)および複数のアプリケーションインスタンス(room 2、room 1、 room 2)に接続する複数のクライアント メディアアプリケーションの構成要素 クライアントアプリケーションは ActionScript™ で記述され、SWF ファイルにコンパイルされます。サーバーアプリケー ションはサーバーサイド ActionScript で記述されます。これは ActionScript 1.0 に似ていますが、クライアントではなく サーバー上で実行されます。メディアアプリケーションには通常、記録済み、またはライブのオーディオやビデオが含まれ ており、サーバーからクライアントに、クライアントからサーバーに、またはサーバーからサーバーにストリーミングされ ます。 典型的な Flash Media Server アプリケーションには、以下の構成要素があります。 クライアントのユーザーインターフェイス クライアントには、ビデオの開始、停止、一時停止のためのコントロールなどの ユーザーインターフェイスが表示されます。ユーザーインターフェイスは Flash Player、Adobe AIR または Flash Lite 3 で 実行でき、Adobe Flash や Adobe Flex を使用して開発できます。 クライアントサイド ActionScript クライアントには ActionScript コードを組み込むことができ、これによってユーザー インタラクションを処理したり、サーバーに接続したりすることができます。Flash Media Server 3 以降は、ActionScript 3.0、ActionScript 2.0 および ActionScript 1.0 をサポートしています。 ビデオまたはオーディオファイル 多くのメディアアプリケーションは、記録済みのオーディオやビデオをサーバーからクラ イアントにストリーミングします。Flash Media Server は、Flash Video(FLV)、MPEG-3(MP3)、MPEG-4(MP4 お よび F4V)など、様々なストリーム形式の再生をサポートしています。 カメラまたはマイク Adobe Flash Media Live Encoder を使用すると、ライブビデオやオーディオをサーバーにストリーミ ングすることができます。また、ライブオーディオやビデオをキャプチャする独自のクライアントを作成することもできま す。どちらの場合も、ビデオやオーディオをキャプチャするには、カメラとマイクが必要です。 サーバーサイド ActionScript ほとんどのアプリケーションでは、.asc の拡張子を持つファイルに記述された、サーバーサ イド ActionScript コードが使用されます。このファイルは「ActionScript コミュニケーションファイル」と呼ばれます。 このファイルの名前は、main.asc または myApplication.asc です。サーバーサイドコードは、サーバーで実行される処理 を扱います。例えば、オーディオやビデオをストリーミングしたり、ユーザーの接続時および切断時の処理を定義したりし ます。 FLASH MEDIA SERVER 3.5 開発者ガイド 3 はじめに 開発環境設定 サーバーのインストール アプリケーションの開発およびテストには、無償のデベロッパー版を使用することができます。サーバーと同一のコン ピュータに Flash または Flex をインストールするのが、最も簡単な開発環境の設定方法です。 サーバーのインストール ❖ インストーラを実行し、Flash Media Server のエディションをインストールします。 サーバーの起動 サーバーをインストールする際、コンピュータの起動時にサーバーを自動的に起動するかどうかを設定することができます。 サーバーが起動していない場合は、手動で起動することができます。 1 スタートメニューから、すべてのプログラム/ Adobe / Flash Media Server 3.5 / Start Adobe Flash Media Server 3.5 を選択します。 2 スタートメニューから、すべてのプログラム/ Adobe / Flash Media Server 3.5 / Start Flash Media Administration Server 3 を選択します。 注意:Administration Console を開くには、Administration Server が必要です(例えば、サーバーの trace() メッセー ジや接続数を確認する場合など)。 サーバーの実行状態の確認 1 コントロールパネル/管理ツール/サービスを選択します。サービスウィンドウで、Flash Media Administration Server と Flash Media Server の両方が開始されていることを確認します。 2 スタートアップ時の問題のトラブルシューティングを行うには、RootInstall/logs フォルダにあるログを確認します。 master.xx.log ファイルおよび core.xx.log ファイルには、エラー情報が表示されます。また、edge.xx.log ファイルに は、リッスンしているポートが表示されます。 Flash のインストール ❖ www.adobe.com/go/flash から Flash をダウンロードし、インストールします。 Flex インストール ❖ www.adobe.com/go/flex から Adobe Flex SDK または Adobe Flex Builder™ をダウンロードし、インストールします。 Hello World アプリケーションの作成 概要 注意:以下の節の内容は、Flash Media Interactive Server および Flash Media Development Server に該当します。Flash Media Streaming Server のサーバーサイドコードを記述することはできません。 FLASH MEDIA SERVER 3.5 開発者ガイド 4 はじめに このサンプルでは、クライアントからサーバーおよびサーバーからクライアントへのシンプルな通信を示します。ユーザー がボタンをクリックすると、クライアントはサーバーに接続します。クライアントは、文字列を返すサーバーサイドの関数 を呼び出します。サーバーが応答すると、クライアントはサーバーから送信された文字列を表示します。 サンプルファイルは、RootInstall\documentation\samples\HelloWorld フォルダにあります。 ユーザーインターフェイスを定義します 1 Flash を起動し、新規作成/ Flash ファイル(ActionScript 3.0)を選択します。 2 「ドキュメントクラス」フィールドに、HelloWorld と入力します。定義が欠けているのに関する ActionScript クラス の警告メッセージが表示された場合、「OK」をクリックします。次のセクションでは、クラスファイルを追加します。 3 ウインドウ/コンポーネントを選択します。「User Interface」をクリックし、Button ダブルクリックして stage 追加し ます。「プロパティ」タブで、インスタンス名として connectBtn と入力します。 4 ボタンの上に Label コンポーネントを追加し、インスタンス名として textLbl と入力します。 5 HelloWorld.fla という名前を付けてこのファイルを保存します。 クライアントファイルは、任意の場所に保存できます。 クライアントサイドスクリプトの記述 このスクリプトは、ボタンの 2 つのアクション(サーバーへの接続とサーバーからの切断)を提供します。このスクリプト は、接続時に文字列(「World」)を使用してサーバーを呼び出し、応答をトリガします。この応答によって返された文字列 (「Hello, World!」)が表示されます。 1 ファイル/新規/ ActionScript ファイルを選択します。「Target」テキストボックスに HelloWorld.fla と表示されてい ることを確認します。 2 パッケージを宣言して、必要な Flash クラスを読み込みます。 package { import import import import public } } flash.display.MovieClip; flash.net.Responder; flash.net.NetConnection; flash.events.MouseEvent; class HelloWorld extends MovieClip { 3 HelloWorld クラスの宣言内で、接続およびサーバー応答の変数を宣言します。 private var nc:NetConnection; private var myResponder:Responder = new Responder(onReply); 4 クラスのコンストラクタを定義します。ラベルとボタンの表示値を設定し、ボタンにイベントリスナーを追加します。 public function HelloWorld() { textLbl.text = ""; connectBtn.label = "Connect"; connectBtn.addEventListener(MouseEvent.CLICK, connectHandler); } 5 イベントリスナーのアクションを定義します。このアクションは、その時点のボタンのラベルによって異なります。 FLASH MEDIA SERVER 3.5 開発者ガイド 5 はじめに public function connectHandler(event:MouseEvent):void { if (connectBtn.label == "Connect") { trace("Connecting..."); nc = new NetConnection(); // Connect to the server. nc.connect("rtmp://localhost/HelloWorld"); // Call the server's client function serverHelloMsg, in HelloWorld.asc. nc.call("serverHelloMsg", myResponder, "World"); connectBtn.label = "Disconnect"; } else { trace("Disconnecting..."); // Close the connection. nc.close(); connectBtn.label = "Connect"; textLbl.text = ""; } } 6 応答関数を定義します。この関数により、ラベルの表示値を設定します。 private function onReply(result:Object):void { trace("onReply received value: " + result); textLbl.text = String(result); } 7 ファイルを HelloWorld.fla ファイルと同じフォルダに、HelloWorld.as という名前で保存します。 サーバーサイドスクリプトの記述 1 ファイル/新規/ ActionScript コミュニケーションファイルを選択します。 2 サーバーサイド関数と接続ロジックを定義します。 application.onConnect = function( client ) { client.serverHelloMsg = function( helloStr ) { return "Hello, " + helloStr + "!"; } application.acceptConnection( client ); } 3 RootInstall/applications/HelloWorld フォルダ内に、HelloWorld.asc という名前を付けてこのファイルを保存しま す。ファイルを保存するときに、HelloWorld フォルダを作成します。 アプリケーションのコンパイルと実行 1 サーバーの実行状態の確認 . 2 HelloWorld.fla ファイルのタブを選択します。 3 制御/ムービープレビューを選択します。 4 「戻る」ボタンをクリックします。 「Hello, World!」と表示され、ボタンのラベルが「Disconnect」に変わります。 5 「戻る」ボタンをクリックします。 Flash 出力ウィンドウに、trace() ステートメントの出力が表示されます。 FLASH MEDIA SERVER 3.5 開発者ガイド 6 はじめに アプリケーションの作成 クライアントサイドコードの作成 クライアントでは ActionScript で記述されたコードが含まれており、サーバーへの接続、イベント処理など、さまざまな 処理を実行することができます。Flash では ActionScript 3.0、2.0、1.0 を使用することができますが、ActionScript 3.0 を使用することによって、多くの新機能が利用できます。Flex では、ActionScript 3.0 を使用する必要があります。 ActionScript の習得およびビデオの操作の詳細については、次のリソースを参照してください。 • www.adobe.com/go/learn_fms_video_jp にある『ActionScript 3.0 のプログラミング』の「ビデオの操作」 • 『ActionScript 3.0 コンポーネントリファレンスガイド』の付録「ActionScript 2.0 からの移行」 • www.adobe.com/go/learn_fms_as3lr_jp にある『ActionScript 3.0 コンポーネントリファレンスガイド』 • www.adobe.com/go/learn_fms_flashhrc_jp にある Flash ヘルプリソースセンタ • www.adobe.com/go/learn_fms_flexhrc_jp にある Flex ヘルプリソースセンタ 関連項目 11 ページの「Web サーバーへのクライアントサイドファイルのコピー」 サーバーサイドコードの記述 通常、次のいずれかの処理を行うアプリケーションには、サーバーサイド ActionScript で記述されたサーバーサイドコー ドが必要です。 クライアントの認証 ユーザー名とパスワードによってまたはアプリケーションサーバーやデータベースに格納された証明書 によって認証を行います。 接続ロジックの実装 クライアントの接続時または切断時に、アクションを実行します。 クライアントの更新 クライアント側のリモートメソッドを呼び出すか、接続されたすべてのクライアントに影響する共有オ ブジェクトを更新します。 ストリーム処理 サーバーとの間でやり取りされるストリームの再生、記録、管理を可能にします。 リモートサーバーへの接続 Web サービスを呼び出すか、アプリケーションサーバーやデータベースへのネットワークソ ケットを作成します。 サーバーサイドコードは、main.asc または yourApplicationName.asc という名前のファイルに置きます。ここで、 yourApplicationName は RootInstall/applications フォルダ内のフォルダです。例えば、skatingClips という名前のア プリケーションを作成するには、RootInstall/applications/skatingClips フォルダを作成します。サーバーサイドコード は、skatingClips フォルダ内の main.asc という名前のファイルまたは skatingClips.asc という名前のファイルに格納さ れます。 サーバーサイドコードは、アプリケーションディレクトリの最上位か、またはそのディレクトリ内の scripts サブディレク トリに格納します。例えば、次のいずれかの場所を使用することができます。 RootInstall/applications/appName RootInstall/applications/appName/scripts FLASH MEDIA SERVER 3.5 開発者ガイド 7 はじめに デフォルトでは、アプリケーションフォルダはインストールのルートフォルダ(Windows では C:\Program Files\Adobe\Flash Media Server 3.5\applications)にあります。アプリケーションフォルダの場所を設定するには、 fms.ini または Vhost.xml 設定ファイルを編集します。fms.ini ファイルでは、VHOST.APPSDIR = C:\Program Files\Adobe\Flash Media Server 3.5\applications パラメータを編集します。Vhost.xml ファイルでは、AppsDir エレメントを編 集します。 関連項目 10 ページの「サーバーサイドスクリプトファイルのサーバーへのコピー」 Client オブジェクトと Application オブジェクト サーバーサイドスクリプトは Client オブジェクトと Application オブジェクトの、2 つの特別なオブジェクトに対するアクセ ス権を持っています。クライアントが Flash Media Server 上のアプリケーションに接続すると、サーバーは、クライアント を表すための、サーバーサイドの Client クラスのインスタンスを作成します。1 つのアプリケーションには、数千ものクラ イアントが接続することができます。サーバーサイドコード内では、個々のクライアントとメッセージを送受信するために、 Client オブジェクトを使用できます。 また、各アプリケーションには 1 個の Application オブジェクトが含まれます。このオブジェクトは、サーバーサイドの Application クラスのインスタンスです。Application オブジェクトは、アプリケーションインスタンスを表します。このオ ブジェクトは、クライアントの受諾、切断、アプリケーションのシャットダウンなどに使用することができます。 ダブルバイト言語のアプリケーションの記述 ダブルバイトテキスト(アジア言語の文字セットなど)を使用するアプリケーションの開発でサーバーサイド ActionScript を使用する場合は、UTF-8 でエンコードされている main.asc ファイル内にサーバーサイドコードを置く必要があります。 Flash や Adobe Dreamweaver® のスクリプトウィンドウのような、ファイルを UTF-8 標準にエンコードする JavaScript エディタを使用します。Date.toLocaleString() のようなビルトイン JavaScript メソッドを使用して、文字列をロケールに変換 し、そのシステムに適したエンコード処理を行います。 一部のシンプルなテキストエディタでは、ファイルを UTF-8 標準にエンコードできない場合があります。しかし、一部の エディタでは「名前を付けて保存」オプションを使用して、ファイルを UTF-8 標準にエンコードできます。 Dreamweaver での UTF-8 エンコード設定 1 ドキュメントのエンコード設定を確認するには、修正/ページプロパティを選択し、次に「エンコーディング」を選択し ます。「UTF-8(Unicode)」を選択します。 2 インライン入力設定を変更するには、編集/環境設定(Windows)または Dreamweaver /環境設定(Mac OS)を選 択して、「一般」をクリックします。「ダブルバイトのインライン入力可」を選択して、ダブルバイトテキストを入力でき るようにします。 メソッド名でのダブルバイト文字の使用 ❖ メソッド名の割り当てには、ドット演算子ではなく、オブジェクトアレイ演算子を使用します。 // This is the CORRECT way to create double-byte method names obj["Any_hi_byte_name"] = function(){} // This is the INCORRECT way to create double-byte method names. obj.Any_hi_byte_name = function() {} FLASH MEDIA SERVER 3.5 開発者ガイド 8 はじめに アプリケーションのテスト クライアントサイドスクリプトのテストとデバッグ クライアントサイドスクリプトをテストする場合、trace() ステートメントを使用して、各処理ポイントを監視する方法が役 立ちます。出力内容は、Flash 出力ウィンドウに表示されます。これは 3 ページの「Hello World アプリケーションの作成」 の例です。 クライアントサイドスクリプトをデバッグするには、Flash のデバッグメニューを使用して、ブレークポイントの設定、関 数内でのステップ実行などの操作を行います。ウインドウ/パネルをデバッグを選択することによって、スクリプトの状態 を調べることができます。 サーバーサイドスクリプトのテストとデバッグ サーバーサイドスクリプトをテストするには、trace() ステートメントを使用して、各処理ポイントを監視します。trace() ス テートメントの出力を、Administration Console の Live Log で確認します。 Administration Console を開くには、スタート/すべてのプログラム/ Adobe / Flash Media Server 3.5 / Flash Media Administration Console を選択します。 クライアントがサーバーのアプリケーションに接続すると、アプリケーションが読み込まれ、Administration Console に 表示されます。Administration Console から直接アプリケーションを読み込むには、利用可能なアプリケーションの 「New Instance」リストで、アプリケーション名を選択します。また、アプリケーションを停止したり、再読み込みするこ ともできますが、これらの動作を実行すると、すべてのクライアントは切断されます。 注意:.asc ファイルを編集して保存しても、アプリケーションが再起動されるまで変更は有効になりません。 Administration Console を使用してアプリケーションを再起動してから、アプリケーションに再接続します。 それぞれのアプリケーションインスタンスのライブログ、クライアント、共有オブジェクト(存在する場合)、使用中のスト リーム、パフォーマンス統計を参照することができます。 FLASH MEDIA SERVER 3.5 開発者ガイド 9 はじめに 実行中のアプリケーションのパフォーマンスを Administration Console でチェックしている状態 サーバーサイドスクリプトの出力内容の参照 main.asc ファイル内の trace() ステートメントの出力は、次のログファイルに送られます。 RootInstall/logs/_defaultVHost_/yourApplicationName/yourInstanceName/application.xx.log yourInstanceName のデフォルトは _definst_ です。xx はインスタンス番号で、最新のログファイルは 00、1 つ前のイン スタンスは 01 で、以下同様に続きます。ログファイルは、任意のテキストエディタで参照することができます。 アプリケーションが実行中の場合は、Administration Console で Live Log を参照することができます。開いた Administration Console で、View Applications をクリックし、次に Live Log をクリックします。 Administration Console を使用したデバッグ ストリームの再生や共有オブジェクトのデータの検査を行うには、アプリケーションが Administration Console へ特別な デバッグ接続を行う必要があります。 デバッグセッションが利用可能であるかどうかおよびその数は、Application.xml 設定ファイルの AllowDebugDefault およ び MaxPendingDebugConnections エレメントで設定されます。デフォルトでは、デバッグは許可されません。 Application.xml ファイルのデバッグ設定を無効にするには、アプリケーションのサーバーサイドコードに次のコードを追 加します。 application.allowDebug = true; 注意:アプリケーションをデプロイする前に、allowDebug を false に設定します。 デバッグセッションを開始するには: 1 Administration Console を開きます。 2 「View Applications」を選択します。 3 デバッグするアプリケーションをリストから選択するか、「New Instance」を選択し、アプリケーションの新しいインス タンスを作成します。 4 再生中のストリームのリストを表示するには(存在する場合)、「Streams」ボタンを押します。 FLASH MEDIA SERVER 3.5 開発者ガイド 10 はじめに 5 いずれかのストリームをクリックします。 6 「Play Stream」ボタンを押します。 7 ポップアップウィンドウが表示され、ストリームが再生されます。 8 アプリケーションの共有オブジェクトを参照するには(存在する場合)、「Shared Objects」ボタンを押します。 9 共有オブジェクトを選択します。 10 デバッグセッションを終了するには、「Close Debug」ボタンを押します。 アプリケーションのデプロイメント アプリケーションのサーバーへの登録 アプリケーションに接続するには、アプリケーションが存在することをサーバーが認識している必要があります。このプロ セスを「アプリケーションのサーバーへの登録」と呼びます。アプリケーションをサーバーに登録するには、そのアプリ ケーション用のフォルダをアプリケーションフォルダに作成します。例えば、myApplication というアプリケーションを登 録するには、次のフォルダを作成します。 RootInstall/applications/myApplication このアプリケーションに接続するクライアントサイドコードは、次のようになります。 myNetConnection.connect("rtmp://fms.examples.com/myApplication"); アプリケーションのインスタンスを作成するには、サブフォルダを作成します。例えば、次のフォルダにより、room1 とい う myApplication のインスタンスが作成されます。 RootInstall/applications/myApplication/room1 このアプリケーションインスタンスに接続するクライアントサイドコードは、次のようになります。 myNetConnection.connect("rtmp://fms.examples.com/myApplication/room1"); すべてのアプリケーションは、アプリケーションフォルダ内にフォルダを持つ必要があります。通常は、アプリケーション フォルダにはサーバーサイドスクリプトとメディアアセットが含まれていますが、このフォルダは空の場合もあります。こ のフォルダには、アプリケーション固有の Application.xml ファイルが含まれていることもあります。 デフォルトでは、アプリケーションフォルダはインストールのルートフォルダ(Windows では C:\Program Files\Adobe\Flash Media Server 3.5\applications)内にあります。アプリケーションフォルダの場所を設定するには、 fms.ini または Vhost.xml 設定ファイルを編集します。fms.ini ファイルでは、VHOST.APPSDIR = C:\Program Files\Adobe\Flash Media Server 3.5\applications パラメータを編集します。Vhost.xml ファイルでは、AppsDir エレメントを編 集します。 サーバーサイドスクリプトファイルのサーバーへのコピー アプリケーションのサーバーサイドスクリプトファイルを、サーバー上で登録したフォルダにコピーします。例えば、 videoPlayer というアプリケーションの場合、main.asc ファイルを RootInstall/applications/videoPlayer にコピーしま す。サーバーサイドスクリプトは、「scripts」サブフォルダに置くこともできます。例えば、次のいずれかの場所を使用す ることができます。 RootInstall/applications/appName RootInstall/applications/appName/scripts 注意:実行中のアプリケーションを置き換えるには、新しいファイルをコピーしてから、Administration Console を使用 してアプリケーションを再起動します。 FLASH MEDIA SERVER 3.5 開発者ガイド 11 はじめに サーバーサイドファイルのパッケージ化 Flash Media Server には、コマンドラインのアーカイブコンパイラユーティリティ(far.exe)が含まれています。このユー ティリティを使用すると、サーバーサイドスクリプトを FAR ファイル(ZIP ファイルに似たアーカイブファイル)にパッ ケージ化することができるため、デプロイメントが容易になります。また、このアーカイブコンパイラユーティリティを使 用して、サーバーサイドのスクリプトファイルをバイトコード(拡張子は .ase)にコンパイルできるため、アプリケーショ ンインスタンスの読み込みに要する時間を短縮することができます。 大規模なアプリケーションには、異なる場所に格納されている複数のサーバーサイドのスクリプトファイルを含めることが できます。いくつかのファイルはアプリケーションディレクトリに置かれ、他のファイルはサーバーの設定ファイルに定義 されているスクリプトライブラリのパスに置かれます。メディアアプリケーションのデプロイメントを簡素化するためには、 サーバーサイドの JS、ASC、ASE の各ファイルを Flash Media Server アーカイブファイル(FAR ファイル)にパッケージ 化します。 FAR ファイルは、メインのスクリプトファイル(main.js、main.asc、main.ase、applicationName.js、 applicationName.asc、applicationName.ase のいずれか)と、そのメインのスクリプトで参照されるその他のスクリプ トファイルを含むパッケージです。 アーカイブコンパイラユーティリティを実行してスクリプトパッケージを作成するためのシンタックスは、次のとおりです。 c:\> far -package -archive -files [ ... ] 次の表は、far -package で使用できるコマンドラインオプションの説明です。 オプション 説明 -archive archive アーカイブファイルのファイル名を指定します。アーカイブファイルの拡張子は .far です。 -files file1 [ file2 ... fileN ] アーカイブファイルに入れるファイルのリストを指定します。少なくとも 1 つのファイルを指定する 必要があります。 注意:メインのスクリプトがサブディレクトリ内のスクリプトを参照している場合は、アーカイブファイル内の階層を維持 する必要があります。この階層を維持するには、メインのスクリプトが置かれている同じディレクトリで FAR ユーティリ ティを実行することをお勧めします。 メディアファイルのサーバーへのコピー ビデオおよびオーディオファイルは、アプリケーションフォルダの streams/_definst_ フォルダにコピーします。 RootInstall/applications/someApplication/streams/_definst_/ アプリケーションがアプリケーションのインスタンスに接続する場合 (nc.connect("rtmp://fms.example.com/someApplication/someInstance") など)は、ストリームを次のフォルダに格納します。 RootInstall/applications/someApplication/streams/someInstance/ サーバーを設定して他の場所に格納されているメディアファイルを探す方法は複数あります。詳細については、次のリンク を参照してください。 関連項目 15 ページの「VOD サービスの使用」 Web サーバーへのクライアントサイドファイルのコピー SWF ファイルと HTML ファイルは任意の Web サーバーにデプロイできます。SWF ファイルには、Flash Media Server 上でアプリケーションに接続する NetConnection.connect() 呼び出しが含まれます。HTML ファイルは SWF ファイルのコ ンテナです。詳細については、www.adobe.com/go/documentation にある Flash のドキュメントを参照してください。 FLASH MEDIA SERVER 3.5 開発者ガイド 12 はじめに Flash Lite SWF ファイルまたは Adobe AIR コンテンツは、Flash Lite または AIR アプリケーションをデプロイする場合 と同じ方法でデプロイします。詳細については、www.adobe.com/go/documentation にある Flash Lite および Adobe AIR のドキュメントを参照してください。 デフォルトでは、Flash Media Server 3.5 以降は Apache HTTP Server と共にインストールされます。Web サーバーをイ ンストールして有効にすると、Flash Media Server がインストールされているコンピュータと同じコンピュータから SWF ファイルと HTML ファイルをデプロイすることができます。また、JPG、GIF およびその他多数のファイルタイプをデプ ロイすることもできます。Apache がデフォルトで配信するファイルの種類の完全なリストについては、 RootInstall/Apache2.2/conf/httpd.conf ファイルを参照してください。 デフォルトでは、Apache は次のエイリアスで設定されます。 エイリアス パス / RootInstall/webroot /cgi-bin/ RootInstall/Apache2.2/cgi-bin /local-cgi-bin/ RootInstall/Apache2.2/local-cgi-bin HTTP 経由でファイルを配信するには、ファイルを RootInstall/webroot フォルダまたは適切なサブフォルダに格納しま す。CGI プログラムを配信するには、ファイルを RootInstall/Apache2.2/cgi-bin フォルダに格納します。 これらのフォルダにサブフォルダを追加することもできます。サブフォルダに、fmshttpd.conf ファイルからの icons、 error、SWFs、vod、cgi-bin または local-cgi-bin という名前を使用することはできません。また、サブフォルダ名には予 約語 open、send、idle、fcs、fms を使用することはできません。 デフォルトでは、Apache は RootInstall/webroot フォルダからのすべての HTTP コンテンツを配信するように設定され ます。アプリケーション固有のディレクトリからのファイルを配信できるようにサーバーを設定するには、httpd.conf Apache 設定ファイルを編集します。 13 第 2 章:ストリーミングサービス ストリーミングサービスについて Flash Media Server バージョン 3 以降のすべてのエディションでは、ライブと VOD という 2 つのストリーミングサービス を提供しています。ライブサービスは、ライブビデオをストリーミングします。VOD サービスは、記録済みのビデオを要 求に応じてストリーミングします。ライブサービスと VOD サービスは、アドビによって署名されています。Flash Media Streaming Server でサポートされるのは、署名付きのサービスのみで、他のアプリケーションを実行することはできませ ん。Flash Media Interactive Server と Flash Media Development Server では、署名付きのサービスに加え、独自に作成 した他のアプリケーションもサポートされます。 これらのサービスは、Flash Media Server アプリケーションのサーバーサイドコンポーネントとして実装されています。こ の 2 つのサービスのサンプルクライアントが、サーバーと共にインストールされます。本番環境で使用するためにサンプル クライアントを変更したり、独自のクライアントを作成したりすることができます。ストリーミングサービスのサーバーサ イドのコードを変更することはできません。ただし、サービスには、サーバーサイドメソッドを呼び出すことができるカス タムのクライアントサイド API があります。 どちらのサービスも複製したり名前を変更したりして、複数のパブリッシュポイントを作成できます。サーバーがサポート できるサービスインスタンスの数に制限はありません。 Flash Media Server 3.5 は、Apache Web サーバーと共にインストールすることもできます。Apache をインストールする と、HTTP 経由でクライアントを配信することができます。また、RTMP および HTTP 経由でメディアを配信することも できます。 ライブサービスの使用 ライブサービスについて ライブサービスは、Flash Media Server のパブリッシュポイントです。以下のライブビデオソースでは、ライブサービスへ のパブリッシュを行うことができます。 • Flash Media Live Encoder、バージョン 2.0 以降 注意:Flash Media Live Encoder 認証アドインは、Flash Media Interactive Server と Flash Media Development Server でのみサポートされます。 • Flash Media Interactive Server と Flash Media Development Server 上で実行されるサーバーサイドスクリプト(70 ページの「サーバーからサーバーへのパブリッシュ」を参照) • カスタム構築された Flash Player または AIR アプリケーション 次のクライアントのどれを使用しても、ライブサービスからストリーミングされたビデオを再生することができます。 • Flash Media Server サンプルビデオ Player(RootInstall/samples/videoPlayer) • Flash FLVPlayback コンポーネント(fl.video.FLVPlayback) • Flex VideoDisplay コンポーネント(mx.controls.VideoDisplay) • Flash Player、AIR または Flash Lite 3 で実行されるカスタム構築されたアプリケーション FLASH MEDIA SERVER 3.5 開発者ガイド 14 ストリーミングサービス Flash Media Streaming Server では、ライブサービスでストリームの記録ができません。また、ライブサービスでは DVR 機能がサポートされません。無署名の(ユーザーが作成した)アプリケーションは Flash Media Interactive Server と Flash Media Development Server でサポートされます。これらのサーバーエディションのいずれかを使用している場合は、ライ ブサービスのソースコードを変更して DVR 機能を含む独自のアプリケーションを作成することができます。また、ライブ サービスを変更してライブストリームの記録を有効にすることもできます。 ライブサービスのテスト Flash Media Live Encoder を使用したライブサービスのテスト 1 コンピュータにカメラを接続します。 2 Flash Media Live Encoder を開いて、「Start」をクリックします。 デフォルトでは、Flash Media Live Encoder は livestream という名前のストリームを rtmp://localhost/live にパブリッ シュします。Flash Media Live Encoder がサーバーと同じコンピュータにインストールされている場合は、これらの設 定を使用してライブサービスに接続します。Flash Media Live Encoder が異なるコンピュータにインストールされてい る場合は、localhost を Flash Media Server の IP アドレスと置き換えます。 3 RootInstall/samples/videoPlayer/videoplayer.html ファイルをダブルクリックして、ブラウザでサンプルビデオ Player を開きます。 4 サンプルビデオ Player で、次のいずれかを行います。 • ビデオリストで、「livestream」をクリックします。 • rtmp://localhost/live/livestream を入力し、「LIVE」チェックボックスをチェックして、「PLAY STREAM」をク リックします。 カスタムの Flash Player アプリケーションによるライブサービスのテスト 1 コンピュータにカメラを接続します。 2 次のいずれかの操作を行います。 • スタート/すべてのプログラム/ Adobe / Flash Media Server 3.5 / Flash Media Server Start Screen を選択しま す。「Interactive」をクリックし、ライブビデオのサンプルを開きます。 • Apache Web サーバーを Flash Media Server とともにインストールしてある場合は、ブラウザで http://localhost/ を開き、「 Interactive 」をクリックしてライブビデオのサンプルを開きます。 • 「Publish」をクリックします。 ライブサービスの複製 1 RootInstall/applications/live フォルダをアプリケーションフォルダ内で複製し、live2 などの新しい名前を付けます。 この場合、新しいライブサービスは RootInstall/applications/live2 に格納されます。 ライブサービスのインスタンスの数は、必要に応じていくつでも作成することができます。 2 これでクライアントは、rtmp://flashmediaserver/live2 の URL から、パブリッシュポイントに接続できるようになります。 ライブサービスの変更 注意:Flash Media Streaming Server のライブサービスを変更することはできません。 1 RootInstall/applications フォルダにフォルダを作成するか、デフォルトの RootInstall/live フォルダを使用します。 FLASH MEDIA SERVER 3.5 開発者ガイド 15 ストリーミングサービス 2 次のいずれかの操作を行います。 • デフォルトの applications/live フォルダを使用している場合は、main.far ファイルを安全な場所に移動します。 RootInstall/samples/applications/live main.asc ファイルを applications/live フォルダにコピーします。 • 手順 1 でフォルダを作成した場合は、main.asc、Application.xml、allowedHTMLdomains.txt および allowedSWFdomains.txt ファイルを RootInstall/samples/applications/live フォルダから新規フォルダにコピー します。 3 RootInstall/conf/fms.ini ファイルをテキストエディタで開き、LIVE_DIR パラメータを編集して手順 1 で作成したフォ ルダをポイントします。 ライブストリームを HTTP または RTMP 経由で記録可能にするには、LIVE_DIR パラメータを RootInstall\webroot\live_recorded に設定します。このフォルダには次のアドレスから記録可能です。 ファイル形式 アドレス F4V http://serverName/live_recorded/fileName.f4v rtmp://serverName/live/live_recorded/mp4:fileName rtmp://serverName/live/live_recorded/mp4:fileName.f4v FLV http://serverName/live_recorded/fileName.flv rtmp://serverName/live/live_recorded/fileName rtmp://serverName/live/live_recorded/fileName.flv 手順 1 で作成したフォルダの Application.xml ファイルは、 タグの LIVE_DIR パラメータを使用します。 タグは、ストリームの仮想ディレクトリマッピングを指定します。 4 サーバーを再起動します。 ライブサービスの無効化 ❖ ライブサービスのフォルダを、アプリケーションフォルダから他の場所に移動します。 VOD サービスの使用 VOD サービスからのストリーミングメディア VOD(ビデオオンデマンド)サービスを使用すると、アプリケーションの構築やサーバーの設定を行わずに、記録済みメ ディアをクライアントにストリーミングすることができます。記録済みメディアファイルをサーバーにコピーするだけで、 クライアントでストリーミングすることができます。デフォルトでは、メディアファイルを次の場所にコピーします。 • RTMP 経由のみでファイルをストリーミングするには、ファイルを RootInstall/applications/vod/media にコピーし ます。 • RTMP 経由でファイルをストリーミングし、HTTP 経由でプログレッシブダウンロードするには、ファイルを RootInstall/webroot/vod にコピーします。 注意:HTTP 経由でファイルを配信するには、Apache をインストールします。 次のクライアントのどれを使用しても、VOD サービスからストリーミングされたビデオを再生することができます。 • Flash Media Server サンプルビデオ Player(RootInstall/samples/videoPlayer) • Flash FLVPlayback コンポーネント(fl.video.FLVPlayback) FLASH MEDIA SERVER 3.5 開発者ガイド 16 ストリーミングサービス • Flex VideoDisplay コンポーネント(mx.controls.VideoDisplay) • Flash Player、AIR または Flash Lite 3 で実行されるカスタム構築されたアプリケーションすべて VOD サービスのテスト 1 RootInstall/samples/videoPlayer/videoplayer.html ファイルをダブルクリックして、ブラウザでサンプルビデオ Player を開きます。 2 SOURCE: /applications/vod/media list または SOURCE: /webroot/vod list にある任意のビデオをクリックします。 3 独自のビデオをビデオ Player にストリーミングするには、次のいずれかを行います。 • RTMP 経由のみでメディアをストリーミングするには、ファイルを RootInstall/applications/vod/media フォルダ に置きます。 • Apache をインストールしていて、RTMP または HTTP 経由でメディアを配信したい場合は、ビデオファイルを RootInstall/webroot/vod フォルダに置きます。 4 ビデオのアドレスを「STREAM URL」テキストボックスに入力し、「VOD」をチェックして、「PLAY STREAM」を クリックします。 次の表に、ファイル形式とプロトコルに基づいた考えられるアドレスを示します。 ファイル形式 アドレス F4V http://serverName/vod/fileName.f4v rtmp://serverName/vod/mp4:fileName rtmp://serverName/vod/mp4:fileName.f4v FLV http://serverName/vod/fileName.flv rtmp://serverName/vod/fileName rtmp://serverName/vod/fileName.flv 注意:ローカルホストを HTTP の serverName として使用するには、ポート番号 8134 を追加します。例えば、 http://localhost:8134/vod/video.f4v となります。サーバーは、ポート 8134 を HTTP に内部で使用します。 5 Administration Console を開くには、スタート/すべてのプログラム/ Adobe / Flash Media Server 3.5 / Flash Media Administration Console を選択します。サーバーにログインして、VOD サービスが実行されていることを確認 します。 注意:HTTP 経由でビデオを再生するときは、クライアントは VOD アプリケーションに接続しません。代わりに、 Apache がクライアントにビデオを配信します。 VOD サービス設定パラメータ RootInstall/conf/fms.ini ファイルの 2 つのパラメータは、VOD アプリケーションのメディアフォルダの場所を識別しま す。 VOD_COMMON_DIR = C:\Program Files\Adobe\Flash Media Server 3.5\webroot\vod VOD_DIR = C:\Program Files\Adobe\Flash Media Server 3.5\applications\vod\media RootInstall/applications/vod フォルダの Application.xml ファイルは、 タグのこれらのパラメータを使用して ストリームの仮想ディレクトリマッピングを指定します。サーバーは、 タグの Application.xml ファイルでの表 示順でメディアを探します。 FLASH MEDIA SERVER 3.5 開発者ガイド 17 ストリーミングサービス Apache をインストールした場合、RTMP および HTTP 経由でメディアをストリーミングすることができます。メディア ファイルを VOD_COMMON_DIR パラメータに指定したフォルダに置きます。RTMP 経由のみでメディアをストリーミン グするには、メディアファイルを VOD_DIR パラメータに指定したフォルダに置きます。メディアファイルは次のアドレス で利用可能です。 ファイル形式 アドレス F4V http://serverName/vod/fileName.f4v rtmp://serverName/vod/mp4:fileName rtmp://serverName/vod/mp4:fileName.f4v FLV http://serverName/vod/fileName.flv rtmp://serverName/vod/fileName rtmp://serverName/vod/fileName.flv VOD サービスの複製 サーバーは VOD サービスのインスタンスを無制限の数サポートしています。 1 RootInstall/applications/vod フォルダをアプリケーションフォルダ内で複製し、vod2 などの新しい名前を付けます。 この場合、新しい VOD サービスは RootInstall/applications/vod2 に格納されます。 VOD サービスのインスタンスの数は、必要に応じていくつでも作成することができます。 2 これでクライアントは、rtmp://flashmediaserver/vod2 の URL から、VOD サービスに接続できるようになります。 3 (RootInstall/conf に格納されている)fms.ini ファイルを開き、次の操作を行います。 • パラメータを追加し、新しいサービスのコンテンツパスを設定します。例えば、VOD2_DIR = C:\Program Files\Adobe\Flash Media Server 3.5\applications\vod2\media のようにします。 • Apache をインストールしていて、HTTP 経由でメディアファイルを利用したい場合は、新しい VOD2_COMMON_DIR パラメータ VOD2_COMMON_DIR = C:\Program Files\Adobe\Flash Media Server 3.5\webroot\vod2 を追加します。 4 RootInstall/applications/vod2 フォルダの Application.xml ファイルを開き、次の操作を行います。 • 仮想ディレクトリを次のように編集します。/;${VOD2_DIR} • 仮想ディレクトリを次のように編集します。/;${VOD2_COMMON_DIR} 5 記録済みメディアファイルを次の場所に置きます。 • RTMP 経由でのみストリーミングされるファイルを C:\Program Files\Adobe\Flash Media Server 3.5\applications\vod\media フォルダに置きます。 • RTMP または HTTP 経由でストリーミングされるファイルを C:\Program Files\Adobe\Flash Media Server 3.5\webroot\vod2 に置きます。 注意:URL には、media サブディレクトリを指定する必要はありません。media ディレクトリは、fms.ini ファイル内 に設定したパスに指定されています。 VOD サービスの変更 注意:Flash Media Streaming Server の VOD サービスを変更することはできません。 1 RootInstall/applications フォルダにフォルダを作成したり、デフォルトの RootInstall/vod フォルダを使用したりし ます。 FLASH MEDIA SERVER 3.5 開発者ガイド 18 ストリーミングサービス 2 次のいずれかの操作を行います。 • デフォルトの applications/vod フォルダを使用している場合は、main.far ファイルを安全な場所に移動します。 RootInstall/samples/applications/vod main.asc ファイルを applications/vod フォルダにコピーします。 • 手順 1 でフォルダを作成した場合は、main.asc、Application.xml、allowedHTMLdomains.txt および allowedSWFdomains.txt ファイルを RootInstall/samples/applications/vod フォルダから新規フォルダにコピー します。 3 RootInstall/conf/fms.ini ファイルをテキストエディタで開き、VOD_DIR パラメータと VOD_COMMON_DIR パラ メータを編集して正しい場所を指定します。 4 サーバーを再起動します。 VOD サービスの無効化 ❖ VOD サービスのフォルダを、アプリケーションフォルダから他の場所に移動します。 ストリーミングサービス用のクライアントの作成 サンプルビデオ Player の使用 Flash Media Server Start Screen には埋め込み済みビデオ Player が付属しています。ビデオ Player を使用すると、インス トール直後にサーバーからストリーミングされているビデオの閲覧が可能になります。Start 画面で提供されているコードを 使用して、ビデオ Player を独自のアプリケーションに埋め込みます。 RootInstall/samples/videoplayer でビデオ Player を調べ、好みに合わせて変更することができます。 Flash FLVPlayback コンポーネントの使用 Flash 8 以降で使用可能な FLVPlayback コンポーネントは、vod とライブサービスのクライアントとして使用することがで きます。source(ActionScript 2.0 の場合は contentPath)パラメータをストリームの完全 URL に設定します。ライブサー ビスに接続するには、isLive パラメータを true に設定します。Component インスペクタまたは ActionScript のパラメータ を設定できます。 source(または contentPath)パラメータをストリームの URL に設定します。/media フォルダはパスに含めないでくださ い。例えば、サンプルファイルのパスは rtmp://localhost/vod/sample.flv です。 Flex VideoDisplay コンポーネントの使用 Flex VideoDisplay コントロールを使用して、FLV または F4V ファイルを Flex アプリケーションで再生することができま す。このコンポーネントは HTTP を介したプログレッシブダウンロード、Flash Media Server からのストリーミングおよ び Camera オブジェクトからのストリーミングをサポートします。source パラメータをストリームの完全 URL に設定しま す。/media フォルダはパスに含めないでください。例えば、サンプルファイルのパスは rtmp://localhost/vod/sample です。 ライブビデオをストリーミングするには、live パラメータを true に設定します。 ストリーミングサービスへの接続 すべての Flash Media Server アプリケーションと同様に、ストリーミングサービスは NetConnection.connect() URI を次の 形式とみなします。 FLASH MEDIA SERVER 3.5 開発者ガイド 19 ストリーミングサービス rtmp://hostName/serviceName/[formatType:][instanceName/]fileOrStreamName hostName Flash Media Server のドメイン名です。 serviceName live または vod のいずれかです。 instanceName クライアントの接続先がデフォルトのインスタンスの場合には、インスタンス名を省略するか、または _definst_ を使用することができます。クライアントの接続先が、room1 など、独自に作成したインスタンスの場合は、そ の名前を使用します。 formatType mp3 ファイルの場合は mp3:、MP4/F4V ファイルの場合は mp4:、FLV ファイルの場合は不要です。 fileOrStreamName ファイル名(my_video.mp4 など)またはパス(subdir/subdir2/my_video.mp4 など)。例えば rtmp://www.examplemediaserver.com/vod/mp4:ClassicFilms/AnOldMovie.mp4。MPEG-4 ベースのファイルでは、サーバー上 のファイルにファイル名拡張子(mp4、.f4v など)が使用されている場合は、これを指定します。ストリームがライブで、 パブリッシャがファイル名拡張子を指定している場合は、これを指定します。 サポートされていない機能 VOD サービスやライブサービスのクライアントは、リモート共有オブジェクト(SharedObject.getRemote())を除いて、 Flash Player のすべての機能を利用することができます。 ストリーミングサービス用にサーバーサイドコードを編集することはできません。ただし、各サービスにはサーバーから情 報にアクセスできるカスタム API があります。クライアントサイドコードから NetConnection.call() メソッドを呼び出し、 呼び出す API の名前を渡します。詳細については、20 ページの「ストリーミングサービス API」を参照してください。 特定のドメインからの接続の許可 デフォルトでは、ライブサービスや VOD サービスには、すべてのドメインのクライアントが接続することができます。ク ライアントが接続可能なドメインは制限することができます。 ❖ RootInstall/applications/live フォルダまたは RootInstall/applications/vod フォルダに移動し、次のいずれかの操作 を行います。 • SWF クライアントのドメインを追加するには、allowedSWFdomains.txt ファイルを編集します。 • HTML クライアントのドメインを追加するには、allowedHTMLdomains.txt ファイルを編集します。 これらの TXT ファイルには、ドメインの追加に関する詳細な情報が記載されています。 ライブサービスの生のオーディオとビデオのデータへのアクセス 注意:Flash Media Streaming Server はこの機能をサポートしていません。 Flash Media Server 3 と Flash Player 9.0.115.0 から、ライブストリームの生のオーディオとビデオのデータにアクセスで きます。このデータを使用して、アプリケーション内でスナップショットを作成します。データにアクセスするには、 ActionScript 3.0 の BitmapData.draw() メソッドと SoundMixer.computeSpectrum() メソッドを呼び出します。詳細について は、www.adobe.com/go/learn_fms_asdoc3_jp にある『ActionScript 3.0 コンポーネントリファレンスガイド』を参照 してください。 Flash Media Server では、デフォルトでストリームにアクセスできないようになっています。ストリームへのアクセスを許 可するには、次の操作を行います。 1 RootInstall/applications/live から RootInstall/samples/applications/live に、main.far ファイルを移動します。 FAR ファイルを編集することはできないので、main.far を main.asc に置き換える必要があります。 2 RootInstall/samples/applications/live から RootInstall/applications/live に、main.asc ファイルをコピーします。 3 main.asc ファイルをテキストエディタで開きます。 FLASH MEDIA SERVER 3.5 開発者ガイド 20 ストリーミングサービス 4 次のコードを非コメント化して、すべてのクライアントがすべてのストリームにアクセスできるようにします。 //p_client.audioSampleAccess = "/"; //p_client.videoSampleAccess = "/"; 5 main.asc ファイルを保存します。 ストリーミングサービス API getStreamLength() getStreamLength(streamObj) ストリームの長さを秒単位で返します。クライアントサイドスクリプトからこのメソッドを呼び出し、返された値を受け取 るために応答オブジェクトを指定します。 使用できるバージョン Flash Media Server 3、VOD ストリーミングサービス パラメータ streamObj Stream オブジェクト。 戻り値 数値。 例 次のクライアントサイドコードは、sample_video ストリームの長さを取得し、値を returnObj に返します。 nc.call("getStreamLength", returnObj, "sample_video"); getPageUrl() getPageUrl() クライアントの SWF ファイルが埋め込まれている Web ページの URL を返します。SWF ファイルが Web ページに埋め 込まれていない場合、値は SWF ファイルの格納場所です。次のコードは 2 つの例を示しています。 // trace.swf file is embedded in trace.html. getPageUrl returns: http://www.example.com/trace.html // trace.swf is not embedded in an HTML file. getPageUrl returns: http://www.example.com/trace.swf 値は HTTP アドレスにする必要があります。セキュリティ上の理由から、ローカルファイルアドレス(例えば、 file:///C:/Flash Media Server applications/example.html)は表示されません。 使用できるバージョン Flash Media Server 3、VOD ストリーミングサービス、ライブストリーミングサービス 例 次の例では、サーバー上で getPageUrl() メソッドを呼び出します。 nc.call("getPageUrl", returnObj); FLASH MEDIA SERVER 3.5 開発者ガイド 21 ストリーミングサービス getReferrer() getReferrer() この接続の作成元の SWF ファイルまたはサーバーの URL を返します。 使用できるバージョン Flash Media Server 3、VOD ストリーミングサービス、ライブストリーミングサービス 例 次のコードは、サーバー上で getReferrer() メソッドを呼び出します。 myNetConnection.call("getReferrer", returnObj); 22 第 3 章:メディアアプリケーションの開発 メディアアプリケーションについて Adobe® Flash® Media Interactive Server のビデオアプリケーションは、ビデオオンデマンドアプリケーション、またはラ イブビデオアプリケーションとして構築することができます。ビデオオンデマンドアプリケーションは、テレビ番組、コ マーシャル、ユーザーが作成したビデオなど、記録済みのビデオをサーバーからストリーミングします。多数のビデオの アーカイブを保持している組織もあれば、定期的に新しいビデオを製作している組織もあります。 ライブビデオアプリケーションではライブメディアのキャプチャ、エンコードおよびサーバーへのストリーミングが可能で す。サーバーはメディアをユーザーにストリーミングします。通常、ライブビデオは、企業の会議、教育、スポーツイベン ト、コンサートなどのライブイベントに使用されたり、例えばテレビやラジオの放送局によって継続的に配信されたりしま す。 サーバーへの接続 NetConnection クラスについて クライアントで Flash Media Server からのオーディオやビデオを再生する前に、まずサーバーに接続する必要があります。 接続要求は、サーバー上のアプリケーションインスタンスによって受諾または拒否され、クライアントに接続メッセージが 返されます。アプリケーションによって接続要求が受諾されると、クライアントとサーバーの両方で、この接続を利用する ことができるようになります。 NetConnection クラスは、クライアントをサーバー上のアプリケーションインスタンスに接続します。最も単純な接続の 例としては、NetConnection のインスタンスを作成し、次に、アプリケーションインスタンスの URI を指定して connect() メソッドを呼び出すことが挙げられます。 var nc:NetConnection = new NetConnection(); nc.connect("rtmp://localhost/HelloServer"); ストリームは、ネットワーク接続上でのオーディオ、ビデオ、データのフローを処理します。NetConnection オブジェク トはパイプに例えることができます。このパイプによって、クライアントからサーバーに、またはサーバーからクライアン トに、オーディオ、ビデオ、データがストリーミングされます。NetConnection オブジェクトを作成すると、このオブ ジェクトに 1 つまたは複数のストリームを割り当てることができます。 1 つのストリームによって、複数の種類のコンテンツ(オーディオ、ビデオ、データ)を伝送することができます。ただし、 1 つのストリームのフローは 1 方向(サーバーからクライアント、またはクライアントからサーバーのいずれか)のみです。 A B C D クライアントとサーバーの間で、多数のストリームが 1 つの NetConnection オブジェクトを使用可能 A. Flash Media Server B. データの単一ストリーム C. NetConnection D. Flash Player、Adobe AIR または Flash Lite 3 クライアント FLASH MEDIA SERVER 3.5 開発者ガイド 23 メディアアプリケーションの開発 アプリケーション URL について アプリケーションの URI は、絶対パスまたは相対パスのいずれでも指定することができます。次のシンタックスを使用しま す(角カッコで囲まれた項目はオプションです)。 protocol:[//host][:port]/appname/[instanceName] 次の表は、URI の各構成要素について説明しています。 構成要素 例 説明 protocol: RTMP: Adobe Flash Media Server への接続で使用されるプロトコルです。これは Adobe RealTime Messaging Protocol(RTMP)です。指定できる値は rtmp、rtmpe、rtmps、rtmpt、 rtmpte、http のいずれかです。詳細については、『Adobe Flash Media Server 技術概要』 http: を参照してください。 //host //www.example.com localhost[localhost] :port :1935 ローカルコンピュータまたはリモートコンピュータのホスト名です。クライアントと同一のホ ストコンピュータ上にあるサーバーに接続するには、//localhost を使用するか、または //host 識別子自体を省略します。 接続先の Adobe Flash Media Server のポート番号です。 プロトコルが rtmp の場合、デフォルトのポートは 1935 になります。プロトコルが http の場 合、デフォルトのポートは 80 になります。 /appname/ /sudoku/ RootInstall/applications の中のサブディレクトリの名前です。ここにアプリケーションファ イルが格納されます。fms.ini 設定ファイル(RootInstall/conf/fms.ini)の中で、アプリ ケーションディレクトリ用の他の場所を指定することもできます。 instanceName room1 クライアントの接続先となるアプリケーションのインスタンスです。例えば、チャットルーム アプリケーションは、chatroom/room1、chatroom/room2 などのように、多数のチャット ルームを持つことができます。 インスタンス名を指定しない場合、クライアントは、_definst_ という名前のデフォルトのア プリケーションインスタンスに接続します。 URI の構成要素の中で必須なのは、次のように、プロトコルとアプリケーション名だけです。 rtmp://www.example.com/sudoku/ 次の例では、クライアントはサーバーと同じコンピュータ上にあります。これは、アプリケーションの開発時やテスト時に は一般的です。 rtmp:/sudoku/room1 ローカルドライブおよびネットワークドライブへの URI のマッピング Flash Media Server では、仮想ディレクトリの使用により、ローカルドライブおよびネットワークドライブに URI を容易 にマッピングできます。仮想ディレクトリを使用すると、あらかじめ指定された異なる場所にメディアファイルをパブリッ シュおよび格納できます。これは、メディアファイルの整理に役立ちます。Vhost.xml ファイルの VirtualDirectory/Streams タグで仮想ディレクトリを設定します。 ディレクトリマッピングは、異なる種類のリソースを分けて格納する際にも使用できます。例えば、使用しているアプリ ケーションでユーザーが高帯域幅のビデオと低帯域幅のビデオの両方を表示できるとします。このような状況で、高帯域幅 のビデオと低帯域幅のビデオを別のフォルダに格納する必要がある場合もあるでしょう。low で始まるすべてのストリーム が C:\low_bandwidth という特定のディレクトリに格納され、high で始まるすべてのストリームがそれとは別のディレク トリに格納されるマッピングを作成できます。 low;c:\low_bandwidth high;c:\high_bandwidth FLASH MEDIA SERVER 3.5 開発者ガイド 24 メディアアプリケーションの開発 低帯域幅のビデオにアクセスするクライアントは、ns.play("low/sample") を呼び出します。この呼び出しは、 c:\low_bandwidth フォルダで sample.flv ファイルを探すようサーバーに指示します。 同様に、ns.play("high/sample") に対する呼び出しは、c:\high_bandwidth フォルダで sample.flv ファイルを探すようサー バーに指示します。 次の表に、異なる仮想ディレクトリ設定の 3 つの例(ローカルドライブおよびネットワークドライブへのマッピングを含む) と、記録済みストリームのパブリッシュ先となるディレクトリの決定方法を示します。最初の例では、指定されている URI ("myStream")が、指定されている仮想ディレクトリ名("low")と一致しないので、サーバーはデフォルトのストリーム ディレクトリにストリームをパブリッシュします。 Vhost.xml でのマッピング NetStream 呼び出し パブリッシュされたストリームの場所 の URI タグ low;e:\fmsstreams "myStream" c:\...\RootInstall\applications\yourApp\streams\_definst_\myStrea m.flv low;e:\fmsstreams "low/myStream" e:\fmsstreams\myStream.flv low;\\mynetworkDrive\share\fmsstream "low/myStream" s \\mynetworkDrive\share\fmsstreams\myStream.flv 関連項目 15 ページの「VOD サービスの使用」 Hello Server アプリケーション HelloServer アプリケーションは、RootInstall/documentation/samples/HelloServer フォルダにあります。このシンプ ルな Flash アプリケーションは 2 つのボタンを表示します。それぞれのボタンを使用すると、サーバーへの接続と切断を実 行できます。 出力ウィンドウには、接続状態に関するメッセージが表示されます。 アプリケーションの実行 サーバーと同じコンピュータ上にサンプルをインストールするのが、サンプルを実行する最も簡単な方法です。 1 Flash Media Server のルートインストールディレクトリ内の documentation/samples ディレクトリに含まれている HelloServer フォルダを、クライアントコンピュータの任意の場所にコピーします。 FLASH MEDIA SERVER 3.5 開発者ガイド 25 メディアアプリケーションの開発 2 サーバーのアプリケーションフォルダにフォルダを作成して、アプリケーションを登録します。 RootInstall/applications/HelloServer 3 (オプション)別のコンピュータにインストールされたサーバー上でサンプルを実行する場合は、HelloServer.as を開 き、次の行を編集してサーバーの URL を追加します。 nc.connect("rtmp://localhost/HelloServer"); Flash ユーザーインターフェイスの設計 samples フォルダ内に、既に構築済みのサンプルが含まれています。ただし、独自にアプリケーションを構築したり、機能 を追加したりする方法を学ぶため、ここの手順では、このサンプルを自分で再作成する方法を示します。 1 Adobe Flash CS4 Professional で、ファイル/新規/ Flash ファイル(ActionScript 3.0)を選択し、「OK」をクリッ クします。 2 ウィンドウ/コンポーネントを選択し、コンポーネントパネルを開きます。 3 Button コンポーネントをクリックし、ステージにドラッグします。 4 プロパティインスペクタで、「プロパティ」タブをクリックします。インスタンスの動作にムービークリップを選択し、 インスタンス名に connectBtn と入力します。 5 「パラメータ」タブをクリックし、次に「label」をクリックします。ボタンのラベルに Connect と入力します。 6 2 番目の Button コンポーネントをステージにドラッグします。 7 2 番目のボタンに closeBtn というインスタンス名を付け、ラベルに Close と入力します。 8 HelloServer.fla という名前を付けて FLA ファイルを保存します。 クライアントサイドコードの記述 Flash Media Server ルートインストールディレクトリ内の documentation/samples/HelloServer ディレクトリ内にある HelloServer.as には 完全な ActionScript サンプルが用意されています。ActionScript 3.0 のコードの開発にあたっては、 『ActionScript 3.0 コンポーネントリファレンスガイド』を参照してください。 1 Adobe Flash CS4 Professional で、ファイル/新規/ ActionScript ファイルを選択し、「OK」をクリックします。 2 ActionScript ファイルに名前を付けて保存します。名前は、例えば HelloServer.as のように先頭を大文字にして、拡張 子 .as を付けます。 3 FLA ファイルに戻り、ファイル/パブリッシュ設定を選択します。「Flash」タブをクリックし、次に「設定」をクリッ クします。 4 「ドキュメントクラス」ボックスに、HelloServer と入力します。緑色のチェックマークをクリックし、クラスファイル を検索できるようにしてください。 5 「OK」をクリックし、再度「OK」をクリックします。 6 ActionScript ファイルに、パッケージの宣言を入力します。FLA ファイルと同じディレクトリ内にこのファイルを保存 した場合は、パッケージ名を使用しません。以下にその例を示します。 package { } ただし、FLA ファイルの下のサブディレクトリにファイルを保存する場合、パッケージ名は ActionScript ファイルの ディレクトリパスに対応した名前である必要があります。以下にその例を示します。 package samples { } 7 パッケージの中で、必要な ActionScript クラスを読み込みます。 FLASH MEDIA SERVER 3.5 開発者ガイド 26 メディアアプリケーションの開発 import import import import flash.display.MovieClip; flash.net.NetConnection; flash.events.NetStatusEvent; flash.events.MouseEvent; 8 import ステートメントの後に、クラス宣言を作成します。このクラスの中で、NetConnection 型の変数を定義します。 public class HelloServer extends MovieClip { private var nc:NetConnection; } このクラスによって、MovieClip が拡張されることを確認してください。 9 クラスのコンストラクタを記述し、各ボタンのイベントリスナーを登録します。 public function HelloServer() { // register listeners for mouse clicks on the two buttons connectBtn.addEventListener(MouseEvent.CLICK, connectHandler); closeBtn.addEventListener(MouseEvent.CLICK, closeHandler); } addEventListener() を使用して、「Connect」ボタンで click MouseEvent が発生したときに、connectHandler() という名 前のイベントハンドラが呼び出されるようにします。同様に、「Close」ボタンで click MouseEvent が発生したときに、 closeHandler() が呼び出されるようにします。 10 connectHandler() 関数を記述します。この関数は、ユーザーが「Connect」ボタンをクリックするとサーバーに接続でき るようにします。 public function connectHandler(event:MouseEvent):void { trace("Okay, let's connect now"); nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); nc.connect("rtmp://localhost/HelloServer"); } connectHandler() 内に、NetConnection オブジェクトによって返される netStatus イベントをリッスンするイベントリス ナーを追加します。次に、正しい URI を使用して NetConnection.connect() を呼び出し、サーバー上のアプリケーション インスタンスに接続します。この URI は、サーバーとクライアントが同一のコンピュータで実行されている状況で、 HelloServer という名前のアプリケーションインスタンスに接続します。 11 closeHandler() 関数を記述します。この関数は、ユーザーが「Close」ボタンをクリックしたときの動作を定義します。 public function closeHandler(event:MouseEvent):void { trace("Now we're disconnecting"); nc.close(); } 明示的に close() を呼び出して、サーバーに対する接続を閉じることが最適の方法です。 12 netStatusHandler() 関数を記述します。この関数は、NetConnection オブジェクトによって返される netStatus オブジェ クトを処理します。 FLASH MEDIA SERVER 3.5 開発者ガイド 27 メディアアプリケーションの開発 public function netStatusHandler(event:NetStatusEvent):void { trace("connected is: " + nc.connected); trace("event.info.level: " + event.info.level); trace("event.info.code: " + event.info.code); switch (event.info.code) { case "NetConnection.Connect.Success": trace("Congratulations! you're connected" + "\n"); break; case "NetConnection.Connect.Rejected": trace ("Oops! the connection was rejected" + "\n"); break; case "NetConnection.Connect.Closed": trace("Thanks! the connection has been closed" + "\n"); break; } } netStatus オブジェクトには info オブジェクトが含まれており、info オブジェクトには接続状態を示す level と code が含まれ ています。 接続メッセージの理解 このサンプルを実行し「Connect」ボタンをクリックすると、正しく接続された場合、次のようなメッセージが表示されま す。 Okay, let's connect now connected is: true event.info.level: status event.info.code: NetConnection.Connect.Success Congratulations! you're connected connected is: true の行は、NetConnection.connected プロパティの値を示しています。この値は、Flash Player が、RTMP に よってサーバーに接続しているかどうかを示します。次の 2 行は、NetConnection オブジェクトによって送信された netStatus イベントを示しており、接続状態をレポートします。 event.info.level: status event.info.code: NetConnection.Connect.Success level プロパティは、status または error の 2 つの値を取ることができます。code プロパティは、接続状態を説明します。 netStatusHandler 関数内で code の様々な値を確認し、それに応じた処理を実行することができます。アプリケーション内で は、ストリームの作成やその他の処理を行う前に、正しく接続されたかどうかを必ず確認してください。 同様に、「Close」ボタンをクリックすると、次のようなメッセージが表示されます。 Now we're disconnecting connected is: false event.info.level: status event.info.code: NetConnection.Connect.Closed Thanks! the connection has been closed 接続の管理 接続ステータスコード クライアントとサーバー間で接続が確立しても、様々な理由で切断されることがあります。例えば、ネットワークに障害が 発生したり、サーバーが停止したりすることがあります。サーバーまたはクライアントによって接続が閉じられることもあ ります。接続状態に何らかの変更が発生すると、netStatus イベントが発生します。このイベントには、どのような変更かを 示す code と level の 2 つのプロパティが含まれます。次の表は、code と level の組み合わせの一例です。 FLASH MEDIA SERVER 3.5 開発者ガイド 28 メディアアプリケーションの開発 code プロパティ Level プロパティ 意味 NetConnection.Connect.Success status 接続が正常に確立されました。 netStatus イベントによって返される code と level のすべての値の完全なリストについては、 『ActionScript 3.0 コンポーネ ントリファレンスガイド』の NetStatus.info の項目を参照してください。 このイベントが返されると、event.info.code と event.info.level を使用して、接続のコードとレベルにアクセスすることができ ます。また、NetConnection.connected プロパティを参照することによって、現在でも接続が存在しているかどうかを確認す ることができます(このプロパティは true または false のいずれかの値をとります)。接続を確立できない場合、または接続 が利用できなくなった場合、アプリケーションクライアントで何らかの対処を行う必要があります。 サーバーサイドコードでの接続の管理 アプリケーションは、接続を試みるクライアントを管理する main.asc または applicationName.asc ファイルでサーバーサ イドコードを持つことができます。 サーバーサイドコードは、サーバー側で個々のクライアントを表す Client オブジェクトと、アプリケーションインスタンス の管理に使用する application オブジェクトにアクセスします。サーバーのコードでは、サーバーサイド ActionScript と サーバーサイド情報オブジェクトを使用します(『サーバーサイド ActionScript リファレンスガイド』を参照してくださ い)。 アプリケーションは、サーバーサイドコードの中で、クライアントからの接続を受諾または拒否したり、アプリケーション をシャットダウンしたり、接続を管理するためのその他のタスクを実行したりすることができます。クライアントが接続す るときに、アプリケーションは application.onConnect イベントを受け取ります。同様に、クライアントが切断するときに、 アプリケーションは application.onDisconnect イベントを受け取ります。 サーバーで接続を管理する場合、サーバーサイド ActionScript の中の application.onConnect() と application.onDisconnect() が処理の開始点となります。 関連項目 6 ページの「サーバーサイドコードの記述」 接続管理サンプルアプリケーション この例では、アプリケーションクライアントとサーバーサイドコードの両方で接続を管理する方法を示します。 認証コードを書く クライアントコードの中では、特定の接続コードを確認し、それらを処理する必要があります。ライブストリームの作成や、 記録済みストリームの再生は、クライアントが NetConnection.Connect.Success を受け取ってからのみ行います。クライアン トが NetConnection.Connect.AppShutDown を受け取ると、サーバーからクライアントへのストリーム、クライアントから サーバーへのストリームがすべてシャットダウンされます。この場合、サーバーへの接続を閉じます。 注意:SimpleConnectManage サンプルの SimpleConnectManage.as を参照してください(これは ActionScript 3.0 で記 述されています)。 1 NetConnection オブジェクトを作成し、connect() メソッドを呼び出して、サーバーに接続します。 2 netStatus イベントハンドラを記述します。この中で、特定の接続コードを確認し、それぞれの場合の処理を実行します。 FLASH MEDIA SERVER 3.5 開発者ガイド 29 メディアアプリケーションの開発 public function netStatusHandler(event:NetStatusEvent):void { trace("connected is: " + nc.connected ); trace("event.info.level: " + event.info.level); trace("event.info.code: " + event.info.code); switch (event.info.code) { case "NetConnection.Connect.Success": trace("Congratulations! you're connected"); // create live streams // play recorded streams break; case "NetConnection.Connect.Rejected": trace ("Oops! the connection was rejected"); // try to connect again break; case "NetConnection.Connect.Failed": trace("The server may be down or unreachable"); // display a message for the user break; case "NetConnection.Connect.AppShutDown": trace("The application is shutting down"); // this method disconnects all stream objects nc.close(); break; case "NetConnection.Connect.Closed": trace("The connection was closed successfully - goodbye"); // display a reconnect button break; } } コードの実行 注意:ここの手順は、Flash ユーザーインターフェイスを使用しないすべての ActionScript 3.0 の例に該当します。これら の ActionScript 3.0 の例は、参考用として提供されています。 1 クライアントサイドコードを参照して、クライアントがどのアプリケーションに接続するのかを確認します。 nc.connect("rtmp://localhost/HelloServer"); 2 applications ディレクトリ内にアプリケーションインスタンスのディレクトリを作成して、サーバーにアプリケーショ ンを登録します。以下にその例を示します。 RootInstall/applications/HelloServer 3 (オプション)または、サーバーに登録されているアプリケーションを使用する場合は、connect() の呼び出しで使用され る URI を変更します。 nc.connect("rtmp://localhost/MyApplication"); 4 Adobe Flex Builder、または Flex Builder プラグインのある Eclipse で、SimpleConnectManage という名前の ActionScript プロジェクトを作成します(ファイル/新規/ ActionScript プロジェクトを選択し、ウィザードの手順に 従います)。 5 プロジェクトに SimpleConnectManage サンプルファイルを追加します。 6 実行/デバッグを選択します。デバッグウィンドウで、「プロジェクト」に SimpleConnectManage と入力し、「アプリ ケーションファイル」に SimpleConnectManage.as と入力します。「デバッグ」をクリックします。 7 開かれている空のアプリケーションウィンドウを閉じ、Flex Builder または Eclipse に戻ります。コンソールウィンドウ 内のメッセージを確認します。 接続が成功した場合、次のような出力が表示されます。 FLASH MEDIA SERVER 3.5 開発者ガイド 30 メディアアプリケーションの開発 connected is: true event.info.level: status event.info.code: NetConnection.Connect.Success Congratulations! you're connected [SWF] C:\samples\SimpleConnectManage\bin\SimpleConnectManage-debug.swf - 2,377 bytes after decompression 記録済みメディアファイルのストリーミング クライアントでのメディアファイルの再生 ストリームを再生するには、次のように、クライアントサイドの NetStream.play() メソッドに URI を渡して、記録済みの ファイルの場所を指定します。 ns.play("bikes"); この行では、NetConnection.connect() を使用して接続したアプリケーション内の、bikes.flv という名前の記録済みストリー ムを指定しています。play() メソッドは次の構文で 4 つのパラメータを受け取ります。 public function play( name:Object [,start:Number [,len:Number [,reset:Object] ] ]):void パラメータは次のとおりです。 • name:記録済みファイルの名前(ストリーム名)を含む文字列。ストリーム名には、ストリームのファイル形式に応じ て正しいシンタックスを使用します。 ファイル形式 シンタックス 例 FLV ファイル拡張子を付けずにストリーム名を指定します。 NetStream.play("myflvstream"); 接頭辞をそれぞれ mp3: または id3: とし、ファイル拡張子を NetStream.play("mp3:mymp3stream"); MP3 または ID3 付けずにストリーム名を指定します。 F4V または MP4 など、MPEG-4 ベースのファイ ル 接頭辞 mp4: を付けてストリーム名を指定します。この接頭 辞はサーバーに対してファイルが MPEG-4 Part 12 コンテナ 形式であると指示します。サーバー上のファイルにファイル 名拡張子が使用されている場合は、これを指定する必要があ ります。 NetStream.play("id3:myid3data"); NetStream.play("mp4:myvideo.mp4"); NetStream.play("mp4:myvideo.f4v"); • start:再生を開始する位置です。ビデオの先頭からの秒数で示します。 • len:再生の継続時間 ( 秒単位 )。 • reset:再生リスト内から以前の play() の呼び出し情報を消去するかどうかを指定します。 これらのパラメータについては、 『ActionScript 3.0 コンポーネントリファレンスガイド』の NetStream.play() の項目で詳し く説明されています。 ストリーム名の指定 ストリーム名には、\ / : * ? " < > | の各文字は使用できません。 ビデオのスナップショットのキャプチャ この機能では、指定したビデオのサムネイルのスナップショット(音声も含む)を、表示目的で取得することができます。 Flash Player クライアントは、Client.audioSampleAccess プロパティや Client.videoSampleAccess プロパティによって指定さ れたディレクトリ内のストリームのデータに対するアクセスが許可されます。詳細については、『ActionScript 3.0 コン ポーネントリファレンスガイド』を参照してください。 FLASH MEDIA SERVER 3.5 開発者ガイド 31 メディアアプリケーションの開発 データにアクセスするには、クライアントで BitmapData.draw() および SoundMixer.computeSpectrum() を呼び出します。詳 細については、『ActionScript 3.0 のプログラミング』の「生のサウンドデータへのアクセス」を参照してください。 ストリーム内のメタデータの処理 多くの場合、記録済みのメディアファイルには、サーバーまたはツールによってエンコードされたメタデータが含まれます。 Flash Video Exporter ユーティリティ(バージョン 1.1 以降)は、ビデオの所要時間、フレームレートなどの情報をビデオ ファイルに埋め込むためのツールです。他のビデオエンコーダでは、異なるメタデータのセットが埋め込まれます。また、 明示的に独自のメタデータを追加することもできます。 クライアントでストリームを再生する NetStream オブジェクトは、ストリーム内にメタデータが見つかると、onMetaData イベントをディスパッチします。メタデータを読み取るには、このイベントを処理して、メタデータが含まれる info オブ ジェクトを抽出する必要があります。例えば、ファイルが Flash Video Exporter によってエンコードされている場合、info オブジェクトには次のプロパティが含まれます。 duration ビデオの長さ。 width ビデオが表示される幅。 height ビデオが表示される高さ。 framerate ビデオがエンコードされているフレームレート。 関連項目 66 ページの「例:ライブビデオへのメタデータの追加」 XMP メタデータの使用 Adobe Extensible Metadata Platform(XMP)メタデータを埋め込んだビデオストリーミングを、Flash Media Server を 通じて Flash Player に配信できます。Flash Media Server では、FLV および MP4/F4V 形式で埋め込まれた XMP メタデー タがサポートされています。Flash Media Server 3.5 では、MP4/F4V ファイルにつき 1 つの XMP メタデータパケットが サポートされています。 XMP メタデータは、重要なメディア情報を、メディアが作成された位置からメディアが表示される位置まで通信するシス テムです。作成プロセスで XMP 情報を追加することで、メディアのインタラクティブ性が向上します。また、ファイル内 に埋め込まれ、Flash Media Live Encoder などのアドビ システムズ社のエンコードツールからエンコードされた speechto-text メタデータを配信することができます。AMF0 および AMF3 接続がサポートされます。XMP メタデータは、ファ イルに関する内部情報にするほか、またはエンドユーザー向けの情報にすることもできます。 例えば、Adobe Premiere® でトレーラを作成して、メタデータを FLV ファイルに送信することができます。ユーザーが ファイルを表示する場合は、Flash Player 10 を使用してメタデータを検索し、ファイル内の特定の場所にジャンプすること ができます。NetStream でコンテンツを再生すると、単一のフィールド data がある onXMPData メッセージがコールバック として送信されます。data フィールドには、メディアファイルからの XMP メッセージ全体が含まれています。 XMP の詳細については、www.adobe.com/go/learn_fms_xmp_jp を参照してください。 例:Media Player このチュートリアルでは、ActionScript 3.0 を使用して Video オブジェクトをステージに追加し、ビデオを表示します。ビ デオの操作の詳細については、www.adobe.com/go/learn_fms_video_jp にある『ActionScript 3.0 のプログラミング』 の「ビデオの操作」の章を参照してください。 注意:この例では、RootInstall/documentation/samples フォルダから、MediaPlayer サンプルの MediaPlayer.as を使用 します。 FLASH MEDIA SERVER 3.5 開発者ガイド 32 メディアアプリケーションの開発 Flash での例の実行 開発サーバーと同じコンピュータ上にサンプルをインストールするのが、サンプルを実行する最も簡単な方法です。 1 サーバーでアプリケーションを登録するには、RootInstall/applications/mediaplayer フォルダを作成します。 2 RootInstall/documentation/samples/MediaPlayer/streams フォルダを RootInstall/applications/mediaplayer フォルダにコピーして以下のようにします。 RootInstall/applications/mediaplayer/streams/_definst_/bikes.flv 3 Flash では、RootInstall/documentation/samples/MediaPlayer フォルダから MediaPlayer.fla ファイルを開きます。 4 制御/ムービープレビューを選択します。ビデオが音声なしで再生され、出力ウィンドウにメッセージが表示されます。 出力ウィンドウと、ムービーテストモードのビデオ ストリームが再生されたり、接続状態が変化したりすると、それに関する出力が表示されます。NetStream.play() を呼び出す と、onMetaData の呼び出しがトリガされ、コンソールウィンドウに次のようなメタデータが表示されます。 metadata: duration=30 width=292 height=292 framerate=30 Flex での例の実行 1 Flex Builder、または Flex Builder プラグインのある Eclipse で、MediaPlayer.as を開きます。 2 実行/デバッグを選択します。「プロジェクト」で、MediaPlayer を選択します。「アプリケーションファイル」で、 MediaPlayer.as を選択します。 3 「デバッグ」をクリックします。 ビデオがアプリケーションウィンドウで実行されます。出力メッセージを参照するには、Flex Builder ウィンドウをク リックします。 メインクライアントクラスの記述 1 ActionScript 3.0 クラスを作成します。NetConnection クラス、NetStream クラスおよびその他の必要なクラスを読 み込みます。 FLASH MEDIA SERVER 3.5 開発者ガイド 33 メディアアプリケーションの開発 package { import import import import import ... } flash.display.Sprite; flash.net.NetConnection; flash.events.NetStatusEvent; flash.net.NetStream; flash.media.Video; 2 新しいクラスの MediaPlayer を作成し、その中で必要な変数を宣言します。 public class MediaPlayer extends Sprite { var nc:NetConnection; var ns:NetStream; var video:Video; ... } 3 コンストラクタを定義します。つまり、NetConnection オブジェクトを作成し、そのオブジェクトにイベントリスナー を追加してから、サーバーに接続します。 public function MediaPlayer() { nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); nc.connect("rtmp://localhost/mediaplayer"); } 4 NetConnection と NetStream events を両方処理する netStatusHandler 関数を作成します。 private function netStatusHandler(event:NetStatusEvent):void{ trace("event.info.level: " + event.info.level + "\n", "event.info.code: " + event.info.code); switch (event.info.code){ case "NetConnection.Connect.Success": // Call doPlaylist() or doVideo() here. doPlaylist(nc); break; case "NetConnection.Connect.Failed": // Handle this case here. break; case "NetConnection.Connect.Rejected": // Handle this case here. break; case "NetStream.Play.Stop": // Handle this case here. break; case "NetStream.Play.StreamNotFound": // Handle this case here. break; case "NetStream.Publish.BadName": trace("The stream name is already used"); // Handle this case here. break; } } 注意:利用可能なすべてのイベントコードのリストについては、 『ActionScript 3.0 コンポーネントリファレンスガイド』の NetStatusEvent.info の項目を参照してください。 1 NetStream オブジェクトを作成し、netStatus イベントリスナーを登録します。 FLASH MEDIA SERVER 3.5 開発者ガイド 34 メディアアプリケーションの開発 private function connectStream(nc:NetConnection):void { ns = new NetStream(nc); ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); ns.client = new CustomClient(); ... client プロパティに CustomClient クラスのインスタンスを設定していることに注意してください。CustomClient は、 いくつかの特別なイベントハンドラを定義する個別のクラスです。 2 Video オブジェクトを作成し、このオブジェクトにストリームを割り当てます。 video = new Video(); video.attachNetStream(ns); Video オブジェクトにストリームを割り当てる場合、ActionScript 2.0 では Video.attachVideo() を使用していましたが、 ActionScript 3.0 では Video.attachNetStream() を呼び出します。 3 NetStream.play() を呼び出してストリームを再生し、addChild() を呼び出してステージにストリームを追加します。 ... ns.play("bikes", 0); addChild(video); } NetStream.play() に渡すストリームの URI は、NetConnection.connect() に渡すアプリケーションの URI からの相対パス です。 クライアントのイベントハンドラクラスの記述 onMetaData イベントハンドラと onPlayStatus イベントハンドラを含む CustomClient クラスを記述することも必要になり ます。NetStream.play() を呼び出す場合は、これらのイベントを処理する必要がありますが、addEventListener() メソッドを 使用してこれらのイベントハンドラを登録することはできません。 1 メインクライアントクラスの中で、NetStream.client プロパティに新しいクラスを割り当てます。 ns.client = new CustomClient(); 2 新しいクライアントクラスを作成します。 class CustomClient { } 3 onMetaData イベントを処理するための、onMetaData() という名前の関数を記述します。 public function onMetaData(info:Object):void { trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); } 4 onPlayStatus イベントを処理するための、onPlayStatus() という名前の関数を記述します。 public function onPlayStatus(info:Object):void { trace("handling playstatus here"); } 再生前のビデオファイルの確認 記録済みのビデオファイルを再生する前に、ファイル内にエラーがないかどうかを確認するには、FLVCheck ツールを使用 します。ビデオファイルの中にエラーがあると、正しく再生されない可能性があります。詳細については、『Adobe Flash Media Server の設定と管理のガイド』を参照してください。 FLASH MEDIA SERVER 3.5 開発者ガイド 35 メディアアプリケーションの開発 エラーの処理 エラーの処理について ビデオアプリケーションの構築では、接続やストリームの管理方法を理解することが重要です。ネットワーク環境では、次 のような理由によって、接続が失敗する可能性があります。 • クライアントとサーバーとの間のどこかで障害が発生している。 • クライアントが接続しようとした URI が正しくない。 • サーバー上にアプリケーションインスタンスが存在しない。 • サーバーに障害が発生しているか、またはビジー状態である。 • クライアントの最大数、または帯域幅の最大閾値を超えている。 接続が正常に確立されると、NetStream オブジェクトを作成して、ビデオをストリーム再生することができます。ただし、 ストリームに問題が発生する可能性があります。現在のフレームレートを監視したり、バッファが空である旨のメッセージ がないかどうか確認したり、ビデオのダウンサンプリングを行ったり、障害点を検出したり、ストリームが見つからない場 合の処理を行ったりする必要があります。再生中に発生した次のようなエラーについてユーザーに通知します。 • 再生中にネットワーク接続が切断される。 • 再生が完了する前にバッファが空になる。 アプリケーションが問題に正しく対処できるようにするには、接続やストリームに影響を与える netStatus イベントをリッス ンし、対応する必要があります。アプリケーションのテスト時や実行時には、Administration Console を使用して接続や ストリームに関する様々なイベントのトラブルシューティングを行うこともできます。 接続失敗時の処理 接続が確立できない場合、NetStream オブジェクトやその他のオブジェクトを作成する前に、netStatus イベントを処理しま す。サーバーの URI に再接続を試みたり、ユーザーにユーザー名とパスワードの再入力を求めたり、その他の処理を行った りすることが必要な場合があります。 次の表は、確認対象のイベントコードと、そのイベントが発生したときの処理の例を示しています。 イベント 機能 NetConnection.Connect.Failed ユーザーに対して、サーバーがダウンしている旨のメッセージを表示します。 NetConnection.Connect.Rejected 再接続を試みます。 NetConnection.Connect.AppShutdown すべてのストリームオブジェクトを切断し、接続を閉じます。 注意:SimpleConnectManage サンプルの SimpleConnectManage.as をご利用ください(これは ActionScript 3.0 で記述 されています)。 NetStatus イベントを処理するクライアントコードの記述 ❖ NetConnection オブジェクトを作成してサーバーに接続します。次に、netStatus イベントハンドラを記述して、その中 で各イベントを検出し、アプリケーションに応じて適切な処理を行います。以下にその例を示します。 FLASH MEDIA SERVER 3.5 開発者ガイド 36 メディアアプリケーションの開発 public function netStatusHandler(event:NetStatusEvent):void { trace("connected is: " + nc.connected ); trace("event.info.level: " + event.info.level); trace("event.info.code: " + event.info.code); switch (event.info.code) { ... case "NetConnection.Connect.Rejected": trace ("Oops! the connection was rejected"); // try to connect again break; case "NetConnection.Connect.Failed": trace("The server may be down or unreachable"); break; case "NetConnection.Connect.AppShutDown": trace("The application is shutting down"); // this method disconnects all stream objects nc.close(); break; ... } } ストリームが見つからない場合の処理 アプリケーションで再生しようと試みたストリームが見つからない場合、NetStream.Play.StreamNotFound コードで netStatus イベントがトリガされます。netStatus イベントハンドラでこのコードを検出し、対応する処理を実行する必要があります。 例えば、ユーザーに対してメッセージを表示したり、デフォルトの場所にある標準のストリームを再生したりします。 認証コードを書く ❖ netStatus イベントハンドラ内で、StreamNotFound のコードを確認し、対応する処理を実行します。 private function onNetStatus(event:NetStatusEvent):void { switch (event.info.code) { case "NetStream.Play.StreamNotFound": trace("The server could not find the stream you specified"); ns.play( "public/welcome"); break; ... } 再生リストの操作 再生リストについて 再生リストとは、順に再生されるストリームのリストです。サーバーは、ストリームのリストを連続ストリームとして処理 し、バッファリングを提供します。これにより、ストリームが切り替わる場合でも中断が発生しません。 クライアントサイドコード内で再生リストを定義することができます。再生リストを定義するには、NetStream.play() を呼び 出して、NetStream.play() メソッドに対するパラメータにストリーム名を指定します。play() メソッドの詳細については、 『ActionScript 3.0 コンポーネントリファレンスガイド』および『ActionScript 2.0 リファレンスガイド』で説明されてい ます。 play() は NetStream オブジェクトから呼び出され、NetStream オブジェクトは NetConnection オブジェクトに関連付け られるので、再生リスト内のすべてのストリームは同一のサーバーから送信されます。 FLASH MEDIA SERVER 3.5 開発者ガイド 37 メディアアプリケーションの開発 クライアントサイド再生リストの作成 この再生リストは、サーバーに格納されているストリームの名前を使用します。この再生リストを変更するには、アプリ ケーションクライアントのコードを変更する必要があります。 注意:MediaPlayer サンプルの MediaPlayer.as を使用してください(これは ActionScript 3.0 で記述されています)。 1 NetConnection オブジェクトを作成し、サーバーに接続して、netStatus イベントハンドラを追加します。 2 NetStream オブジェクトを作成し、netStatus イベントをリッスンします。 private function createPlayList(nc:NetConnection):void { stream = new NetStream(nc); stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); stream.client = new CustomClient(); ... } 3 NetStream オブジェクトを Video オブジェクトに割り当てます。 video = new Video(); video.attachNetStream(stream); 4 NetStream オブジェクトに、一連の play() メソッドを定義します。 stream.play( "advertisement", 0, 30 ); stream.play( "myvideo", 10, -1, false ); stream.play( "bikes", 0, -1, false ); stream.play( "parade", 30, 120, false); addChild(video); 5 netStatus イベントハンドラ内で、NetStream イベントコードをリッスンします。 private function netStatusHandler(event:NetStatusEvent):void { ... case "NetStream.Play.Stop": trace("The stream has finished playing"); break; case "NetStream.Play.StreamNotFound": trace("The server could not find the stream"); break; } この再生リストは、以下のストリームを再生します。 • advertisement.flv という名前の記録済みストリーム、最初から 30 秒間 • myvideo.flv という名前の記録済みストリーム、開始後 10 秒の位置から最後まで • bikes.flv という名前の記録済みストリーム、最初から最後まで • parade.flv という名前の記録済みストリーム、開始後 30 秒の位置から 2 分間継続 再生リスト内のストリームのスワップ ストリームのスワップとは、1 つのストリームと別のストリームを交換することです。ストリームの切り換えがキーフレー ムで行われるのに対して、ストリームのスワップはストリームの境界で実行されます。したがって、ストリームのスワップ は再生リストを使用するのに役立ちます。例としては、広告セグメントがあるコンテンツを含む再生リストで使用します。 使用パターンに関する統計を収集した後で、1 つの広告と別の広告をスワップすることができます。 FLASH MEDIA SERVER 3.5 開発者ガイド 38 メディアアプリケーションの開発 再生リスト内でストリームをスワップするには、トランジションモードが SWAP である NetStream.play2() メソッドを使用し ます。NetStream.play2() メソッドでは、パラメータとして NetStreamPlayOptions オブジェクトを使用します。 NetStreamPlayOptions オブジェクトでは、古いストリーム、切り替え先のストリーム、使用するトランジションの種類を 指定します(ここでは NetStreamPlayTransitions.SWAP)。 注意:NetStream.play2() メソッドは、Flash Media Server 3.5 以降および Flash Player 10 以降でサポートされています。 例えば、再生リストがストリーム A、B、C をこの順序で再生するように設定されているとします。 ns.play("streamA", 0, -1, true); ns.play("streamB", 0, -1, false); ns.play("streamC", 0, -1, false); ... ストリーム A を再生し、サーバーがストリーム C の送信を開始する前に、ストリーム C ではなくストリーム Z を再生する ことにしたとします。このトランジションを実行するには、次のサンプルのようなコードを使用します。 var param:NetStreamPlayOptions = new NetStreamPlayOptions(); param.oldStreamName = "streamC"; param.streamName = "streamZ"; param.transition = NetStreamPlayTransitions.SWAP ns.play2(param); SWAP トランジションは SWITCH トランジションとは異なります。ストリームをスワップする呼び出しは、サーバーが古い ストリーム(この例では、streamC)を配信する前に行う必要があります。streamC が既に再生されている場合、サーバーは コンテンツをスワップせず、NetStream.Play.Failed イベントを送信します。サーバーがまだ streamC を配信していない場合、 サーバーはコンテンツをスワップします。結果的に、streamA、streamB および streamZ が再生されます。 サーバーが異なるコンテンツのストリームにスワップする場合、クライアントアプリケーションはバッファをリセットしま す。サーバーは新しいストリームの先頭からスワップします。このとき、操作が中断されることはありません。 サーバーサイド再生リストの作成 Flash Media Server では、サーバー上での F4V/MPE G-4 記録がサポートされています。したがって、管理者はサーバー 上で ISO 標準形式のビデオを録画することができます。Flash Media Server でサポートされるコーデックを含むライブビデ オストリームおよびライブオーディオストリームは、サーバー上で記録することができます。記録可能なソースには、 Flash Player、パートナーソリューション、または録画済みのアセットを含むライブストリームがあります。記録は、クラ イアントまたはサーバー API から開始することができます。リモートサーバーにストリームをパブリッシュするには、 NetStream.publish を使用します。 次の例は、サーバーサイド再生リストを作成する方法を示しています。再生リストは、サーバーサイドの main.asc ファイ ル内に作成されます。サーバーは Stream.get() を使用して既存のストリームをキャプチャし、後で Stream.play() を使用して 再生するためにビデオをキューに入れます。この機能を使用して、サーバー上のストリームをキャプチャして、ストリーミ ングの前に任意のビデオを挿入することができます。例えば、ユーザーが視聴するビデオの前にスポンサー広告を挿入する などが可能です。このサンプルをライブで表示するには、Feature Explorer 内のサンプルを表示します。「Play」をクリッ クすると、連続的に複数のビデオが再生されるように設定したリストが再生されます。 FLASH MEDIA SERVER 3.5 開発者ガイド 39 メディアアプリケーションの開発 動的ストリーミング 動的ストリーミングについて 注意:上記の動的ストリーミング API は、Flash Media Server 3.5 以降および Flash Player 10 以降でサポートされていま す。 Flash Media Server は、異なるビットレートでエンコードされているコンテンツストリームのバージョンを切り替えるため のコマンドを受信します。この機能により、メディアアプリケーションをネットワーク状況の変化に合わせることができま す。また、処理能力が低く画面が小さいモバイルデバイスなどの、機能の異なるクライアントにアプリケーションを適合さ せることもできます。例えば、サーバーが高画質ビデオをクライアントアプリケーションにストリーミングする際に、ネッ トワーク状況が不十分である場合を考えてみます。この場合、サーバーは、低いビットレートの標準画質のストリームに切 り替えることができます。ネットワーク状況が改善された場合、サーバーは HD ビデオに戻すことができます。トランジ ションは、クライアントでシームレスに行われます。ネットワーク状況が変化した場合でも、クライアントへのビデオスト リーミングは中断されません。 コンテンツのストリーム ユーザーの帯域幅 700 kbps 帯域幅 1.5 Mbps 500 kbps 150 kbps 0 kbps 0 分間 2 分間 時間 4 分間 6 分間 8 分間 サーバーは、QoS を維持するため、帯域幅の変更に応じたストリームを配信します。 FLASH MEDIA SERVER 3.5 開発者ガイド 42 メディアアプリケーションの開発 最適なユーザー操作性のためには、動的ストリーミングでは次のことが必要です。 • コンテンツの異なるバージョンまたはコンテンツの一部が同期されている(ビデオのタイムラインが一致している必要が ある)。 • 各コンテンツストリームのオーディオデータまたは他のデータは、そのストリーム内のビデオデータと同期されている必 要がある。 サーバーは、記録されたコンテンツの 2 つの部分の間でトランジションを実装します。トランジションの実装は、ストリー ミングされているコンテンツの種類に応じて 3 つの方法で行われます。 • ビデオのみのストリーム。トランジションは、ターゲットのタイムライン内の最も近いキーフレームで行われます。 • ビデオとオーディオのストリーム。トランジションは、ターゲットストリームのタイムライン内で最も近いキーフレーム の直前にあるオーディオサンプルで行われます。開始ストリームとターゲットストリームのオーディオのタイムラインは 一致している必要があります。一致していない場合、オーディオアーティファクトが作成されます。 • オーディオのみのストリーム。トランジションは、最も近いサンプルで行われます。 ライブビデオコンテンツ間でのトランジションの実装は、これよりも少し複雑です。サーバーが正確なトランジション位置 を選択することができるように、ストリームには 3 ∼ 5 ミリ秒以内の十分に近い位置で同期されたタイムスタンプが含まれ ている必要があります。 ActionScript を使用したストリームの切り替え ストリームのトランジションはサーバーで行われますが、ストリームを切り替えるコマンドおよび切り替えの決定は、クラ イアントアプリケーションから送信されます。アプリケーション開発者は、ダウンロードと再生の統計を監視したり、必要 に応じて古いストリームを新しいストリームに切り替えたりするロジックを含めることができます。開発者は ActionScript 3.0 NetStream.info プロパティと NetStreamInfo クラスを使用して、ダウンロードと再生の統計を監視することができます。 NetStream.play2() メソッドおよび関連付けられた NetStreamPlayOptions クラスによって、再生中の別のストリームに変 更する機能が提供されます(同様の API が ActionScript 2.0 でも使用可能です)。 アプリケーション開発者は、トランジションによって発生した遅延を解消するのに十分な大きさの再生バッファをクライア ントアプリケーションが保持するようにする必要があります。遅延の原因になる 2 つの要素としては、ライブストリームの キーフレーム間隔と、切り換えられた 2 つのストリームが同期されていないことが挙げられます。例えば、2 秒分のバッ ファでは、3 秒のトランジションの遅延に対応することはできません。最初の再生の後は、クライアントのバッファ (NetStream.bufferTime の値)を少なくともデフォルト値の 10 秒以上にする必要があります。 アドビは、NetStream クラスを拡張する DynamicStream という新しいクラスを開発しました。DynamicStream クラス には、帯域幅、バッファーの使用状況および削除されたフレームを監視するイベントリスナーが含まれています。クラスは この情報に基づいてストリームを切り替えます。DynamicStream クラスを使用して動的ストリーミングを実装したり、 DynamicStream クラスをリファレンスとして使用して、独自の動的ストリーミングアルゴリズムを記述したりすることが できます。レガシーコードをマイグレートする場合は、DynamicStream クラスを使用することをお勧めします。 ActionScript クラスファイルとこれらのクラスのドキュメントは、www.adobe.com/go/fms_dynamicstreaming からダ ウンロードします。 注意:これらのクラスは ActionScript 3.0 ライブラリの一部ではありません。アドビが Flash Media Server ユーザー向け に開発したカスタムクラスです。 動的ストリーミングを使用する状況の判断 次の条件のいくつかまたはすべてを満たすコンテンツに対して動的ストリーミングを使用することをお勧めします。 • 長時間のビデオ • ファイルサイズの大きいビデオ • HD ビデオ FLASH MEDIA SERVER 3.5 開発者ガイド 43 メディアアプリケーションの開発 • 全画面ビデオなど、解像度の大きいビデオ • 企業ユーザーではなく、帯域幅の問題に影響されやすい自宅ユーザーなどのユーザーに配信されるコンテンツ エンコードの推奨事項 ユーザーに最良のストリーミングを提供するには、コンテンツをエンコードするときに、DevNet の項に示す推奨事項に 従ってください。この推奨事項では、マルチビットレートのコンテンツストリームのエンコードに関するベストプラクティ スを示しています。次に推奨事項の要約を示します。 • ストリームのビデオのタイムラインが関連付けられ、互換性があることを確認します。 • 真のシームレスを実現するには、すべてのストリームで同じコーデックとオーディオビットレートを使用します。そうし ない場合、ストリームの切り替え時にポンという小さな音が聞こえることがあります。 • 必須ではありませんが、コンテンツのバージョンが異なってもキーフレーム間隔(キーフレーム頻度)とフレームレート (fps)が一致していることが推奨されます。キーフレーム間隔を短くすると、サーバーはストリームの切り替えを頻繁に 行うことになり、クライアントはより小さい再生バッファを持つことになります。 • できる限り同じオーディオのサンプルレートを使用します。ローエンドのエンコーディングでは、ステレオではなく、モ ノラルのオーディオを使用することで帯域幅を節約することができます。 次の表は、1 つのコンテンツのエンコードに使用できる様々なビットレートを示しています。 ビットレート 150 Kbps 300 Kbps 500 Kbps 700 Kbps 1.5 Mbps(完全 Web HD) ストリームを切り替える状況の判断 どの時点でストリームを切り替えるかは、バッファ長、ダウンロードされたバイト数、ドロップされたフレーム数など、さ まざまな要因を考慮して決定できます。adobe.com からダウンロードできる DynamicStream クラスと DynamicStreamItem クラスは、これらの要因を考慮して構築されており、動的なストリーミングアプリケーションに必要 なロジックが含まれています。 アプリケーションロジックを独自に開発する場合は、ストリーミングビデオに関する次の戦略が役立ちます。 1 初回の再生時には、画面またはデバイスに適する最小のビットレートを選択します。例えば、標準のコンピュータの Web ブラウザ上でビデオを再生する場合、初回の再生に適するストリームは 300 kbps、320 x 240 です。 2 再生を即座に開始するには、小さい値のバッファ長を選択します。 3 再生が開始した場合は、バッファ長を 30 ∼ 60 秒などの大きい値に変更します。 4 クライアント帯域幅(NetStream.info.maxBytesPerSecond)とバッファサイズ(NetStream.bufferLength)の使用について 監視を開始します。 現在の帯域幅が十分である場合は、バッファがすぐに満杯になり、安定します。帯域幅が不足し始めると、バッファが空 になり始めます。 5 クライアントの帯域幅がストリームの必要条件を超え、バッファが増えるか満杯になると、解像度の高いコンテンツに切 り替えることができます。 FLASH MEDIA SERVER 3.5 開発者ガイド 44 メディアアプリケーションの開発 切り替える前に、クライアントの帯域幅が十分であることを確認してください。クライアントの帯域幅とバッファ長に加 えて、ドロップされたフレーム数(NetStream.info.droppedFrames)など、その他の統計を確認することもできます。 6 解像度の高いコンテンツにそれぞれ移行した場合は、タイマーを使用して、5 秒単位でバッファの監視を続行します。 バッファが空になり始めた場合は、解像度の低いコンテンツに切り替え、バッファを監視する頻度を増やします(2 秒単 位など)。 7 帯域幅が十分でバッファが増えるか満杯になっているときに、アップグレードを続けます。ユーザーが最良の機能を利用 できるようにするには、慎重に設定を行う必要があります。アップグレードは、報告された帯域幅が必要なストリーム条 件を十分に超えている場合のみ行います。 関連項目 DynamicStream クラスの使用 高度な開発のための動的ストリーミング 動的ストリーミングの詳細 クライアントの帯域幅の確認 ストリームの切り替えが必要な状況を判断するために、クライアントの帯域幅を監視します。クライアントの帯域幅が適切 な場合、クライアントアプリケーションはサーバーに対して、より高いビデオのビットレートに切り替えるよう要求するこ とができます。クライアントの帯域幅が小さい場合、クライアントアプリケーションはサーバーに対して、より低いビット レートに切り替えるよう要求することができます。 帯域幅を測定するには、NetStream.info プロパティを使用します。NetStream.info の呼び出しによって、受信するストリーム のオーディオ、ビデオおよびデータバイトのレートを反映したプロパティと共に NetStreamInfo オブジェクトが返されま す。受信するデータレートに関する情報によって、帯域幅の品質を推測することができます。 具体的には、NetStreamInfo クラス(ActionScript 2.0 の場合は NetStream.getInfo() によって返されたオブジェクト)の *byteCount および *bytesPerSecond プロパティを使用します。これらのプロパティの詳細については、『ActionScript Language References』を参照してください。 クライアントの帯域幅を測定するための 1 つの方法は、NetStream.Buffer.Full ステータスのイベントを受信した際に、 NetStreamInfo.byteCount プロパティを一定時間測定して一秒あたりのバイト値を取得することです。この値は、使用可能な 最大帯域幅に近似したものになります。次に、使用可能な帯域幅と使用可能なビットレートを比較し、必要に応じてトラン ジションを実装します。 注意:byteCount プロパティは、サーバーの Access ログにある sc-stream-bytes と同じ値は返しません。byteCount プロパ ティは、ユーザーがストリーム切り替えのタイミングを判断できるデータを提供する QoS(クオリティオブサービス)で す。bytesCount プロパティは請求書には使用しないでください。 削除されたフレームの確認 バッファの監視に加えて、削除されたフレームを確認します。削除されたフレームが多すぎる場合は、より低いビットレー トのストリームに切り替えます。NetStreamInfo.droppedFrames プロパティを使用します。この読み取り専用のプロパティは 数値であり、現在の NetStream 再生セッションでドロップされたビデオフレームの数を返します。 削除されたフレームのレートを決定する方法の 1 つは次のとおりです。タイマーを使用して、削除されたフレームの現在の 値と前の値との違いを計算します。その違いを変数 droppedFPS に格納します。現在の 1 秒あたりの受信フレーム数を、別 の変数 currentFPS で監視します。droppedFPS が currentFPS 値の 20%を超えている場合、より低いビットレートに切り替え ます。 FLASH MEDIA SERVER 3.5 開発者ガイド 45 メディアアプリケーションの開発 ストリームの切り替え 同じコンテンツを異なるビットレートでエンコードするストリーム間のトランジションを要求する場合、クライアントアプ リケーションは NetStream.play2() メソッドを使用します。このメソッドでは、NetStreamPlayOptions オブジェクトをパラ メータとして使用します。このオブジェクトにはサーバーがストリームを切り替える方法を指定します。 注意:NetStream.play2() メソッドは NetStream.play() メソッドを拡張したものです。 NetStreamPlayOptions オブジェクトには次のプロパティが含まれています。 プロパティ 説明 oldStreamName 現在再生されているストリームの名前(古いストリーム)。 streamName 再生する新しいストリームの名前(ストリームの切り替え先)。 start 再生する新しいストリームの開始時間。 ほとんどの動的ストリーミングでは、デフォルト値の -2 が最適です。この値によって、streamName で指定されたライ ブストリームを再生するようにアプリケーションに通知されます。もし、その名前のライブストリームが見つからない場 合は、streamName で指定された記録ストリームが再生されます。ライブストリームも記録ストリームも見つからない場 合は、だれもパブリッシュしていなくても、streamName という名前のライブストリームを開きます。そのストリーム上 でだれかがパブリッシュを開始すると、アプリケーションがそれを受信します。 len 再生の継続時間(長さ)。 ほとんどの動的ストリーミングでは、デフォルト値の -1 が最適です。この値は、ライブストリームが使用できなくなる まで、または記録ストリームが終了するまで、アプリケーションがそれらを再生することを示します。 transition トランジションのモード。 使用可能な値は、NetStreamPlayTransition クラスの定数です。同じコンテンツを異なるビットレートで切り換えるた めに最適な値は SWITCH です。その他のモードの詳細については、『ActionScript 3.0 Language Reference』の 「NetStreamPlayTransition クラス」を参照してください。 次のコード例では、SWITCH オプションを使用して、より高いビットレートストリームに切り替えるようサーバーに通知し ます。この例では、新しいストリームを次の論理キーフレームでサーバーに切り替えるよう通知する oldStreamName の値を 渡しません。この方法によって、最もスムーズなビデオ環境が提供されます(再生リストを使用する場合は、 oldStreamName に値を渡します。37 ページの「再生リスト内のストリームのスワップ」を参照)。動的なストリームをビデ オおよびオーディオの記録ストリームに切り替える際、ほとんどの場合は、例にあるようにデフォルト値の start および len を保持することができます。 クライアントがトランジションを要求した場合、サーバーは NetStatusEvent.NET_STATUS イベントをコード NetStream.Play.Transition と共に送信します(ActionScript 2.0 では、onStatus イベントを同じコードと共に送信します)。 サーバーはこのイベントをクライアントに直ちに送信します。これは、操作が正常に終了したことを示します。新しいスト リームの最初のフレームがレンダリングされると、サーバーは onPlayStatus メッセージをコード NetStream.Play.TransitionComplete と共に送信します。このイベントによって、クライアントはいつ新しいストリームのレ ンダリングが開始されるのかを正確に知ることができます。 Flash Player が NetStream.Play.Transition メッセージを送信したあとでクライアントが検出を行うとストリームは正常に切 り替わりますが、Flash Player は NetStream.Play.TransitionComplete メッセージを送信しません。Player は、検出のあとで 新しい状態に入り、古い状態のステータスイベントを送信することができないので、メッセージを送信しません。Player は、onMetaData() などの他のコールバックメソッドでも同じように動作します。 次の例では、ストリームのトランジション関数を処理します。 FLASH MEDIA SERVER 3.5 開発者ガイド 46 メディアアプリケーションの開発 var stream:NetStream = new NetStream(connection); stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); stream.client = new CustomClient(); var video:Video = new Video(); video.attachNetStream(stream); stream.play("streamA_150kbps"); addChild(video); ... //Set up the transition to 700 kpbs content var param:NetStreamPlayOptions = new NetStreamPlayOptions(); param.streamName = streamA_700kpbs; param.transition = NetStreamPlayTransitions.SWITCH; stream.play2(param); //Handler function for the Transition event class CustomClient{ public function onPlayStatus(info:Object):void { trace("switch time: time=" + info.time + " name=" + info.name + " type=" + info.type); } } NetStream.Play.Transition ステータスイベントには、reason フィールドが含まれます。トランジション要求の状態についての 追加情報を取得するには、このフィールドを使用します。通常、reason フィールドには "NetStream.Transition.Success" とい うコードが含まれ、トランジション要求が成功して正常に処理されたことを示します。ライブストリーム間を切り替えると き、サーバーが 2 つのストリームの間の同期ポイントを検出できない場合があります。このような場合、サーバーは任意の フレームに対して強制的にトランジションを実行し、reason フィールドにコード "NetStream.Transition.Forced" を設定しま す。このような状況は、以下のような場合に発生する可能性があります。 • 切り替え対象の 2 つのストリームのタイムラインが同じではないため、サーバーが切り替えを実行する時点を選択できま せん。 • 新しいストリームのキーフレーム間隔が、クライアントの再生バッファより長いです。再生バッファの長さは、サーバー がトランジションを待機する時間の上限です。サーバーからキーフレームが見えないため、サーバーは切り替えのフレー ムを選択できません。 • ライブストリームのライブキュー遅延が、クライアントの再生バッファより長いです。長いキーフレーム間隔と似た遅延 が発生します。 ストリームのトランジション中のメタデータ処理 Flash Media Server は、ストリームのトランジションの一部がクライアントにレンダリングされる際に NetStream.Play.TransitionComplete ステータスのイベントを送信します。新しいストリームに切り替えられると、 NetStream.Play.TransitionComplete ステータスのイベントに続いて、新しいストリームの onMetadata メッセージが直ちに送 信されます。メタデータをキャプチャする前に TransitionComplete イベントをリッスンします。ストリームがライブである 場合、ストリームに関連付けられているすべてのデータキーフレームが送信されます。 クライアントバッファの設定 バッファリングは、ビデオの再生中の帯域幅の変動を管理します。 ユーザーが最良の機能を利用できるようにするには、最初はバッファを小さい値に設定します。値を小さくすると、スト リームの再生が比較的早く開始します。再生が開始した場合は、バッファを大きい値に設定します。値を大きくすることで、 ネットワークのノイズまたは中断の有無に関わらず、ストリームがよりスムーズに再生されます。 FLASH MEDIA SERVER 3.5 開発者ガイド 47 メディアアプリケーションの開発 最良の視聴環境を作成してユーザーに提供するには、ビデオの進行状況を監視し、ビデオのダウンロードするときのバッ ファを管理します。最良の再生環境を提供するには、それぞれのユーザーごとに異なるバッファサイズを設定することを検 討します。これを行う方法の 1 つとして、クライアントの帯域幅を測定し、この帯域幅に基づいて初期バッファサイズを設 定する方法があります。 ストリームを切り替える状況を判断するために、クライアントのバッファサイズを監視します。クライアントの帯域幅が適 切な場合、バッファ内のデータ量が増加するか、バッファがいっぱいになります。クライアントはサーバーに対してより高 いビデオのビットレートに切り替えるよう要求することができます。クライアントの帯域幅が小さい場合、バッファ内の データ量が減少するか、バッファが空になります。クライアントはサーバーに対してより低いビットレートに切り替えるよ う要求することができます。 NetStream.info() を呼び出し、ストリームの現在の統計を反映した次のプロパティと共に NetStreamInfoObject を取得します。 バッファを制御するプロパティは BufferLength および BufferByteLength プロパティです。これらのパラメータの詳細につい ては、『ActionScript 3.0 コンポーネントリファレンスガイド』を参照してください。 また、ストリームの再生中に、netStatus イベントを検出して処理することもできます。例えば、バッファがいっぱいになっ たとき、netStatus イベントは NetStream.Buffer.Full の info.code 値を返します。バッファが空になったときは、 NetStream.Buffer.Empty の code 値によって別のイベントが発生します。データのストリーミングが完了すると、 NetStream.Buffer.Flush イベントがディスパッチされます。これらのイベントをリッスンすることによって、バッファが空に なった場合バッファサイズを小さくし、バッファがいっぱいになった場合バッファサイズを大きくすることができます。 注意:Flash Player 9 アップデート 3 以降では、ストリームが一時停止されたときにバッファがクリアされなくなりました。 この機能により、視聴者が間を空けずに再生を再開できるようになりました。コードで NetStream.pause() を使用してデータ をバッファすることができます。例えば、閲覧者がコマーシャルを見ている間にデータをバッファし、メインのビデオが開 始されたときにストリームの一時停止を解除することができます。詳細については、『ActionScript リファレンスガイド』 の「NetStream.pause()」の項目を参照してください。 バッファ時間の設定 バッファ時間を秒単位で変更するには、NetStream.bufferTime プロパティを設定します。 ns.bufferTime(10); バッファに適するサイズは、ユーザーの帯域幅によって異なります。次に示す値は推奨値です。接続が高速な場合は、5 ∼ 10 秒が初期バッファサイズとして適切な値です。より低速な接続では、10 秒が適切な初期バッファサイズです。再生の開 始後は、バッファサイズとして適切な値は 30 ∼ 60 秒です。 バッファイベントの処理 この例では、バッファイベントを検出して、イベントの発生に合わせてバッファ時間を動的に調整する方法を示しています。 ここでコードの主要部分を示しています。完全なサンプルについては、Buffer.as サンプルファイルを参照してください。 1 メインクライアントクラスのコンストラクタ関数内で、NetConnection オブジェクトを作成し、サーバーに接続します (Flash Media Server のルートインストールディレクトリ内の documentation/samples/Buffer ディレクトリにある Buffer.as を参照してください)。 nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); nc.connect("rtmp://localhost/Buffer"); 2 netStatus イベントハンドラを記述します。成功したか、失敗したかおよびバッファがいっぱいになったときおよびバッ ファが空になったときのイベントを確認し、それに応じてバッファサイズを変更します。 FLASH MEDIA SERVER 3.5 開発者ガイド 48 メディアアプリケーションの開発 private function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetConnection.Connect.Success": trace("The connection was successful"); connectStream(nc); break; case "NetConnection.Connect.Failed": trace("The connection failed"); break; case "NetConnection.Connect.Rejected": trace("The connection was rejected"); break; case "NetStream.Buffer.Full": ns.bufferTime = 30; trace("Expanded buffer to 30"); break; case "NetStream.Buffer.Empty": ns.bufferTime = 8; trace("Reduced buffer to 8"); break; } } 3 ストリームを再生するためのカスタムメソッドを記述します。このメソッドの中で、初期のバッファ時間を設定します。 次の例では、2 秒に設定します。 private function connectStream(nc:NetConnection):void { ns:NetStream = new NetStream(nc); ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); ns.client = new CustomClient(); video = new Video(); video.attachNetStream(ns); ns.play( "bikes", 0 ); ns.bufferTime = 8; trace("Set an initial buffer time of 8 seconds"); addChild(video); } 4 onMetaData() イベントハンドラおよび onPlayStatus() イベントハンドラを作成します。 public function onMetaData(info:Object):void { trace("Metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); } public function onPlayStatus(info:Object):void { switch (info.code) { case "NetStream.Play.Complete": trace("The stream has completed"); break; } } これらのイベントハンドラは、NetStream.play() を呼び出すときに必要になります。 FLASH MEDIA SERVER 3.5 開発者ガイド 49 メディアアプリケーションの開発 ログファイルでのトランジションの識別 アクセスログでストリームのイベントを追跡できます。ログを使用すると、トランジションがある単一のストリーム再生と、 ストリームの複数の再生や異なるストリームの再生を区別できます。単一のコンテンツストリームのトランジションが行わ れると、サーバーはトランジションとしてストリームのステータスを追跡します。サーバーは、元のストリームに対して stop イベントを、新しいストリームに対して play イベントをログに記録します。通常の stop イベントおよび play イベント (トランジションを使用しない stop または play)のステータスコードは 200 です。ストリームのトランジションのステータ スコードは 210 です。アクセスログには、次の追加情報が提供されます。 フィールド 説明 x-sid ストリームの ID。この ID は、そのクライアントセッションでは一意ですが、セッション間では一意ではありませ ん。 x-trans-sname サーバーがトランジションしたストリームの名前(元のストリーム) x-trans-sname-query サーバーがトランジションしたストリームのストリーム名のクエリー部分 x-trans-file-ext サーバーがトランジションしたストリームのストリーム名のファイル名拡張子部分 ログプロセッサを使用する場合、ステータスコードと x-sid 値の両方が参照されていることを確認してください。単一の論 理ストリーム上で行われたトランジションを識別するには両方の値を参照します。通常のストリームでは、ストリームのト ランジションは再生 / 停止のペアで行われます。同じストリーム上の 210 のステータスコードの play イベントと、それに続 く 210 のステータスコードの stop イベントを識別することで、ログプロセッサはストリームのトランジションを追跡できま す。ステータスコードを参照することで、ログプロセッサはトランジションのない play イベントまたは stop イベントから のストリームのトランジションを区別することができます。 帯域幅の検出 ActionScript 3.0 でのネイティブな帯域幅検出機能 クライアントは、正常にサーバーに接続した後で、帯域幅検出を開始する必要があります。帯域幅検出を開始するには、特 別なコマンドである checkBandwidth を指定して、NetConnection.call() を呼び出します。サーバーサイドコードは必要あり ません。 注意:Bandwidth サンプルの Bandwidth.as をご利用ください(これは ActionScript 3.0 で記述されています)。 Application.xml の編集 ❖ アプリケーション用の Application.xml ファイル内で、帯域幅検出が有効になっていることを確認します。 帯域幅検出は、デフォルトでは有効になっています。アプリケーションに固有の Application.xml ファイルまたは仮想 ホストに適用される Application.xml ファイルを使用することができます(詳細については、『Adobe Flash Media Server 設定および管理ガイド』を参照してください)。 クライアントのイベントハンドラクラスの記述 ❖ イベントを処理し、サーバーの帯域幅検出機能を呼び出すための ActionScript 3.0 クラスを作成します。このクラスで は、onBWCheck 関数と onBWDone 関数を実装する必要があります。 FLASH MEDIA SERVER 3.5 開発者ガイド 50 メディアアプリケーションの開発 class Client { public function onBWCheck(... rest):Number { return 0; } public function onBWDone(... rest):void { var p_bw:Number; if (rest.length > 0) p_bw = rest[0]; // your application should do something here // when the bandwidth check is complete trace("bandwidth = " + p_bw + " Kbps."); } } onBWCheck() 関数は、ネイティブな帯域幅検出で必要となります。この関数は、引数として ...rest を使用します。値が 0 であった場合でも、クライアントがデータを受信したことをサーバーに通知するため、この関数は必ず値を返します。 onBWCheck() は複数回呼び出すことができます。 帯域幅の測定を終了すると、サーバーは onBWDone() 関数を呼び出します。この関数は 4 つの引数を使用します。1 番目 の引数は、測定した帯域幅を Kbps 単位で返します。2 番目および 3 番目の引数は使用しません。4 番目の引数は、ミリ 秒単位の待ち時間です。 このクラスは、ActionScript 3.0 のメインクラスのクライアントです。 メインクラスの記述 1 ActionScript 3.0 のメインクラスを作成し、任意のパッケージとクラス名を指定します。 package { import flash.display.Sprite; import flash.net.NetConnection; import flash.events.NetStatusEvent; public class Bandwidth extends Sprite { } } 同一のファイル内で、メインクラスとクライアントクラスの両方を作成することができます。 2 メインクラスのコンストラクタ内で、NetConnection オブジェクトを作成し、NetConnection.client プロパティにクライ アントクラスのインスタンスを設定して、サーバーに接続します。 private var nc:NetConnection; public function Bandwidth() { nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); nc.client = new Client(); nc.connect("rtmp://localhost/FlashVideoApp"); } 3 netStatus イベントハンドラ内で、正しく接続された場合に NetConnection.call() を呼び出します。このメソッドには、実 行するコマンドとして checkBandwidth を指定し、応答オブジェクトに null を指定します。 FLASH MEDIA SERVER 3.5 開発者ガイド 51 メディアアプリケーションの開発 public function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetConnection.Connect.Success": // calls bandwidth detection code built in to the server // no server-side code required trace("The connection was made successfully"); nc.call("checkBandwidth", null); break; case "NetConnection.Connect.Rejected": trace ("sorry, the connection was rejected"); break; case "NetConnection.Connect.Failed": trace("Failed to connect to server."); break; } } 注意:checkBandwidth() メソッドは、サーバー上の Client クラスに属します。 サンプルの実行 ❖ Flash または Flex Builder からメインクラスをテストします。次のような出力で、クライアントの帯域幅が示されます。 [SWF] C:\samples\Bandwidth\bin\Bandwidth-debug.swf - 2,137 bytes after decompression The connection was made successfully bandwidth = 7287 この例では、Client クラスは単に帯域幅の値を表示しています。実際のクライアントでは、クライアントへのストリー ミングの際にクライアントの帯域幅に応じて特定の記録済みビデオを選択するなど、何らかの処理を実行する必要があり ます。 ActionScript 2.0 でのネイティブな帯域幅検出機能 ActionScript 2.0 でもネイティブな帯域幅検出機能を使用することができます。ActionScript 3.0 の場合と同様に、 onBWCheck() および onBWDone() という名前の関数を定義し、NetConnection.call() を呼び出して、関数名 checkBandwidth に渡します。 注意:BandwidthAS2 サンプルの BandwidthAS2.as をご利用ください(これは ActionScript 2.0 で記述されています)。 Application.xml の編集 ❖ アプリケーション用の Application.xml ファイル内で、帯域幅検出が有効になっていることを確認します。 帯域幅検出は、デフォルトでは有効になっています。アプリケーションに固有の Application.xml ファイルまたは仮想 ホストに適用される Application.xml ファイルを使用することができます(詳細については、『Adobe Flash Media Server 設定および管理ガイド』を参照してください)。 認証コードを書く 1 onBWCheck() という名前のイベントハンドラを定義します。このイベントハンドラでは、サーバーが送信したデータを 受け取ります。 NetConnection.prototype.onBWCheck = function(data) { return 0; } このハンドラは値を返す必要がありますこの値は任意の値でかまいません(0 を含む)。値を返すことによって、データ を受け取ったことをサーバーに通知します。 FLASH MEDIA SERVER 3.5 開発者ガイド 52 メディアアプリケーションの開発 2 onBWDone() という名前の、1 つのパラメータを受け取るイベントハンドラを定義します。このパラメータは、測定され た帯域幅を Kbps で表します。 NetConnection.prototype.onBWDone = function(bw) { trace("bw = " + bw + " Kbps"); } サーバーが帯域幅の検出を完了すると、onBWDone() を呼び出し、帯域幅の数値を返します。 1 onStatus ハンドラを定義します。このハンドラ内で、正しく接続されたときに、サーバーの checkBandwidth を呼び出し ます。 NetConnection.prototype.onStatus = function(info) { if (info.code == "NetConnection.Connect.Success") { this.call("checkBandwidth"); // tell server to start bandwidth detection } } 2 NetConnection オブジェクトを作成してサーバーに接続します。 nc = new NetConnection(); nc.connect("rtmp://host/app"); スクリプトベースの帯域幅検出 サーバーでのネイティブな帯域幅検出機能を無効にし、サーバーサイドスクリプトの中で帯域幅検出を使用することができ ます。これは、既存のコードを再利用する場合などに特に有効です。 エッジサーバーを使用している場合、ネイティブな帯域幅検出は、オリジンサーバーの負荷を減らすために最も外側のエッ ジサーバーで実行されます。ただし、スクリプトベースの帯域幅検出によって、エッジサーバーからクライアントに対して ではなく、オリジンサーバーからクライアントに対する帯域幅が決定されます。オリジンサーバーとエッジサーバーとの間 に遅延が存在すると、帯域幅の計算に影響が出る場合があります。 A B C オリジンサーバーとエッジサーバーとの間の遅延によって、帯域幅の測定に影響が出る場合があります。 A. オリジンサーバー B. エッジサーバー C. クライアント スクリプトベースの帯域幅検出を使用するには、アドビ システムズ社が提供する、帯域幅検出用の main.asc ファイルを使 用します。main.asc ファイルは vod アプリケーションに含まれています。ActionScript 3.0 クライアントに変更を加えるこ とが必要な場合もあります(BandwidthServer.as(ActionScript 3.0)サンプルを参照してください)。この帯域幅検出は、 vod アプリケーションに接続したり、ネイティブな帯域幅検出機能を使用したりする場合よりも、信頼性が低いことに注意 してください。 Application.xml の編集 ❖ アプリケーション用の Application.xml ファイル内で、ネイティブな帯域幅検出機能を無効にします。 帯域幅検出は、デフォルトでは有効になっています。 FLASH MEDIA SERVER 3.5 開発者ガイド 53 メディアアプリケーションの開発 クライアントのイベントハンドラクラスの記述 1 ネイティブな帯域幅検出機能を使用している場合と同様の動作を行うように、クライアントコードを記述します(49 ページの「ActionScript 3.0 でのネイティブな帯域幅検出機能」を参照してください)。サーバーに接続するためのメイ ンクラスと、イベントハンドラクラスの、少なくとも 2 つのクラスを作成します。 2 イベントハンドラクラス内で、次のように onBWCheck 関数と onBWDone 関数を定義します。 class Client { public function onBWCheck(... rest):Number { return 0; } public function onBWDone(... rest):void { var p_bw:Number; if (rest.length > 0) p_bw = rest[0]; trace("bandwidth = " + p_bw); } } onBWCheck() が値を返すことを確認します。また、onBWDone() にアプリケーションロジックが記述されていることを確認 します。 サーバーサイドコードからの帯域幅の検出 次のサーバーサイド ActionScript コードによって、サーバーから帯域幅検出を開始します。 application.onConnect = function (clientObj){ this.acceptConnection(clientObj); clientObj.checkBandwidth(); } サーバーから帯域幅検出を開始している場合、クライアントから checkBandwidth() を呼び出さないでください。 ストリームの長さの検出 ストリームの長さの検出について サーバーサイドの Stream.length() メソッドを呼び出して、オーディオストリームまたはビデオストリームの長さを秒単位で 取得します。この長さは Flash Media Server によって測定されるものであり、onMetaData によって返される長さ(これは ユーザーやツールによって設定されます)とは異なります。 ストリーム名を Stream.length() メソッドに渡します。アプリケーションインスタンスからの相対 URI に仮想ストリーム名ま たはストリーム名を渡すことができます。 例えば、次のコードでは、アプリケーションの streams/_definst_ フォルダに格納されているストリームの長さを取得しま す。 // for length // for length // for length an FLV file = Stream.length("parade"); an MP3 file = Stream.length("mp3:parade.mp3"); an MP4 file = Stream.length("mp4:parade.mp4"); ストリームの長さの取得 この例では、サーバーサイド ActionScript を使用してストリームの長さを取得しています。 FLASH MEDIA SERVER 3.5 開発者ガイド 54 メディアアプリケーションの開発 注意:StreamLength サンプルの main.asc(サーバーサイド ActionScript)や StreamLength.as(ActionScript 3.0)を 使用します。サンプルを実行するには、10 ページの「アプリケーションのデプロイメント」の一般的な手順を参照してくだ さい。 認証コードを書く クライアントが、サーバーに格納されているストリームの長さを取得する必要がある場合があります。例えば、ユーザーが Flash のプレゼンテーションを再生するかどうかを判断できるように、そのプレゼンテーションのビデオの長さを表示する 場合などがあります。 これを実行するには、サーバーサイドコードに Stream.length() を呼び出すメソッドを定義し、クライアントが NetConnection.call() を使用してこのメソッドを呼び出すようにします。 ❖ main.asc の中で、client オブジェクトに関数を定義し、この関数の中で Stream.length() を呼び出します。これは、 onConnect ハンドラ内で実行します。 application.onConnect = function( client ) { client.getStreamLength = function( streamName ) { trace("length is " + Stream.length( streamName )); return Stream.length( streamName ); } application.acceptConnection( client ); } メインクライアントクラスの記述 メインクライアントクラスから、サーバーサイドコード内の getStreamLength() を呼び出します。応答を格納するための Responder オブジェクトを作成する必要があります。 var responder:Responder = new Responder(onResult); この行では、onResult() 関数が結果を処理するように指定しています。以下の手順で示すように、onResult() を記述すること も必要です。 1 通常通り、クライアントコード内で、パッケージの作成、クラスの読み込み、変数の定義を行います。 package { import flash.display.Sprite; import flash.net.NetConnection; import flash.events.NetStatusEvent; import flash.net.NetStream; import flash.net.Responder; import flash.media.Video; ... 2 新しいクラス、StreamLength を作成します。 public class StreamLength extends Sprite { var nc:NetConnection; var stream:NetStream; var video:Video; var responder:Responder; } ... 3 StreamLength クラス用コンストラクタ内で、NetConnection.connect() を呼び出してサーバーに接続します。 FLASH MEDIA SERVER 3.5 開発者ガイド 55 メディアアプリケーションの開発 public function StreamLength() { nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); nc.connect("rtmp://localhost/StreamLength"); } 4 netStatus イベントハンドラを追加し、正しく接続された場合、接続が拒否された場合、接続が失敗した場合の処理を行 います。 private function netStatusHandler(event:NetStatusEvent):void { trace("connected is: " + nc.connected ); trace("event.info.level: " + event.info.level); trace("event.info.code: " + event.info.code); switch (event.info.code) { case "NetConnection.Connect.Success": trace("Congratulations! you're connected"); connectStream(nc); break; case "NetConnection.Connect.Rejected": case "NetConnection.Connect.Failed": trace ("Oops! the connection was rejected"); break; } } 5 接続が正しく行われた場合にストリームを再生するための関数を記述します。この関数内で Responder オブジェクトを 作成します。このオブジェクトは、onResult() という名前の関数の中で応答を処理します。次に、NetConnection.call() を 呼び出します。このメソッドには、サーバー上で呼び出す関数である getStreamLength、Responder オブジェクト、スト リームの名前を指定します。 // play a recorded stream on the server private function connectStream(nc:NetConnection):void { stream = new NetStream(nc); stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); stream.client = new CustomClient(); responder = new Responder(onResult); nc.call("getStreamLength", responder, "bikes" ); } 6 onResult() 関数を記述します。この関数は、サーバー上の getStreamLength() によって返されるストリームの長さを処理し ます。 private function onResult(result:Object):void { trace("The stream length is " + result + " seconds"); output.text = "The stream length is " + result + " seconds"; } クライアントのイベントハンドラクラスの記述 ❖ 通常のストリームの再生と同様に、onMetaData イベントと onPlayStatus イベントを処理するための個別のクラスを記述 します。 FLASH MEDIA SERVER 3.5 開発者ガイド 56 メディアアプリケーションの開発 class CustomClient { public function onMetaData(info:Object):void { trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); } public function onPlayStatus(info:Object):void { trace("handling playstatus here"); } } 57 第 4 章:ビデオの操作 Adobe Flash Media Server は、オーディオおよびビデオのライブコンテンツを、Flash Player、AIR および Flash Lite ク ライアントにブロードキャストできます。ライブコンテンツのキャプチャとエンコードを行い、Flash Media Server にスト リーミングするには、Adobe Media Live Encoder を使用するか、カスタムの Flash Player または AIR アプリケーションを 作成します。 ライブイベントをリアルタイムでキャプチャし、多数の聴衆にストリーミング送信したり、ライブのオーディオとビデオを 含むソーシャルメディアアプリケーションを作成したりすることができます。例えば、Adobe® Acrobat® Connect™ Pro は、Flash Media Server を使用してライブのオーディオとビデオのキャプチャおよびブロードキャストを行う Web 会議ア プリケーションです。 ライブビデオのキャプチャ ライブビデオをキャプチャするための Flash Media Encoder の使用 Flash Media Live Encoder は、ライブビデオのキャプチャ、エンコードおよび Flash Media Server へのストリーミングを 行うフリーのアプリケーションです。デフォルトでは、Flash Media Live Encoder はビデオを rtmp://localhost/live のラ イブサービスにストリーミングするように設定されています。 Flash Media Server 3.5 は、ライブサービスからストリーミング再生が可能なサンプルのビデオ Player と共にインストール されます。ビデオ Player は、RootInstall\samples\ フォルダにインストールされます。Apache Web サーバーをインス トールした場合、http://localhost の Start Screen からビデオ Player にアクセスすることができます。 また、Flash の FLVPlayback コンポーネントをビデオ Player として使用することもできます。使用方法については、 www.adobe.com/go/learn_fms_livestream_jp にある『Beginner’s guide to streaming live video with Flash Media Server 3』(英語)を参照してください。 Flash Media Live Encoder の詳細については、www.adobe.com/go/fme(英語)を参照してください。 関連項目 13 ページの「ライブサービスの使用」 例:カスタムビデオキャプチャアプリケーション ActionScript 3.0 のアプリケーション構築手順は次のとおりです。 • ビデオをキャプチャしエンコードします。 • キャプチャした状態でビデオを表示します。 • ビデオをクライアントから Flash Media Server にストリーミングします。 • 逆にビデオを Flash Media Server からクライアントにストリーミングします。 • サーバーからストリーミングされたビデオを表示します。 注意:このコードをテストするには、サーバーに RootInstall/applications/publishlive フォルダを作成します。次に、 RootInstall/documentation/samples/publishlive/PublishLive.swf ファイルを開いてアプリケーションに接続します。 1. 新規 .as ファイルで、NetConnection オブジェクトを作成します。サーバーに接続するには、アプリケーションの URI を NetConnection.connect() メソッドに渡します。 FLASH MEDIA SERVER 3.5 開発者ガイド 58 ビデオの操作 var var var var var var var nc:NetConnection; ns:NetStream; nsPlayer:NetStream; vid:Video; vidPlayer:Video; cam:Camera; mic:Microphone; nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); nc.connect("rtmp://localhost/publishlive"); 2. NetStatusEvent イベントを処理する関数を定義します。クライアントがサーバーへの接続に成功すると、コードがアプリ ケーションを実行する関数を呼び出します。 function onNetStatus(event:NetStatusEvent):void{ trace(event.info.code); if(event.info.code == "NetConnection.Connect.Success"){ publishCamera(); displayPublishingVideo(); displayPlaybackVideo(); } } 3. カメラでキャプチャしたビデオとマイクでキャプチャしたオーディオをパブリッシュします。最初に、カメラおよびマイ クのデータのリファレンスを取得します。サーバーに作成した NetConnection に NetStream オブジェクトを作成します。 次に、NetStream.attachCamera() を呼び出して、キャプチャしたビデオを NetStream オブジェクトに割り当てます。 NetStream.attachAudio() を呼び出して、ライブオーディオを割り当てます。最後に、NetStream.publish("streamName", "live") を呼び出して、オーディオとビデオをサーバーに送信します。 function publishCamera() { cam = Camera.getCamera(); mic = Microphone.getMicrophone(); ns = new NetStream(nc); ns.attachCamera(cam); ns.attachAudio(mic); ns.publish("myCamera", "live"); } 4. クライアントがサーバーにストリーミングしているビデオを表示します。Video オブジェクトを作成します。Video オブ ジェクトは表示オブジェクトです。Video.attachCamera(cam) を呼び出して、カメラのビデオフィードをビデオオブジェクト に割り当てます。addChild(vid) を呼び出して、Video オブジェクトを表示リストに追加し、Flash Player に表示されるよう にします。 function displayPublishingVideo():void { vid = new Video(); vid.x = 10; vid.y = 10; vid.attachCamera(cam); addChild(vid); } 5. サーバーがクライアントにストリーミングしているビデオを表示します。クライアントがストリームを作成してサーバー に送信する処理は「パブリッシュ」と呼ばれます。一方、クライアントがストリームを再生する処理は「サブスクライブ」 と呼ばれます。この例では、クライアントはストリームをパブリッシュし、ストリームにサブスクライブします。クライア ントでは、送信(パブリッシュ)ストリームと受信(サブスクライブ)ストリームの 2 つのストリームを作成する必要があ ります。この例では、送信ストリームは ns で、受信ストリームは nsPlayer です。同じ NetConnection オブジェクトを両方 のストリームに使用することができます。 サーバーから返されたオーディオとビデオを再生するには、NetStream.play() を呼び出し、パブリッシュしたストリームの名 前を渡します。受信ビデオを再生するには、Video.attachNetStream() を呼び出します。 FLASH MEDIA SERVER 3.5 開発者ガイド 59 ビデオの操作 function displayPlaybackVideo():void{ nsPlayer = new NetStream(nc); nsPlayer.play("myCamera"); vidPlayer = new Video(); vidPlayer.x = cam.width + 20; vidPlayer.y = 10; vidPlayer.attachNetStream(nsPlayer); addChild(vidPlayer); } ActionScript を使用して、再生の制御、ビデオのフルスクリーン表示、キューポイントの使用およびメタデータの使用が行 えるようにします。詳細については、www.adobe.com/go/learn_fms_video_jp にある『ActionScript 3.0 のプログラミ ング』の「ビデオの操作」の章を参照してください。 この例は Flash に構築されました。Flex に構築された例を見るには、www.adobe.com/go/fms_featureexplorer にある FMS Feature Explorer AIR アプリケーションをダウンロードします。指示に従ってサンプルアプリケーションの ZIP ファ イルをダウンロードし、サーバーのアプリケーションフォルダに解凍します。アプリケーションをサーバーに登録した場合、 FMS Feature Explorer で AVControl / Publish Live Video application を開きます。アプリケーションに構築された ビューアでソースコードを表示することができます。 ライブビデオへの DVR 機能の追加 DVR サポートについて 注意:Flash Media Streaming Server は DVR 機能をサポートしていません。 DVR(デジタルビデオレコーダ)を使用すると、ビューアでライブビデオを一時停止したり、一時停止の地点から再生を再 開したりすることができます。また、ビューアではライブイベントの巻き戻し、記録されたセクションの再生およびライブ セクションの再検出も可能です。Flash Media Server 3.5 では、DVR 機能のサポートが追加されています。数行のコードを 記入するだけで、ビデオ Player を DVR のように動作させることができます。DVR アプリケーションの例には、即時再生 および「追いかけ」サービスがあります。 注意:アドビは、DVR 機能をサポートするよう FLVPlayback コンポーネントを更新しています。 www.adobe.com/go/learn_fms_docs_jp にある『Flash Media Server Help』および『Support Center』で、コンポーネ ントが利用可能か確認してください。 DVR 再生用ビデオのパブリッシュ DVR 機能を使用してのストリーム再生では、ライブストリームではなく記録されたストリームを再生します。ストリーム を「ライブ」で表示しているときは、記録された直後に記録ストリームを実際に表示しています。 クライアントから DVR ビデオ Player 用にストリームをパブリッシュするには、SWF ファイルまたは AIR アプリケーショ ンで次のコードを使用します。 NetStream.publish("myvideo", "record") NetStream.publish("myvideo", "append") サーバーから DVR ビデオ Player 用にストリームをパブリッシュするには、次のサーバーサイドコードを使用します。 Stream.record("record") Stream.record() メソッドには、ストリームの最大長とファイルサイズが指定可能な maxDuration と maxSize の 2 つの新規パ ラメータがあります。次のコードは、最大記録長 10 分(600 秒)およびファイルサイズ無制限でストリームをパブリッシュ します。 Stream.record("record", 600, -1) FLASH MEDIA SERVER 3.5 開発者ガイド 60 ビデオの操作 DVR ビデオ Player 用にパブリッシュされたストリームをサブスクライブするには、次のコードを使用します。 NetStream.play("myvideo", 0, -1) 前記のコードを使用すると、イベントに遅れて参加したビューアでも、ストリームを最初から表示できます。 いつでもストリームの最初に戻るには、次のコードを呼び出します。 NetStream.seek(0) イベントの途中で記録を開始するには、サーバーサイド ActionScript の Stream.record() メソッドを呼び出します。このメ ソッドを呼び出すことで、いつでも記録の開始や停止が可能になります。 最新の有効記録箇所(「ライブ」とみなされます)まで検出するボタンを作成するには、例えば次のように大きい数まで検出 します。 NetStream.seek(1000000) Flash Media Live Encoder を使用した DVR 再生用ビデオのキャプチャ Flash Media Live Encoder 3 を使用して、DVR 再生用のビデオをキャプチャすることができます。Flash Media Live Encoder の以前のバージョンは、サーバーへの記録をサポートしていません。詳細については、 http://www.adobe.com/go/fme を参照してください。 例:カスタムキャプチャ、パブリッシュおよび DVR 再生 この例では、クライアントアプリケーションは以下の動作を行います。 • ビデオをキャプチャしエンコードします。 • キャプチャした状態でビデオを表示します。 • ビデオをクライアントから Flash Media Server にストリーミングします。 • 逆にビデオを Flash Media Server からクライアントにストリーミングします。 • サーバーからストリーミングされたビデオを、ライブビデオの巻き戻しと一時停止が可能な Player に表示します。 注意:このコードをテストするには、サーバーに RootInstall/applications/dvr フォルダを作成します。次に、 RootInstall/documentation/samples/dvr/DVR.swf ファイルを開いてアプリケーションに接続します。 1 Flash Media Server に、RootInstall/applications/dvr フォルダを作成します。 2 Flash で、ActionScript ファイルを作成し、DVR.as という名前で保存します。 3 次のコードを Script ウィンドウにコピーアンドペーストします。 FLASH MEDIA SERVER 3.5 開発者ガイド 61 ビデオの操作 package { import flash.display.MovieClip; import flash.net.NetConnection; import flash.events.*; import flash.net.NetStream; import flash.media.Video; import flash.media.Camera; import flash.media.Microphone; import fl.controls.Button; public class DVR 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 pauseBtn:Button; private var rewindBtn:Button; private var playBtn:Button; private var dvrFlag:Boolean; public function DVR() { nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); nc.connect("rtmp://localhost/dvr"); setupButtons(); dvrFlag = true; } private function onNetStatus(event:NetStatusEvent):void{ trace(event.info.code); switch(event.info.code){ case "NetConnection.Connect.Success": publishCamera(); displayPublishingVideo(); displayPlaybackVideo(); break; case "NetStream.Play.Start": trace("dvrFlag " + dvrFlag); if(dvrFlag){ nsPlayer.seek(1000000); dvrFlag = false; } break; } } private function onAsyncError(event:AsyncErrorEvent):void{ trace(event.text); } private function onClick(event:MouseEvent):void { switch(event.currentTarget){ case rewindBtn: nsPlayer.seek(nsPlayer.time - 5); break; case pauseBtn: nsPlayer.pause(); break; case playBtn: FLASH MEDIA SERVER 3.5 開発者ガイド 62 ビデオの操作 nsPlayer.resume(); break; } } private function publishCamera() { cam = Camera.getCamera(); mic = Microphone.getMicrophone(); ns = new NetStream(nc); ns.client = new CustomClient(); ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError); ns.attachCamera(cam); ns.attachAudio(mic); ns.publish("myvideo", "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 = new CustomClient(); nsPlayer.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); nsPlayer.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError); nsPlayer.play("myvideo", 0, -1); vidPlayer = new Video(cam.width, cam.height); vidPlayer.x = cam.width + 20; vidPlayer.y = 10; vidPlayer.attachNetStream(nsPlayer); addChild(vidPlayer); } private function setupButtons():void { rewindBtn = new Button(); pauseBtn = new Button(); playBtn = new Button(); rewindBtn.width = 50; pauseBtn.width = 50; playBtn.width = 50; rewindBtn.move(180,150); FLASH MEDIA SERVER 3.5 開発者ガイド 63 ビデオの操作 pauseBtn.move(235,150); playBtn.move(290,150); rewindBtn.label = "Rewind"; pauseBtn.label = "Pause"; playBtn.label = "Play"; rewindBtn.addEventListener(MouseEvent.CLICK, onClick); pauseBtn.addEventListener(MouseEvent.CLICK, onClick); playBtn.addEventListener(MouseEvent.CLICK, onClick); addChild(rewindBtn); addChild(pauseBtn); addChild(playBtn); } } } class CustomClient { public function onMetaData(info:Object):void { trace("metadata: duration=" + info.duration); } } 4 DVR.as ファイルを保存します。 5 File / New / Flash File(ActionScript 3.0)を選択し、「OK」をクリックします。 6 ファイルを DVR.as ファイルと同じフォルダに DVR.fla という名前で保存します。 7 コンポーネントパネルを開き、Button をステージまでドラッグして削除します。 この操作により、ボタンがライブラリに追加されます。ボタンは実行時にアプリケーションに追加されます。 8 ファイル/パブリッシュ設定を選択します。「Flash」タブをクリックします。「Script Settings」をクリックし、DVR を Document クラスとして入力します。チェックマークをクリックしてパスを検証します。 9 ファイルを保存し、Control / Test Movie を選択してアプリケーションを実行します。 記録のサイズと時間の制限 Application.xml 設定ファイルのパラメータ、サーバーサイド ActionScript および Authorization プラグインを使用して、 記録の最大サイズと時間を制限することができます。これらの値を設定してディスクスペースの使い過ぎを防ぎます。以下 は、Application.xml ファイルのパラメータです。 XML 要素 説明 Application/StreamManager/Recording/MaxDuration 秒単位の最大記録時間。デフォルト値は -1 で、最大時間は適用さ れません。 Application/StreamManager/Recording/MaxDurationCap 秒単位の最大記録キャップ時間。デフォルト値は -1 で、最大時間 のキャップは適用されません。 サーバーサイド Stream.record() メソッドはこの値より優先されま せん。Authorization プラグインはこの値より優先されます。 Application/StreamManager/Recording/MaxSize キロバイト単位の最大記録サイズ。デフォルト値は -1 で、最大サ イズは適用されません。 Application/StreamManager/Recording/MaxSizeCap キロバイト単位の最大記録キャップサイズ。デフォルト値は -1 で、 最大サイズのキャップは適用されません。 サーバーサイド Stream.record() メソッドはこの値より優先されま せん。Authorization プラグインはこの値より優先されます。 FLASH MEDIA SERVER 3.5 開発者ガイド 64 ビデオの操作 Application.xml ファイルでは、最大値の設定に加え、最大キャップ値を設定することもできます。サーバーサイドスクリ プトはこれらのキャップより優先されません。CDN はこれらのキャップを使用して、クライアントが優先されない制限を 設定することができます。 注意:Authorization プラグインは、Application.xml ファイルに設定されたすべての値より優先されます。 サーバーサイド ActionScript で値を設定するには、Stream.record() を呼び出し、maxDuration および maxSize パラメータの 値を渡します。次のコードは記録を 5 分に制限し、(MaxSizeCap の値まで)無制限の最大ファイルサイズを設定します。 s.record("record", 300, -1); サーバーは、MaxCapSize および MaxCapDuration を上回る記録を切り捨てます。 DVR アプリケーションのスケーリング 大規模なアプリケーションを構築するには、サーバーサイド NetConnection クラスを使用して、複数のサーバーをまとめ てチェーン化します。このシナリオでは、クライアントは接続したサーバー上にないストリームを要求することができます。 サーバーサイド ProxyStream クラスを使用して、サーバーチェーンでストリームを探す検索メカニズムを作成します。 Vhost.xml 設定ファイルに値を設定して、ストリームを格納するディスクキャッシュを設定することができます。 XML 要素 属性 説明 VirtualHost/Proxy/CacheDir enabled ディスクキャッシュが有効かどうかを判断します。 useAppDir アプリケーションでキャッシュのサブディレクトリを分割するか指 定します。 VirtualHost/Proxy/CacheDir/Path ディスクキャッシュのルートディレクトリ。 VirtualHost/Proxy/CacheDir/MaxSize ギガバイト単位の最大ディスクサイズ。デフォルト値は 32 です。 値が 0 の場合、ディスクキャッシュが無効になります。値が -1 の場 合、最大値は指定されません。 VirtualHost/Proxy/RequestTimeout 上流サーバーからの要求(メタデータではコンテンツなど)に対す る応答を待つ、秒単位の最大時間。デフォルト値は 2 秒です。 サーバーに複数の仮想ホストがある場合は、仮想ホストをそれぞれのキャッシュディレクトリに指定します。 サーバーが CacheDir への書き込み中に中間またはエッジサーバーでディスクスペースを使い果たすと、ディスクへの書き込 みに失敗した各セグメントの core.xx.log に次の警告メッセージが記録されます。I/O Failed on cached stream file C:\Program Files\Adobe\Flash Media Server 3.5\cache\streams\00\proxyapp\10.192.16.125\C\Program Files\Adobe\Flash Media Server 3.5_361\applications\primaryapp\streams\_definst_\sample1_1500kbps.f4v\0000000000000000 during write: 28 No space left on device. Logging DVR ビデオ Player で再生したストリームは、記録されたストリームとして再生されます。これらのストリームは、すべて 記録されたストリームとして同じイベントをログファイルに記録します。 関連項目 41 ページの「動的ストリーミング」 FLASH MEDIA SERVER 3.5 開発者ガイド 65 ビデオの操作 ライブストリームへのメタデータの追加 メタデータについて Flash Media Server では、ライブビデオストリームの先頭にデータメッセージを追加することができます。このメタデータ には、タイトル、著作権情報、ビデオの再生時間、または作成日など、ビデオについての情報を含めることができます。メ タデータは広告情報や、スポーツのスコアのような現在の統計を含む場合もあります。サーバーに接続しているクライアン トは、遅れて接続した場合でも、ライブビデオを再生するとメタデータを受信します。 追加するメタデータは、「データキーフレーム」の形式になります。それぞれのデータキーフレームには、タイトル、高さ、 幅など、複数のデータプロパティを含めることができます。 注意:DVR アプリケーションは記録されたストリームを使用するので、データキーフレームを使用してメタデータをクラ イアントにプッシュする必要はありません。DVR アプリケーション(およびすべての記録されたビデオアプリケーション) では、onMetaData() メソッドはストリームの先頭や、検出および一時停止などのイベント間で呼び出されます。 メタデータの操作 ライブストリームにメタデータを追加するには、クライアントサイドスクリプトで 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 = new Stream(nc); s.onStatus = function(info){ if (info.code == "NetStream.Publish.Start"){ metaData = new Object(); metaData.title = "myStream"; metaData.width = 400; metaData.height = 200; this.send("@setDataFrame", "onMetaData", metaData); } }; s.publish("myStream"); メタデータをサーバーサイドスクリプトでライブストリームから消去するには、次のコードを使用します。 FLASH MEDIA SERVER 3.5 開発者ガイド 66 ビデオの操作 s.send("@clearDataFrame", "onMetaData"); メタデータをクライアントサイドスクリプトでライブストリームから取得するには、次のコードを使用します。 function onMetaData(info:Object):void { trace("width: " + info.width); trace("height: " + info.height); } 例:ライブビデオへのメタデータの追加 この例では、クライアントアプリケーションは以下の動作を行います。 • ビデオをキャプチャしエンコードします。 • キャプチャした状態でビデオを表示します。 • ビデオをクライアントから Flash Media Server にストリーミングします。 • メタデータを、ライブストリームを再生するときクライアントに送信するサーバーに送信します。 • ボタンを押すと、逆にビデオを Flash Media Server からクライアントにストリーミングします。 • サーバーからストリーミングされたビデオを表示します。 • TextArea コンポーネントでサーバーから送信されたメタデータを表示します。 注意:このコードをテストするには、サーバーに RootInstall/applications/publishlive フォルダを作成します。次に、 RootInstall/documentation/samples/metadata/Metadata.swf ファイルを開いてアプリケーションに接続します。 1 Flash 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(){ FLASH MEDIA SERVER 3.5 開発者ガイド 67 ビデオの操作 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", "live"); } 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 { FLASH MEDIA SERVER 3.5 開発者ガイド 68 ビデオの操作 nsPlayer = new NetStream(nc); nsPlayer.client = this; nsPlayer.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); nsPlayer.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); nsPlayer.play("myCamera"); 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 = 200; outputWindow.height = 50; 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 { outputWindow.appendText(info.customProp); } } } 4 ファイルを保存します。 5 File / New / Flash File(ActionScript 3.0)を選択し、「OK」をクリックします。 6 ファイルを Metadata.as ファイルと同じフォルダに、Metadata.fla という名前で保存します。 7 コンポーネントパネルを開き、Button および TextArea コンポーネントをステージまでドラッグして削除します。 この操作により、コンポーネントがライブラリに追加されます。コンポーネントは実行時にアプリケーションに追加され ます。 FLASH MEDIA SERVER 3.5 開発者ガイド 69 ビデオの操作 8 [ ファイル ]-[ パブリッシュ設定 ] を選択します。[Flash] タブをクリックします。「Script Settings」をクリックし、 Metadata を Document クラスとして入力します。チェックマークをクリックしてパスを検証します。 9 ファイルを保存し、Control / Test Movie を選択してアプリケーションを実行します。 ライブストリームのメタデータプロパティ 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 10 HE-AAC 11 Speex videocodecid 数値 ファイルで使用されているビデオコーデック ID。値は次の通りです。 2 Sorenson H.263 3 Screen video 4 On2 VP6 5 On2 VP6(透過情報付き) 7 H.264 audiodelay 数値 オーディオコーデックで発生する遅延(秒単位)。 記録されるライブストリームのメタデータプロパティ ストリーミング時にファイルを記録する場合、次の表に示される標準のメタデータが Flash Media Server によって追加され ます。ユーザーがライブストリームにこれらのメタデータを追加する必要はありません。 FLASH MEDIA SERVER 3.5 開発者ガイド 70 ビデオの操作 メタデータのプロパティ名 データ型 説明 duration 数値 ファイルの全体の長さを秒数で示します。 audiocodecid 数値 ファイルで使用されているオーディオコーデック ID。値は次の通りです。 0 非圧縮 1 ADPCM 2 MP3 5 Nellymoser 8 kHz モノラル 6 Nellymoser 10 HE-AAC 11 Speex videocodecid 数値 ファイルで使用されているビデオコーデック ID。値は次の通りです。 2 Sorenson H.263 3 Screen video 4 On2 VP6 5 On2 VP6(透過情報付き) 7 H.264 canSeekToEnd ブール値 最後のビデオフレームがキーフレームかどうか(キーフレームの場合は true、それ以外は false)。 creationDate 文字列 ファイルの作成日。 createdby 文字列 ファイルの作成者の名前。 "record" を NetStream.publish() の呼び出しに追加することで独自のメタデータをライブストリームに追加してストリームを 記録すると、サーバーはメタデータプロパティを標準のメタデータプロパティと結合しようと試みます。両者の間にコンフ リクトがあると、サーバーは標準のメタデータプロパティを使用します。例えば、ユーザーが次のメタデータプロパティを 追加するとします。 duration=5 x=200 y=300 サーバーによってビデオの記録が開始されると、duration を含む独自のメタデータプロパティのファイルへの書き込みを開 始します。記録時間が 20 秒の場合、サーバーはメタデータに duration=20 を追加します。その際、ユーザーが指定した値は 上書きされます。ただし、x=200 と y=300 はコンフリクトしていないので、これらの値はメタデータとして保存されます。 audiocodecid、videocodecid、creationdate など、サーバーが設定する他のプロパティは、そのままファイルに保存されます。 ストリームが記録されると、キーフレームから記録が始まります。また、キーフレームまたは I フレームで即座に記録が停 止します。 サーバーからサーバーへのパブリッシュ マルチポイントパブリッシュについて マルチポイントパブリッシュを利用することによって、クライアントからサーバーへの 1 つの接続のみで、クライアントか ら複数のサーバーにパブリッシュすることができます。この機能によって、サーバーや受信者が地理的に離れた場所にして いたとしても、大規模なライブブロードキャスト用のアプリケーションを構築することができます。 FLASH MEDIA SERVER 3.5 開発者ガイド 71 ビデオの操作 A B C D マルチポイントパブリッシュを使用した、地理的な境界を超えたサーバーからサーバーへのコンテンツのパブリッシュ A. ライブビデオ B. サーバー 1(ニューヨーク) C. サーバー 2(シカゴ)とサーバー 3(ロサンゼルス) D. ユーザー この図で示されているアプリケーションの流れは次のようになります。 1 クライアントは、ニューヨークにあるサーバー 1 のアプリケーションに接続し、NetStream.publish() を呼び出してライブ ストリームをパブリッシュします。このクライアントはカスタムの Flash Player、AIR アプリケーションまたは Flash Media Live Encoder などです。 2 サーバー 1 のサーバーサイドスクリプトは、パブリッシュされたストリームの名前で application.onPublish() イベントを 受信します。 3 application.onPublish() ハンドラは NetStream オブジェクトを作成し、NetStream.publish() を呼び出してライブストリー ムをサーバー 2(シカゴ)とサーバー 3(ロサンゼルス)に再パブリッシュします。 4 サーバー 2 とサーバー 3 に接続している受信者は、同一のライブストリームを受信します。 5 クライアントがパブリッシュを停止すると、アプリケーションは application.onUnpublish() イベントを受信します。 例:マルチポイントパブリッシュ この例では、クライアントはストリームをキャプチャおよびエンコードして、サーバーにパブリッシュします。Flash Media Live Encoder を同じ目的で使用することもできます。 注意:このコードをテストするには、サーバーに RootInstall/applications/livestreams フォルダを作成します。 Administration Console を開いて、ライブストリームアプリケーションのインスタンスを作成します。Live Logs をクリッ クして、アプリケーションの実行時にサーバーサイド trace() ステートメントを参照します。 RootInstall/documentation/samples/livestreams/LiveStreams.swf ファイルを開いてアプリケーションに接続します。 1 クライアントサイドスクリプトでは、NetStream.publish() メソッドを呼び出してライブストリームをパブリッシュしま す。 ns.publish("localnews", "live"); 注意:Flash Media Live Encoder をパブリッシュクライアントとして使用するには、FMS URL rtmp://localhost/livestreams と Stream localnews を入力してください。 2 サーバーサイド main.asc ファイルで、application.onPublish() イベントハンドラを定義します。このハンドラは、クライ アントからパブリッシュされたストリーム名の受諾、リモートサーバーへの接続およびストリームのリモートサーバーへ の再パブリッシュを行います(この例では、リムーブサーバーは同じアプリケーションのもう 1 つのインスタンスです)。 FLASH MEDIA SERVER 3.5 開発者ガイド 72 ビデオの操作 // Called when the client publishes application.onPublish = function(client, myStream) { trace(myStream.name + " is publishing into application " + application.name); // This is an example of using the multi-point publish feature to republish // streams to another application instance on the local server. if (application.name == "livestreams/_definst_"){ trace("Republishing the stream into livestreams/anotherinstance"); nc = new NetConnection(); nc.connect( "rtmp://localhost/livestreams/anotherinstance" ); ns = new NetStream(nc); // called when the server NetStream object has a status ns.onStatus = function(info) { trace("Stream Status: " + info.code) if (info.code == "NetStream.Publish.Start") { trace("The stream is now publishing"); } } ns.setBufferTime(2); ns.attach(myStream); ns.publish( myStream.name, "live" ); } } NetStream.publish() を呼び出すことによって、自分のサーバーからリモートサーバーにストリームをパブリッシュしま す。 3 main.asc ファイルでは、自分のサーバーからリモートサーバーにパブリッシュするために使用している NetStream オ ブジェクトで発生したイベントを処理します。 ns.onStatus = function(info) { trace("Stream Status: " + info.code) if (info.code == "NetStream.Publish.Start") { trace("The stream is now publishing"); } } サーバーサイド NetStream.publish() メソッドは、NetStatus イベントを NetStream.Publish.Start コードでトリガします。こ れは、クライアントサイド NetStream.publish() メソッドと同様の動作です。 4 クライアントがパブリッシュを停止したときの処理を定義します。 application.onUnpublish = function( client, myStream ) { trace(myStream.name + " is unpublishing" ); } 73 第 5 章:インタラクティブアプリケーションの開 発 インタラクティブアプリケーションについて Adobe Flash Media Interactive Server と Adobe Flash Media Development Server では、ビデオアプリケーションのス トリーミングに加え、インタラクティブアプリケーションやその他のリアルタイムコミュニケーション用のアプリケーショ ンをホスティングすることができます。ユーザーは、ライブのオーディオやビデオをキャプチャして、サーバーにアップ ロードしたり、他のユーザーと共有したりすることができます。また、これらのサーバーエディションでは、多数のユー ザー間でデータを同期するリモート共有オブジェクトへのアクセスが提供されます。これは、オンラインゲームを開発する のに理想的です。 サーバーサイド ActionScript を使用して、他のシステムに接続できます。接続可能なシステムには、Java 2 Enterprise サーバー、Web サービス、Microsoft .NET サーバーなどがあります。この接続性を利用することによって、アプリケー ションは、データベース認証、Web サービスからのリアルタイム更新、電子メールなど、さまざまなサービスを活用するこ とができます。 Adobe Flash Media Streaming Server ではサーバーサイドプログラミングはサポートされないので、このセクションのト ピックの大半の内容は、Flash Media Interactive Server と Flash Media Development Server のみに該当します。 共有オブジェクト 共有オブジェクトについて 共有オブジェクトを使用して、ユーザーを同期し、データを格納します。共有オブジェクトは、ゲームボード上の駒の位置 を保持したり、チャットのテキストメッセージをブロードキャストしたりするなど、あらゆる用途に使用できます。共有オ ブジェクトを使用することによって、ユーザーの操作をリアルタイムで追跡することができます。 Flash Media Interactive Server または Flash Media Development Server を使用すると、複数のクライアントアプリケー ション間でデータを共有するリモート共有オブジェクトを作成し、使用することができます。1 人のユーザーが変更を行う ことでサーバー上の共有オブジェクトが更新されると、この共有オブジェクトは、他のすべてのユーザーにその変更を送信 します。つまり、リモート共有オブジェクトは、多数のユーザーを同期するためのハブとして機能します。75 ページの 「SharedBall サンプル」のセクションでは、あるユーザーがボールを移動すると、すべてのユーザーにその移動が表示され る例を示しています。 注意:Flash Media Streaming Server はリモート共有オブジェクトをサポートしません。 サーバーのすべてのエディションが、ローカル共有オブジェクトをサポートしています。これは、ブラウザの cookie と似 た機能を提供します。ローカル共有オブジェクトはクライアントコンピュータに格納されており、サーバーを必要としませ ん。 ローカルまたはリモートのいずれの共有オブジェクトも、一時または永続のいずれかに分けられます。 • 一時共有オブジェクトは、サーバーサイドスクリプトによって作成されるか、共有オブジェクトに接続するクライアント によって作成されます。最後のクライアントが切断し、サーバーサイドスクリプトによって共有オブジェクトが使用され なくなると、その共有オブジェクトは削除されます。 • 永続共有オブジェクトは、すべてのクライアントが切断し、アプリケーションインスタンスの実行が停止した後も、その データが保持されます。アプリケーションインスタンスが次回に起動されるときに、サーバー上の永続共有オブジェクト FLASH MEDIA SERVER 3.5 開発者ガイド 74 インタラクティブアプリケーションの開発 を利用することができます。複数のアプリケーションセッションの間で状態を維持することができます。永続オブジェク トはサーバーまたはクライアント上のファイルに格納されます。 永続的なローカル共有オブジェクト 永続的なローカル共有オブジェクトを作成するには、クライアントサイドの SharedObject.getLocal() メソッドを使用します。永続的なローカル共有オブジェクトの拡張子は .sol です。 SharedObject.getLocal() コマンドの localPath パラメータに値を渡すことで、オブジェクトを保存するディレクトリを指定 することができます。ローカルまたはリモートに永続的に存在する共有オブジェクトに対するパスを一部だけ指定するこ とで、同じドメインの複数のアプリケーションが同じ共有オブジェクトにアクセスすることができます。 リモートに存在する永続的な共有オブジェクト サーバー上で永続的に存在するリモート共有オブジェクトを作成するに は、クライアントサイドの SharedObject.getRemote() メソッドまたはサーバーサイドの SharedObject.get() メソッドで persistence パラメータに値 true を渡します。これらの共有オブジェクトの拡張子は .fso で、サーバー上で、共有オブ ジェクトを作成したアプリケーションのサブディレクトリに保存されます。Flash Media Server がこれらのディレクト リを自動的に作成するため、ユーザーがそれぞれのインスタンス名のディレクトリを作成する必要はありません。 リモートとローカルに永続的に存在する共有オブジェクト クライアント上とサーバー上に永続的に存在するリモート共 有オブジェクトは、クライアントサイドの SharedObject.getRemote() コマンドの persistence パラメータにローカルパス を渡すことで作成します。ローカルに永続的に存在する共有オブジェクトの拡張子は .sor で、クライアント上の指定さ れたパスに保存されます。リモートに永続的に存在する共有オブジェクトの拡張子は .fso で、共有オブジェクトを作成 したアプリケーションのサブディレクトリに保存されます。 リモート共有オブジェクト リモート共有オブジェクトを作成する前に、NetConnection オブジェクトを作成してサーバーに接続します。接続される と、SharedObject クラスのメソッドを使用して、リモート共有オブジェクトの作成や更新を行うことができるようになり ます。以下に、リモート共有オブジェクトを使用する際の一般的な手順を示します。 1 NetConnection オブジェクトを作成してサーバーに接続します。 nc = new NetConnection(); nc.connect("rtmp://localhost/SharedBall"); これは、サーバーに接続する最も簡単な方法です。実際のアプリケーションでは、NetConnection オブジェクトにイベ ントリスナーを追加したり、イベントハンドラのメソッドを定義したりする作業が必要になる場合があります。詳細につ いては、75 ページの「SharedBall サンプル」を参照してください。 2 リモート共有オブジェクトを作成します。正しく接続された場合は、SharedObject.getRemote() を呼び出してサーバー上 にリモート共有オブジェクトを作成します。 so = SharedObject.getRemote("ballPosition", nc.uri, false); 最初のパラメータは、リモート共有オブジェクトの名前です。2 番目のパラメータは、接続先のアプリケーションの URI です。この URI は、NetConnection.connect() メソッドで使用した URI と同じものである必要があります。URI を 指定する最も簡単な方法は、nc.uri プロパティを使用する方法です。3 番目のパラメータは、リモート共有オブジェクト が永続であるかどうかを指定します。この場合、false を選択すると、一時共有オブジェクトになります。 3 リモート共有オブジェクトに接続します。共有オブジェクトが作成された場合は、前の手順で作成した NetConnection オブジェクトを使用して、クライアントを共有オブジェクトに接続します。 so.connect(nc); 共有オブジェクトによってディスパッチされる sync イベントを処理するためのイベントリスナーを追加することも必要 です。 so.addEventListener(SyncEvent.SYNC, syncHandler); FLASH MEDIA SERVER 3.5 開発者ガイド 75 インタラクティブアプリケーションの開発 4 リモート共有オブジェクトとクライアントを同期します。リモート共有オブジェクトの同期には、2 つの手順が必要で す。最初に、個々のクライアントが変更を行うとき、またはデータ値を設定するときに、リモート共有オブジェクトを更 新する必要があります。次に、リモート共有オブジェクトに接続している他のすべてのクライアントを更新します。 a クライアントが変更を行っている時にリモート共有オブジェクトを更新するには、setProperty() を使用します。 so.setProperty("x", sharedBall.x); 共有オブジェクト内の値を更新するには、setProperty() を使用する必要があります。リモート共有オブジェクトには、 属性と値が格納される data プロパティがあります。ただし、ActionScript 3.0 では、次のように値を直接書き込むこ とはできません。 so.data.x = sharedBall.x; // you can't do this b 共有オブジェクトが更新されると、その共有オブジェクトは sync イベントをディスパッチします。他のクライアント で変更を同期するには、共有オブジェクトの data プロパティの値を読み取ります。 sharedBall.x = so.data.x; この処理は、通常は sync イベントハンドラ内で実行されます。75 ページの「SharedBall サンプル」にその例が示さ れています。 SharedBall サンプル SharedBall サンプルでは、一時リモート共有オブジェクトを作成します。このサンプルは、マルチプレイヤーゲームに似て います。1 人のユーザーがボールを移動すると、他のすべてのユーザーのボールも移動されます。 注意:Flash Media Server の ルートインストールディレクトリ内の documentation/samples/SharedBall ディレクトリに 含まれている SharedBall のサンプルファイル(SharedBall.fla、SharedBall.as、SharedBall.swf)をご利用ください。 Flash Player で実行中の SharedBall アプリケーション アプリケーションの実行 1 次の場所に SharedBall という名前のアプリケーションディレクトリを作成して、サーバーにアプリケーションを登録し ます。 RootInstall/applications/SharedBall 2 Flash Media Server の ルートインストールディレクトリ内の documentation/samples/SharedBall ディレクトリに含 まれている SharedBall のサンプルファイルを開きます。 3 Web ブラウザで SharedBall.swf を開きます。 4 ブラウザウィンドウをもう 1 つ起動し、SharedBall.swf の 2 番目のインスタンスを開きます。 FLASH MEDIA SERVER 3.5 開発者ガイド 76 インタラクティブアプリケーションの開発 5 一方のウィンドウでボールを移動し、もう一方のウィンドウでボールの動きを観察します。 ユーザーインターフェイスを定義します 1 Flash で、ファイル/新規/ Flash ファイル(ActionScript 3.0)を選択し、「OK」をクリックします。 2 ツールボックスから矩形ツールを選択します。右下方向にドラッグして、次に、楕円ツールを選択します。 3 ステージ上に円を描画します。好きな色で塗り潰します。 4 円をダブルクリックし、修正/シンボルに変換を選択します。 5 シンボルに変換ダイアログボックスで、シンボルに ball という名前を付け、「ムービークリップ」が選択されていること を確認して、「OK」をクリックします。 6 ステージ上で ball シンボルを選択し、プロパティインスペクタ(ウィンドウ/プロパティを選択)で、このシンボルに 「sharedBall」というインスタンス名を付けます。 7 SharedBall.fla という名前を付けてこのファイルを保存します。 クライアントサイドコードの記述 サンプルファイルの SharedBall.as を参照してください。ここでの手順は、主要部分のみを示しています。 1 Flash Professional で、新しい ActionScript ファイルを作成します。 2 MovieClip を拡張するクラスを作成します。 public class SharedBall extends MovieClip {...} FLA ファイル内の sharedBall シンボルはムービークリップシンボルなので、このクラスは MovieClip を拡張する必要 があります。 3 コンストラクタを作成します。コンストラクタにイベントリスナーを追加し、サーバーに接続します。 public function SharedBall() { nc = new NetConnection(); addEventListeners(); nc.connect("rtmp://localhost/SharedBall"); } 4 netStatus、mouseDown、mouseUp、mouseMove の各イベントのイベントリスナーを追加します。 private function addEventListeners() { nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); // sharedBall is defined in the FLA file sharedBall.addEventListener(MouseEvent.MOUSE_DOWN, pickup); sharedBall.addEventListener(MouseEvent.MOUSE_UP, place); sharedBall.addEventListener(MouseEvent.MOUSE_MOVE, moveIt); } 5 netStatus のハンドラ内で、正しく接続されたときにリモート共有オブジェクトを作成します ( サンプル AS ファイルに記 述されているように、接続が拒否された場合や失敗した場合のためのエラーハンドラーを必要に応じて作成します)。共 有オブジェクトに接続し、sync イベントリスナーを追加します。 switch (event.info.code) { case "NetConnection.Connect.Success": trace("Congratulations! you're connected"); so = SharedObject.getRemote("ballPosition", nc.uri, false); so.connect(nc); so.addEventListener(SyncEvent.SYNC, syncHandler); break; ... } FLASH MEDIA SERVER 3.5 開発者ガイド 77 インタラクティブアプリケーションの開発 6 ユーザーがマウスを移動したときに、setProperty() を使用して、ボールの位置の変更をリモート共有オブジェクトに設定 します。 function moveIt( event:MouseEvent ):void { if( so != null ) { so.setProperty("x", sharedBall.x); so.setProperty("y", sharedBall.y); } } リモート共有オブジェクトが更新されると、そのリモート共有オブジェクトは sync イベントをディスパッチします。 7 すべてのクライアントの新しいボールの位置を更新するための sync イベントハンドラを記述します。 private function syncHandler(event:SyncEvent):void { sharedBall.x = so.data.x; sharedBall.y = so.data.y; } so.data に書き込むことはできませんが、so.data の値を読み取ることはできます。 多数のユーザーに対するメッセージのブロードキャスト クライアントまたはサーバーのいずれも、リモート共有オブジェクトを利用することによって、共有オブジェクトに接続し ているすべてのクライアントに対してメッセージを送信することができます。メッセージの送信には、SharedObject.send() を使用します。send() メソッドは、例えばテキストチャットアプリケーションに使用することができます。この場合、共有 オブジェクトをサブスクライブするすべてのユーザーがメッセージを受信します。 SharedObject.send() を使用する場合、メッセージの送信者もメッセージのコピーを受け取ることになります。 1 SharedObject.send() によって呼び出されるメソッドを記述します。 private function doSomething(msg:String):void { trace("Here's the message: " + msg); } 2 send() を呼び出して、メッセージをブロードキャストします。 so = SharedObject.getRemote("position", nc.uri, false); so.connect(nc); so.send("doSomething", msg); アセットに対するアクセスの許可または拒否 アクセスコントロールについて デフォルトでは、サーバーにアクセスしたユーザーは、すべてのストリームと共有オブジェクトに対するすべてのアクセス 権を持っています。ただし、サーバーサイド ActionScript を使用して、共有オブジェクトとストリームに対するダイナミッ クアクセスコントロールリスト(ACL)を作成することができます。開発者は、共有オブジェクトまたはストリームの作 成、読み込みまたは更新を行うアクセス権を誰に与えるのかを制御することができます。 クライアントがサーバーに接続したときに、サーバーサイドスクリプト(main.asc または yourApplicationName.asc) に Client オブジェクトが渡されます。それぞれの Client オブジェクトには、readAccess プロパティと writeAccess プロパ ティが含まれています。これらのプロパティを使用して、接続ごとにアクセスを制御することができます。 FLASH MEDIA SERVER 3.5 開発者ガイド 78 インタラクティブアプリケーションの開発 ダイナミックアクセスコントロールの実装 Client.readAccess プロパティと Client.writeAccess プロパティは、文字列の値を受け付けます。これらの値には、次のように、 セミコロンで区切られた複数の文字列を含めることができます。 client.readAccess = "appStreams;/appSO/"; client.writeAccess = "appStreams/public/;appSO/public/"; デフォルトでは、readAccess、writeAccess の両方に、/ が設定されます。これは、クライアントはサーバー上のすべてのスト リームと共有オブジェクトにアクセス可能であることを意味します。 ストリームに対するアクセスの許可 ❖ main.asc ファイルの中に onConnect() 関数を追加し、サーバー上のディレクトリ名を指定します。 application.onConnect = function(client, name) { // give this new client the same name as passed in client.name = name; // give write access client.writeAccess = "appStreams/public/"; // accept the new client's connection application.acceptConnection(client); } この main.asc ファイルは、appStreams/public で始まるすべての URI に対するアクセス権を付与します。 ストリームに対するアクセスの拒否 ❖ main.asc の中に onConnect() 関数を追加し、client.writeAccess に null 値を指定します。 application.onConnect = function(client, name) { ... // deny write access to the server client.writeAccess = ""; } 共有オブジェクトに対するアクセスの定義 ❖ main.asc の中に onConnect() 関数を追加し、URI と同じ命名規則を使用して共有オブジェクトの名前を指定します。 application.onConnect = function(client, name) { ... client.writeAccess = "appSO/public/"; } これによって、クライアントに対して、appSO/public/ で始まる URI を持つすべての共有オブジェクトへの書き込みアク セス権を付与します。 クライアントの認証 FLASH MEDIA SERVER 3.5 開発者ガイド 79 インタラクティブアプリケーションの開発 Client オブジェクトのプロパティの使用 クライアントがアプリケーションに接続すると、サーバーは、クライアントの情報が含まれた Client オブジェクトを作成 し、それをサーバーサイド ActionScript 内の application.onConnect() ハンドラに渡します。Client オブジェクトのプロパ ティにアクセスするサーバーサイドコードを記述し、その値を使用して、接続を試みているクライアントの有効性を検証す ることができます。 application.onConnect = function( pClient ) { for (var i in pClient) { trace( "key: " + i + ", value: " + pClient[i] ); } } クライアントの IP アドレスの確認 ❖ main.asc の中で client.ip の値を確認し、必要に応じてアプリケーションに対するクライアントの接続を拒否します。 if (client.ip.indexOf("60.120") !=0) { application.rejectConnection(client, {"Access Denied"} ); } 参照元の URL の確認 ❖ main.asc の中で、client.referrer の値を、アクセスを拒否する URL のリストに照らし合わせて確認します。アプリケー ションに接続しようとしている SWF ファイルが、予期した場所からのものであるかどうかを確認します。リストに一致 するものがある場合は、クライアントからの接続を拒否します。 referrerList = {}; referrerList["http://www.example.com"] = true; referrerList["http://www.abc.com"] = true; if (!referrerList[client.referrer]) { application.rejectConnection(client, {"Access Denied"} ); } 固有キーの使用 1 クライアントサイド ActionScript で、次のコードで示すように、ローカルコンピュータの時刻と乱数を連結して固有 キーを作成します。 var keyDate = String(new Date().getTime()); var keyNum = String(Math.random()); var uniqueKey = keyDate + keyNum; 2 このキーを、接続要求と共にサーバーに送信します。 nc.connect("rtmp://www.example.com/someApplication", uniqueKey); 3 main.asc ファイル内の次のコードは、接続要求の中の固有キーを探します。固有キーが存在しない場合または既に使用 されている固有キーの場合、接続は拒否されます。この方法によって、偽証者によるリプレイ接続の試みは失敗します。 FLASH MEDIA SERVER 3.5 開発者ガイド 80 インタラクティブアプリケーションの開発 clientKeyList = new Object(); // holds the list of clients by key application.onConnect = function( pClient, uniqueKey ) { if ( uniqueKey != undefined ) { // require a unique key with connection request if ( clientKeyList[uniqueKey] == undefined ) { // first time -- allow connection pClient.uniqueKey = uniqueKey; clientKeyList[uniqueKey] = pClient; this.acceptConnection(pClient); } else { trace( "Connection rejected" ); this.rejectConnection(pClient); } } } application.onDisconnect = function( pClient ) { delete clientKeyList[pClient.uniqueKey]; } Access プラグインの使用 Access プラグインは、外部からの要求が Flash Media Interactive Server に渡される前に、その要求をインターセプトしま す。Access プラグインのプログラムを作成することによって、あらゆる認証形式を使用することができます。詳細について は、『Adobe Flash Media Interactive Server プラグイン開発者ガイド』を参照してください。 Flash Player のバージョンの使用 接続時に受信するユーザーエージェントの文字列に基づいて、Flash Player を実行していないクライアントからコンテンツ を保護することができます。ユーザーエージェントの文字列によって、プラットフォームと Flash Player のバージョンが識 別されます。以下にその例を示します。 WIN 8,0,0,0 MAC 9,0,45,0 この文字列にアクセスするには、次の 2 つの方法があります。 仮想キー Flash Player クライアントに基づいてストリームを再マッピングするようにサーバーを設定します。 Client.agent サーバーサイド ActionScript を使用して、接続のチャレンジを行います。 application.onConnect = function( pClient ) { var platform = pClient.agent.split(" "); var versionMajor = platform[1].split(",")[0]; var versionMinor = platform[1].split(",")[1]; var versionBuild = platform[1].split(",")[2]; } // // // // // // output example Client.agent: platform[0]: versionMajor: versionMinor: versionBuild: WIN 9,0,45,0 "WIN" 9 0 45 接続する SWF ファイルの検証 アプリケーションへの接続を許可する前に、クライアントの SWF ファイルが信頼できることを検証するよう、サーバーを 設定することができます。SWF ファイルを検証することによって、第三者が独自の SWF ファイルを作成してリソースをス トリーミングすることを防止できます。SWF 検証は、Flash Player 9 アップデート 3 以降でサポートされます。 FLASH MEDIA SERVER 3.5 開発者ガイド 81 インタラクティブアプリケーションの開発 特定のドメインからの接続の許可または拒否 有効なクライアントの接続元のドメインがわかっている場合は、それらのドメインをホワイトリストで管理することができ ます。逆に、既知の無効なドメインをブラックリストで管理することもできます。 Adaptor.xml ファイルにドメイン名の静的なリストを入力することができます。詳細については、Flash Media Server の 設定と管理のガイドを参照してください。 また、独自のサーバーサイドコードやファイルを使用して、これらのリストを管理することもできます。次の例では、 bannedIPList.txt という名前のファイルに除外対象の IP アドレスのリストを格納しています。このファイルは随時に編集 することができます。 // bannedIPList.txt file contents: // 192.168.0.1 // 128.493.33.0 function getBannedIPList() { var bannedIPFile = new File ("bannedIPList.txt") ; bannedIPFile.open("text","read"); application.bannedIPList = bannedIPFile.readAll(); bannedIPFile.close(); delete bannedIPFile; } application.onConnect = function(pClient) { var isIPOK = true; getBannedIPList(); for (var index=0; index>>> Closing Connection") clearInterval(this.$verifyTimeOut); application.disconnect(this); } function VerifyClientHandler(pClient) { this.onResult = function (pClientRet) { // if the client returns the correct key, then clear timer if (pClientRet.key == pClient.verifyKey.key) { trace("Connection Passed"); clearInterval(pClient.$verifyTimeOut); } } } application.onConnect = function(pClient) { this.acceptConnection(pClient); // create a random key and package within an Object pClient.verifyKey = ({key: Math.random()}); // send the key to the client pClient.call("verifyClient", new VerifyClientHandler(pClient), pClient.verifyKey); // set a wait timer pClient.$verifyTimeOut = setInterval(pClient, $verifyTimeOut, this.VERIFY_TIMEOUT_VALUE, pClient); } application.onDisconnect = function(pClient) { clearInterval(pClient.$verifyTimeOut); } ユーザーの認証 外部リソースを使用した認証 アクセスするユーザーが限られる場合は、証明書(ログイン名とパスワード)を要求し、データベース、LDAP サーバーま たはその他のアクセス許可サービスなどの外部のリソースを使用して、この証明書を検証する方法が有効です。 1 SWF は、接続要求と共にユーザーの証明書を送信します。 クライアントは、クライアントサイド ActionScript を使用して、トークンまたはユーザー名/パスワードを送信しま す。 var sUsername = "someUsername"; var sPassword = "somePassword"; nc.connect("rtmp://server/secure1/", sUsername, sPassword); 2 Flash Media Server は、サードパーティのシステムを使用して証明書を検証します。 FLASH MEDIA SERVER 3.5 開発者ガイド 83 インタラクティブアプリケーションの開発 サーバーサイド ActionScript から外部ソースに対して呼び出しを行うには、WebService、LoadVars、XML クラス、 NetServices(Flash Remoting ゲートウェイへの接続)などのクラスを使用することができます。Flash Remoting の詳 細については、www.adobe.com/go/learn_fms_flashremoting_jp を参照してください。 load("NetServices.asc"); load("WebServices.asc"); // for Flash remoting // for SOAP web services pendingConnections = new Object(); application.onConnect = function( pClient, pUsername, pPassword ) { // create a unique ID for the client pClient.FMSid = application.FMSid++; // place the client into a pending array pendingConnections[FMSid] = pClient; if (pUsername!= undefined && pPassword !=undefined) { // issue the external call (3 examples below) loadVars.send("http://xyz.com/auth.cfm"); webService.authenticate(FMSid, pUsername, pPassword); netService.authenticate(FMSid, pUsername, pPassword); } } // the result handler (sample only, you will have to customize this) // this command will return a true/false and the FMS client id Authenticate.onResult = { } 3 Flash Media Server は接続を受諾するか、拒否します。 接続情報が有効である場合、Flash Media Server は接続を受諾します。 loadVars.onData = function ( FMSid, pData ) { if (pData) { application.acceptConnection( pendingConnections[FMSid] ); delete pendingConnections[FMSid]; } else { application. rejectConnection ( pendingConnections[FMSid] ); delete pendingConnections[FMSid]; } } トークンを使用した認証 これは、ユーザー名/パスワードによる認証の代替となる方法です。この方法では、クライアントのプロパティに基づいて トークンが付与されます。 制御フローは次のようになります。 1 クライアントの SWF は、サードパーティに対して認証トークンを要求します。 2 サードパーティは、クライアントにトークンを返します。 3 クライアントは、接続要求と共にトークンを送信します。 4 Flash Media Server は、サードパーティのシステムを使用してトークンを検証します。 5 Flash Media Server は接続を受諾します。 84 索引 A O Access プラグイン 80 Administration Console 3, 8, 35 Adobe Flash Media Development Server 1 Adobe Flash Media Interactive Server 1 Adobe Flash Media Streaming Server 1 Adobe Real-Time Messaging Protocol(RTMP)1 allowedHTMLdomains.txt ファイル 19 allowedSWFdomains.txt ファイル 19 Application クラス application.onConnect イベント 28 application.onDisconnect イベント 28 onBWCheck 関数 49 onBWDone 関数 49 onMetaData イベントハンドラ 34 onPlayStatus イベントハンドラ 34 onXMPData 31 C R RTMP 1 S Stream クラス 53 SWF ファイル、検証 80 checkBandwidth 関数 49 U F Flash アーカイブユーティリティ(FAR)11 FLVCheck ユーティリティ 34 URI 23 UTF-8、エンコード 7 V H HelloServer アプリケーション 24 HelloWorld アプリケーション 3 VOD サービス 13, 15 X XMP メタデータ 31 L LocalConnection クラス client プロパティ 50 あ アクセスコントロール 77 アプリケーション Media Player 31 Hello World サンプル 4 HelloServer サンプル 24 VOD サービス 15 インタラクティブ 73 N クライアントサイドコード 6 M NetConnection クラス ステータスコード 28, 35 説明 22 netStatus イベント 35 NetStream クラス pause メソッド 47 play メソッド 30 サーバーサイドコード 6 サーバーへの登録 10 接続 URI 23 ダブルバイト 7 デバッグ 8 ビデオ Player の使用 18 メディア 2, 22 ライブサービス 13 FLASH MEDIA SERVER 3.5 開発者ガイド 85 索引 い す イベント ストリーミングサービス 13, 18, 20 netStatus 35 onMetaData 34 onPlayStatus 34 ストリーム 一時停止 47 切り替え 45 再生 30 え エラーの処理 35 サブスクライブ 58 動的 41 長さの検出 53 バッファリング 46 お パブリッシュ 58 オーディオデータ、アクセス 19 ストリームが見つからないエラー 36 き せ 共有オブジェクト 73, 77, 19 接続 18, 27, 35 く た クライアント 帯域幅 44, 49, 52 作成 19 ダブルバイトのアプリケーション 7 認証 78 クライアントクラス ip プロパティ 79 readAccess プロパティ 77 writeAccess プロパティ 77 クライアントサイドコード 説明 6 て デバッグ Administration Console セッション 9 クライアントサイドコード 8 サーバーサイドコード 8 デバッグ 8 クライアントサイド再生リスト 37 と 動的ストリーミング 41, 42 こ ドメイン 19, 81 コンポーネント 18 に さ サーバーサイド ActionScript パッケージ化 11 サーバーサイド再生リスト 38 サーバーのインストール 3 認証 Flash Player のバージョン 80 外部リソースの使用 82 トークンの使用 83 ドメイン 81 サーバーの起動 3 サーバーサイド ActionScript は trace ステートメント 9 接続の処理 28 説明 6 再生リスト 36, 37 削除されたフレーム 44 バッファリング 47 パブリッシュ マルチポイント 70 ライブビデオ 58 ひ ビデオ Player 18 ビデオデータ、アクセス 19 ビデオのスナップショット 30 FLASH MEDIA SERVER 3.5 開発者ガイド 86 索引 ふ プログレッシブダウンロード 31 ま マルチポイントパブリッシュ 70 め メタデータ XMP 19, 31 ストリームのトランジション中の 46 説明 69 プロパティ 69 ライブストリームへの追加 31, 65 ら ライブサービス 13 ライブビデオ サブスクライブ 58 パブリッシュ 58 メタデータ 65 ろ ログファイル 9, 49