FMISで動画ストリーミングする方法
いま進めているお仕事でFMISを利用したものを作っていて、録画ずみの動画のストリーミング配信の設定が意外に資料がなくてこまったので書いときます。
- 動画は録画済のFLV
- ストリーミング配信したい
まずおさらいとして、FMIS3.5はFMS2の新バージョン。機能が増えてますが同じものです。
それのストリーミング機能にしぼったライセンスがFMSS。
価格はFMISが$4500くらい、FMSSが$995。開発版がタダだけど接続制限10まで。
この辺もよく探さないと分からなかった…。
分かりづらかったところを整理すると以下のような感じ。
- 動画はFMSサーバーに配置する
- RTMPで接続・再生する
- 接続にはFMSアプリケーションが必要
ということで簡単にですが、続けて説明します。
FMSの基本的なこととアプリケーション
FMSの基本的な構造ですが、サーバーの/applications/(初期設定では)以下に作られた各ディレクトリが、それぞれアプリケーションとみなされます。
アプリケーションにRTMPというプロトコルをつかって接続できます。
例)ライブチャットアプリとビデオ配信アプリを設置した場合 #設置したディレクトリ /applications/liveChat /applications/streamVideo #接続先 rtmp://serverName/liveChat rtmp://serverName/streamVideo //Flashからの接続イメージ(かなりはしょってます) var nc:NetConnection; function tryConnect() :void { nc = new NetConnection(); nc.connect("rtmp://serverName/liveChat"); }
このとき、サーバーにはアプリケーションのインスタンスを持ちます。
ユーザーが接続した時点で存在しなければサーバー上でnewされます。
だれも接続しない状態でしばらくするか、またはアプリ内でシャットダウンするような処理を行うとサーバーから消えます。
ちなみに、接続URIの最後にインスタンス名を付けると別のインスタンスとしてそれぞれ識別が可能です。 なおデフォルトの無名のインスタンスは常に1つです(_definst_)。 チャットのように同じ機能を持つ部屋(相互通信可能なグループ)をいくつか分けたいときなど インスタンス名で分ければ便利です。
例)インスタンス名を指定して接続 rtmp://serverName/liveChat/room0 rtmp://serverName/liveChat/room1 rtmp://serverName/liveChat/...
アプリの接続処理はアプリケーションディレクトリ直下に置かれたmain.ascで処理します。(詳細は後述するのでここでは省略)
これでFMSに接続する先ができました。
アプリケーション内に置かれた動画の配信
動画はアプリケーションディレクトリのstreams/インスタンス名/というディレクトリに格納します。
インスタンスがない場合はデフォルトなので、/applications/appName/streams/_definst_/testmovie.flvのようになります。
先ほどのNetConnectionをつないだ状態でNetStreamをつかって動画を受信します。
それを表示するにはVideoインスタンスを作ってVideo.attachNetStreamで入力ソースとして登録します。
VideoはDisplayObjectのサブクラスなのでステージ上のどこかにaddChildすれば表示されます。
//Connectした後の受信部分のイメージ(かなりはしょってます) //nc.connect後 var ns:NetStream; function playVideo():void { ns = new NetStream(nc);//さっきつないだNetConnectionインスタンス ns.play("testmovie");//FLVの場合ファイル名を拡張子なしで指定 var video:Video = new Video(); addChild( video ); // 入力として登録 video.attachNetStream( ns ); }
これで動画置き場に入れた動画をストリーム再生できるようになります。
- アプリ(RTMP)に接続
- NetStreamで動画再生
- VideoにつないだのをaddChildして表示
流れとしてはこれだけです。
アプリケーションについて細かいこと
アプリケーションの起動についてすこし踏み込んで説明します。
各アプリケーションの基本構造はつぎのとおりです。用途に応じてディレクトリの作成、動画の配置などします。
#アプリケーションディレクトリ /applications/appName/ #アプリケーション本体(AS3でいうDocumentClassみたいなもの) /applications/appName/main.asc #配信用の動画置き場 /applications/appName/streams/ #インスタンスごとの動画置き場 /applications/appName/streams/_definst_/ #実際の動画 /applications/appName/streams/_definst_/test.flv
main.ascには自動で生成された後のApplicationクラスのインスタンスとClientクラスのインスタンスへの処理を記述します。
すでにイベントハンドラがショートハンドで用意されているので必要に応じて書いていきます。
最低限書かないといけないのは接続したユーザーの受け入れ/排除の部分です
ちなみにActionScriptのバージョンは2(1?)に相当します。
//main.asc内 application.onConnect =function ( client ) { if( /*check*/ ) { // OK this.acceptConnectoin( client ); } else { // NG this.rejectConnection( client ); } }
これでとりあえず接続処理をさせることができます。 人数やユーザー名などで排除することもできます。
とりあえずこの辺まで。