hetemlのFMS(FlashMediaServer)にAS3でビデオキャスト
今月中頃にリモートライブを企画しておりまして、その為の準備として、手始めにhetemlのFMS(FlashMediaServer)でビデオキャストしてみた。そしたら案の定躓いたのでメモ。
hetemlさんの「WEBカメラからの映像配信マニュアル」には親切なことにflaファイルまで含めたサンプルがおいてあるんだけど、残念ながらAS2でコーディングされている。これじゃあ「samplesCallback」とか使えないのでAS3で作ってみた。
ポイントは2カ所。
nc.objectEncoding = ObjectEncoding.AMF0;AS2の時は上記の指定は必要なかったけど、AS3だと必須みたいで、明示的に指定しないと接続できない。
Video.attachNetStream();こちらはAS2のときは「attachVideo()」でよかったんだけど、AS3では「ストリーミングですよ!」って感じのメソッドに変更されている。
とりあえずはビデオ配信の為だけど、今後色々とFMSを使った企画を考えてみたいと思います。了
参考サイト Flash Media Server 2メモ
ソースはこちら *Sender.asが配信側で Receiver.asが受信側
Sender.as
package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.*;
import flash.media.Camera;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.ObjectEncoding
import flash.text.TextField;
public class Sender extends Sprite {
//rtmp://サーバー名/アプリ名/{任意}インスタンス名
private var PATH_FMS:String = "rtmp://foo.fms.heteml.jp/watch"
private var camera:Camera
private var video:Video;
private var nc:NetConnection;
private var ns:NetStream
private var textField:TextField
public function Sender() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
init();
}
private function init():void{
//debug用にテキストフィールド生成
textField=new TextField();
textField.text="FMSConnectEx";
addChild(textField);
textField.y = 300
textField.width = 400
//カメラのセットアップ
setCamera();
//ネットワーク接続
connectFMS();
}
//カメラのセットアップ
private function setCamera():void{
camera = Camera.getCamera();
if (camera != null) {
video = new Video(camera.width, camera.height);
video.attachCamera(camera);
addChild(video);
}
}
//ネットワーク接続
private function connectFMS():void{
nc = new NetConnection();
//AMF設定!
nc.objectEncoding = ObjectEncoding.AMF0;
nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
nc.connect(PATH_FMS);
}
//ネットワーク接続イベント
private function onNetStatus(e:NetStatusEvent):void {
textField.text = "" + e.info.code;
if (e.info.code == "NetConnection.Connect.Success"){
//ストリーム送信
sendStream();
}
}
//ストリーム送信
private function sendStream():void{
ns = new NetStream(nc)
ns.attachCamera(camera)
ns.publish("video")
ns.addEventListener(NetStatusEvent.NET_STATUS,
function(e:NetStatusEvent):void{
textField.appendText(e.info.code)
})
}
}
}
Render.as
package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.*;
import flash.media.Camera;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.ObjectEncoding
import flash.text.TextField;
public class Receiver extends Sprite {
//rtmp://サーバー名/アプリ名/{任意}インスタンス名
private var PATH_FMS:String = "rtmp://foo.fms.heteml.jp/watch"
private var camera:Camera
private var video:Video;
private var nc:NetConnection;
private var ns:NetStream
private var textField:TextField
public function Receiver() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
init();
}
private function init():void {
textField=new TextField();
textField.text="FMSConnectEx";
addChild(textField);
textField.y = 300
textField.width = 400
video = new Video()
addChild(video)
//ネットワーク接続
connectFMS();
}
//video受信
private function receiveVideo():void{
ns = new NetStream(nc)
ns.play("video");
//videoに直接ストリームをattach
video.attachNetStream(ns)
ns.addEventListener(NetStatusEvent.NET_STATUS,
function(e:NetStatusEvent):void{
textField.appendText(e.info.code)
})
}
//ネットワーク接続
private function connectFMS():void{
nc = new NetConnection();
nc.objectEncoding = ObjectEncoding.AMF0;
nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
nc.connect(PATH_FMS);
}
//ネットワーク接続イベント
private function onNetStatus(evt:NetStatusEvent):void {
textField.text = "" + evt.info.code;
if (evt.info.code == "NetConnection.Connect.Success"){
//video受信
receiveVideo();
}
}
}
}
powerd by as2html