Flash/red5/ビデオ通話
提供: 初心者エンジニアの簡易メモ
サーバサイドは何も描く必要は無いので、初期デモのoflaDemoを使います。
目次
送信(models/SendCamera.as
package models.camera { import flash.display.Sprite; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.events.Event; import flash.media.Camera; import flash.media.Video; import flash.net.NetStream; import models.CustomNetConnection; public class SendCamera extends Sprite { private var camera:Camera; private var video:Video; private var nc:CustomNetConnection; private var stream:NetStream; public function SendCamera() { init(); } private function init():void { // 送信用 camera = Camera.getCamera(); if (camera != null) { _setupCamera(); } else { trace("カメラがありません"); return; } // カスタムコネクション nc = new CustomNetConnection(); // 接続成功イベントハンドラ定義 nc.addEventListener(Event.CONNECT, _connectSuccess); } /** * 接続成功イベントハンドラ */ private function _connectSuccess(e:Event):void { // 送信用ビデオストリーム _sendVideo(); } /** * 送信用カメラ設置 */ private function _setupCamera():void { video = new Video(camera.width,camera.height); video.attachCamera(camera); addChild(video); } /** * 送信用ビデオストリーム */ private function _sendVideo():void { stream = new NetStream(nc); stream.attachCamera(camera); // 動画ID stream.publish("myvideo1"); } } }
受信(ReceiveCamera.as)
package models.camera { import flash.display.Sprite; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.events.Event; import flash.media.Video; import flash.net.NetStream; import models.CustomNetConnection; public class ReceiveCamera extends Sprite { private var video:Video; private var nc:CustomNetConnection; private var stream:NetStream; public function ReceiveCamera() { init(); } private function init():void { // カスタムコネクション nc = new CustomNetConnection(); // 接続成功イベントハンドラ定義 nc.addEventListener(Event.CONNECT, _connectSuccess); } /** * 接続成功イベントハンドラ */ private function _connectSuccess(e:Event):void { // 受信用ビデオストリーム _receiveVideo(); } /** * 受信用ビデオストリーム */ private function _receiveVideo():void { video = new Video(480, 360); stream = new NetStream(nc); video.attachNetStream(stream); // 動画ID stream.play("myvideo1"); addChild(video); } } }
コネクション(models/CustomConnection.as
package models { import flash.events.Event; import flash.net.NetConnection; import flash.events.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.events.AsyncErrorEvent; import flash.net.ObjectEncoding; /** * カスタムネットコネクション */ public class CustomNetConnection extends NetConnection { public function CustomNetConnection() { objectEncoding = ObjectEncoding.AMF0; addEventListener(NetStatusEvent.NET_STATUS,onNetStatus); addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError); connect("rtmp://localhost/oflaDemo"); } private function onNetStatus(evt:NetStatusEvent):void { switch(evt.info.code) { case "NetConnection.Connect.Success": trace("接続成功"); dispatchEvent(new Event(Event.CONNECT)); break; case "NetConnection.Connect.Closed": trace("接続解除"); break; case "NetConnection.Connect.Faild": trace("接続失敗"); break; case "NetConnection.Connect.Rejected": trace("接続拒否"); break; default: trace("evt.info.code"); } } private function onSecurityError(evt:SecurityErrorEvent):void { trace("セキュリティーエラー"); } private function onAsyncError(evt:AsyncErrorEvent):void { trace("同期エラー"); } } }
Main.as
package { import flash.display.Sprite; import flash.display.StageScaleMode; import flash.display.StageAlign; import models.camera.ReceiveCamera; import models.camera.SendCamera; /** * メイン */ public class Main extends Sprite { public function Main() { _init(); } private function _init():void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; var _receiveCamera:ReceiveCamera = new ReceiveCamera(); addChild(_receiveCamera); var _sendCamera:SendCamera = new SendCamera(); _sendCamera.y = 300; addChild(_sendCamera); } } }