`
hereson
  • 浏览: 1451210 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

FLEX结合FMS制作在线视频认证

    博客分类:
  • fms2
阅读更多

很多交友网站都具体在线视频认证能,如51.com。参考它的认证流程,基于Flex结合Flash Media Server开发一个自己的认证功能。在编写代码这前我们先来了解我们要实现的功能,见效果图:
(1)客户视频的截图
客户视频的截图

 

(2)客户视频认证准备的截图
客户视频认证准备的截图
(3)后台认证操作管理的截图
后台认证操作管理的截图

下面我们将分步讲解具体实现过程:

(一)客户视频截图:

常来访问我的博客且使用Flex的朋友也许会发现,以前我发布的一篇《Flex视频截图并通过WebService(C#)保存》。您猜对了,正是用这种方法实现客户视频载图,在些就不再重述了。

(二)添加FMS应用

安装Flash Midea Server 2,在安装路径的Flash Midea Server 2\applications下建立test文夹件(文件夹名称自己定义),重新启动FMS。

(三)客户视频认证准备

主要实现FMS在线共享视频和接收FMS传送的认证结果信息。详见代码:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” creationComplete=”initApp()” width=”214″ height=”214″>
<mx:Style>
Alert{font-size:12px;}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.events.CloseEvent;
import mx.controls.Alert;
import flash.net.navigateToURL;

//由于fms使用的是amf0而flex3中的as3默认使用的是amf3.所以要让flex使用AFM0
NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;

private static const DEFAULT_WIDTH:Number = 160; //摄像头显示高度
private static const DEFAULT_HEIGHT:Number = 120; //摄像头显示高度

private var m_camera:Camera; //定义一个摄像头
private var m_microphone:Microphone; //定义一个麦克风
private var m_localVideo:Video; //定义一个本地视频
private var m_netConnection:NetConnection; //定认一个网络连接
private var m_outStream:NetStream; //定义一个输出流

private var m_fmsServer:String; //视频服务器地址
private var m_userId:String; //用户ID

private function initApp():void
{
m_fmsServer = "rtmp://192.168.0.107/test";
//m_fmsServer = Application.application.parameters.videoserver;
m_userId = "1054";
//m_userId = Application.application.parameters.userid;
initCamera();
}

//初始化摄像头
private function initCamera():void
{
m_camera = Camera.getCamera();
if(m_camera != null)
{
m_camera.addEventListener(StatusEvent.STATUS,__onCameraStatusHandler);

m_camera.setMode(DEFAULT_WIDTH,DEFAULT_HEIGHT,30);
m_localVideo = new Video();
m_localVideo.width = DEFAULT_WIDTH;
m_localVideo.height = DEFAULT_HEIGHT;
m_localVideo.attachCamera(m_camera);
t_vd_Video.addChild(m_localVideo);
}
else
{
Alert.show("没有找到摄像头,是否重新查找。","提示",Alert.OK|Alert.NO,this,_initCamera);
return;
}
}

//连接网络
private function checkNetConnection():void
{
m_netConnection = new NetConnection();
m_netConnection.addEventListener(NetStatusEvent.NET_STATUS,__onNetStatusHandler);
m_netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR,__onSecurityErrorHandler);
m_netConnection.connect(m_fmsServer,m_userId);
m_netConnection.client = this;
}

//共享视频流
private function shareVideoStreame():void
{
m_outStream = new NetStream(m_netConnection);
m_outStream.attachCamera(m_camera);
m_outStream.attachAudio(m_microphone);
m_outStream.publish(m_userId,"live");
}

//检测掇像头权限事件
private function __onCameraStatusHandler(event:StatusEvent):void
{
if(!m_camera.muted)
{
checkNetConnection();
}else
{
Alert.show("无法接连接到活动摄像头,是否重新检测。","提示",Alert.OK|Alert.NO,this,_initCamera);
}
m_camera.removeEventListener(StatusEvent.STATUS,__onCameraStatusHandler);
}

//当摄像头不存在,或连接不正常时重新获取
private function _initCamera(event:CloseEvent):void
{
if(event.detail == Alert.OK)
{
initCamera();
}
}

//网络连接事件
//如果网络连接成功,开始共享视频
private function __onNetStatusHandler(event:NetStatusEvent):void
{
switch(event.info.code)
{
case "NetConnection.Connect.Success":
shareVideoStreame();
t_lbl_Info.visible = true;
break;
case "NetConnection.Connect.Failed":
Alert.show("网络连接失败,请稍后再试。","提示",Alert.OK);
break;
case "NetConnection.Connect.Rejected":
Alert.show("遭到服务器拒绝,请稍后再试。","提示",Alert.OK);
break;
}
}

private function __onSecurityErrorHandler(event:SecurityErrorEvent):void
{
trace("securityErrorHandler:" + event);
}

//接收服务端IM信息
public function AcceptServerMessage(m_result:String):void
{
t_lbl_Info.text = m_result;
}

//接收验证结果信息
public function ServerValidateMessage(m_isPass:Boolean,m_result:String):void
{
if(m_isPass)
{
Alert.show(m_result,"提示",Alert.OK,this,validateSuccessHandler);
}
else
{
Alert.show(m_result,"提示",Alert.OK|Alert.NO,this,validateFaildHandler);
}
m_netConnection.close();
}

//视频验证成功确认事件
private function validateSuccessHandler(event:CloseEvent):void
{
if(event.detail == Alert.OK)
{
//trace("页面转向");
var m_url:URLRequest = new URLRequest("http://www.soave.cn");
navigateToURL(m_url,"_self");
}
}

//视频验证失败确认事件
private function validateFaildHandler(event:CloseEvent):void
{
var m_url:URLRequest;
if(event.detail == Alert.OK)
{
//trace("页面转向,再次进行认证。");
m_url = new URLRequest("http://www.soave.cn");
navigateToURL(m_url,"_self");
}
else
{
//trace("页面转向,取消认证。");
m_url = new URLRequest("http://www.soave.cn");
navigateToURL(m_url,"_self");
}
}
]]>
</mx:Script>
<mx:Panel x=”16″ y=”16″ width=”180″ height=”162″ layout=”absolute” title=”在线认证视频” fontSize=”12″>
<mx:VideoDisplay id=”t_vd_Video” width=”160″ height=”120″/>
</mx:Panel>
<mx:Label id=”t_lbl_Info” x=”14″ y=”184″ text=”视频认证就绪” fontSize=”12″ color=”#FFFFFF”/>
</mx:Application>

checkNetConnection()连接网络方法中

程序代码 程序代码

m_netConnection.client = this;

定义FMS回调的客户端,当FMS中的main.asc需要调用客户端中的方法时,一定要指定。

shareVideoStreame()共享视频方法中

程序代码 程序代码

m_outStream.publish(m_userId,”live”);

live表示共享视频流,而不保存,当为record时,则保存视频。

AcceptServerMessage (m_result:String)和ServerValidateMessage(m_isPass:Boolean,m_result: String)方法都是在FMS中的main.asc调用。后面讲解到main.asc时,我们再详细解释。

(四)定义服务端脚本main.asc

新建一个main.asc,保存在安装路径的Flash Midea Server 2\applications\test中。

main.asc代码:

程序代码 程序代码

application.onAppStart = function()
{
userList_so = SharedObject.get(”userList”,”false”);
}

application.onConnect  = function(client,userID)
{
client.userid = userID;
userList_so.setProperty (userID,userID);
return true;
}

application.onDisconnect = function(client)
{
userList_so.setProperty(client.userid,null);
}

Client.prototype.SendMessage = function(userID,sendMsg)
{
for(var i=0;i<application.clients.length;i++)
{
if(application.clients[i].userid == userID)
{
application.clients[i].call(”AcceptServerMessage”,null,sendMsg);
}
}
return “信息发送成功!”;
}

Client.prototype.ValidateUser = function(userID,isPass,sendMsg)
{
for(var i=0;i<application.clients.length;i++)
{
if(application.clients[i].userid == userID)
{
application.clients[i].call(”ServerValidateMessage”,null,isPass,sendMsg);
}
}
return “验证结果信息发送成功!”;
}

Client.prototype.DeleteInvalidUser = function(userID)
{
for(var i=0;i<application.clients.length;i++)
{
if(application.clients[i].userid == userID)
{
application.clearStreams(application.clients[i]);
application.disconnect(application.clients[i]);
}
}
return  ”成功踢出无效连接!”;
}

application.onAppStart和application.onConnect方法定义SharedObject对象userList_so,userList_so保存着所有连接进来的客户端信息。

SendMessage 方法向客户端发送即时信息,此方法在后台认证操作管理中调用。参数userID表示要发送的客户端ID,参数sendMsg表示发送的信息内容。

ValidateUser 方法向后台认证操作管理中已进行认证操作的客户端传送认证结果信息,调用客户端准备程序中的ServerValidateMessage方法,参数 userID表示要发送的客户端ID,isPass表示是否通过认证,true表示已通过,false表示被拒绝,参数sendMsg表示发送的信息内容。

DeleteInvalidUser 方法踢除无效的连接。参数userID表示要发送的客户端ID。

(五)后台认证操作管理

主要实现连接选定的客户端共享视频和截图、显示FMS的连接用户列表、传送即时信息到指定的客户端、踢掉连接到FMS的某个用户等。详见代码:

程序代码 程序代码

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” width=”394″ height=”488″ creationComplete=”initApp()”>
<mx:Style>
Panel,Button,TextArea{font-size:12px;}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.collections.ArrayCollection;
import mx.controls.Alert;

//由于fms使用的是amf0而flex3中的as3默认使用的是amf3.所以要让flex使用AFM0
NetConnection.defaultObjectEncoding= flash.net.ObjectEncoding.AMF0;
SharedObject.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0;

private static const VIDEO_WIDTH:int = 160; //视频默认宽度
private static const VIDEO_HEIGHT:int = 120; //视频默认高度

private var videoServer:String; //视频服务器地址
[Bindable]
private var videoName:String; //视频名称
private var netConn:NetConnection;
private var inStream:NetStream;
private var sharedObject:SharedObject;
private var callResponser:Responder;
[Bindable]
private var isPass:Boolean; //用户是否通过认证标识

private function initApp():void
{
videoServer = “rtmp://192.168.0.107/test”;
//videoServer = Application.application.parameters.videoserver;

callResponser = new Responder(GetCallResult);
CheckNetConnection();
}

//检测网络连接
private function CheckNetConnection():void
{
netConn = new NetConnection();
netConn.addEventListener(NetStatusEvent.NET_STATUS,__onStatusHandler);
netConn.addEventListener(SecurityErrorEvent.SECURITY_ERROR,__onSecurityErrorHandler);
netConn.connect(videoServer);
netConn.client = this;
}

//获取视频流
private function GetVideoStream():void
{
inStream = new NetStream(netConn);
inStream.addEventListener(NetStatusEvent.NET_STATUS,__onStatusHandler);
inStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR,__onAsyncErrorHandler);

//定义onMetaData,获取视频相关数据
var m_CustomerClient:Object = new Object()
m_CustomerClient.onMetaData = function(metadata:Object):void{}

inStream.client = m_CustomerClient;

var m_Video:Video = new Video();
m_Video.attachNetStream(inStream);
m_Video.width = VIDEO_WIDTH;
m_Video.height = VIDEO_HEIGHT;
inStream.play(videoName);
t_vd_Video.addChild(m_Video);
}

//获取在线认证用户列表共享对像
private function GetUserListSharedObject():void
{
//netConn.call(”UserListFromClient”,callResponser);
sharedObject = SharedObject.getRemote(”userList”,netConn.uri,false);
sharedObject.addEventListener(SyncEvent.SYNC,__onSyncHandler);
sharedObject.connect(netConn);
t_list_User.dataProvider = new ArrayCollection();
}

//获取在线认证用户列表
private function GetUserList():void
{
var m_ac:ArrayCollection = t_list_User.dataProvider as ArrayCollection;
m_ac.removeAll();
for(var i:String in sharedObject.data)
{
var item:Object = {userid:i,data:i};
m_ac.addItem(item);
}
t_list_User.dataProvider = m_ac;

//当前用户通过认证后自动显示下一用户
if(m_ac.length > 0)
{
videoName = m_ac[0].data;
t_ta_AcceptText.text = “”;
GetUserPicture();
GetVideoStream();
}
else
{
videoName = null;
}
}

//认证通过和认证拒绝按钮事件
private function SetUserPass():void
{
if(videoName != null)
{
//从SharedObject中删除该用户并发送认证结果信息
var m_Msg:String = “”;
if(isPass)
{
m_Msg = “恭喜您,通过视频认证。”;
}
else
{
m_Msg = “您没有通过视频认证,\n是否重新认证?”;
}

netConn.call(”ValidateUser”,callResponser,videoName,isPass,m_Msg);
}
}

//删除无效的连接用户
private function DeleteInvalidUser():void
{
if(videoName != null)
{
netConn.call(”DeleteInvalidUser”,callResponser,videoName);
}
}

//当点击t_list_User中的用户时,获取该用户的视频和图片
private function GetUserVideoAndImg():void
{
videoName=t_list_User.selectedItem.data;
t_btn_Send.enabled = true;
t_ta_AcceptText.text = “”;

GetUserPicture();
GetVideoStream();
}

//获取用户视频截图
private function GetUserPicture():void
{
t_img_Picture.source = “xxxxx.jpg”;
//可以自定义方法获取视频截图
}

//网络连接事件
private function __onStatusHandler(event:NetStatusEvent):void
{
switch(event.info.code)
{
case “NetConnection.Connect.Success”:
GetUserListSharedObject();
break;
case “NetConnection.Connect.Failed”:
Alert.show(”网络连接失败,请稍后重试。”,”提示”,Alert.OK);
break;
case “NetStream.Play.StreamNotFound”:
Alert.show(”视频文件不存在,请稍后重试。”,”提示”,Alert.OK);
break;
}
}

private function __onSecurityErrorHandler(event:SecurityErrorEvent):void
{
Alert.show(”服务器发生错误:”+ event.text,”提示”,Alert.OK);
}

//共享对象改变事件
//当共享对角改变时,重新获取用户列表
private function __onSyncHandler(event:SyncEvent):void
{
GetUserList();
}

private function __onAsyncErrorHandler(event:AsyncErrorEvent):void
{
trace(event.error.message);
}

//发送聊天信息按钮事件
//向服务器传送信息,与当前正在视频验证的用户通讯
private function SendMessage():void
{
if(t_ta_SendText.text != “”)
{
if(videoName != null)
{
netConn.call(”SendMessage”,callResponser,videoName,t_ta_SendText.text);
}
t_ta_AcceptText.text += “我:” + t_ta_SendText.text + “\n”;
t_ta_SendText.text = “”;
focusManager.setFocus(t_ta_SendText);
}
}

//与FMS服务器通讯结果
private function GetCallResult(m_Result:String):void
{
trace(”从服务器返回的信息:” + m_Result);
}
]]>
</mx:Script>
<mx:Panel x=”10″ y=”10″ width=”180″ height=”200″ layout=”absolute” title=”{videoName}认证视频”>
<mx:VideoDisplay id=”t_vd_Video” width=”160″ height=”120″/>
<mx:ControlBar horizontalAlign=”right”>
<mx:Button id=”t_btn_Pass” label=”通过认证” click=”{isPass = true;SetUserPass();}”/>
<mx:Button id=”t_btn_Refuse” label=”拒绝” click=”{isPass = false;SetUserPass();}”/>
</mx:ControlBar>
</mx:Panel>
<mx:Panel x=”204″ y=”10″ width=”180″ height=”200″ layout=”absolute” title=”{videoName}认证截图”>
<mx:Image id=”t_img_Picture” width=”160″ height=”120″/>
<mx:ControlBar horizontalAlign=”right”>
<mx:Button id=”t_btn_GetPicture” label=”重新获取” click=”GetUserPicture()” />
</mx:ControlBar>
</mx:Panel>
<mx:Canvas x=”10″ y=”218″>
<mx:List id=”t_list_User” x=”0″ y=”0″ width=”180″ height=”228″ labelField=”userid” itemClick=”GetUserVideoAndImg()”></mx:List>
<mx:Button  id=”t_btn_Disconn” x=”0″ y=”236″ label=”踢出” click=”DeleteInvalidUser()”/>
<mx:Button id=”t_btn_UserList” x=”76″ y=”236″ label=”刷新用户列表” click=”GetUserList()”/>
</mx:Canvas>
<mx:Canvas x=”204″ y=”218″>
<mx:TextArea id=”t_ta_AcceptText” x=”0″ y=”0″ width=”180″ height=”182″ editable=”false”/>
<mx:TextArea id=”t_ta_SendText” x=”0″ y=”190″ width=”180″ height=”38″/>
<mx:Button id=”t_btn_Send” x=”128″ y=”235″ label=”发送” enabled=”false” click=”SendMessage()”/>
</mx:Canvas>
</mx:Application>

分享到:
评论

相关推荐

    Flex +FMS实现视频聊天

    Flex+FMS写的视频聊天,在本机亲测通过。但唯一不足得是在别的机子上连接不成功。我也不知道为什么。望有才之士能完善。huzhaohui1992@qq.com 如能完善,请给我邮箱一份,在下感激不尽。

    fms.rar_flex_flex and fms_fms_fms rtmp_fms flex

    Flex是一种开源的、基于ActionScript的框架,用于构建富互联网应用程序(RIA),而FMS是Adobe提供的服务器软件,支持实时流媒体和数据传输,尤其适用于在线视频、音频流和实时交互应用。 1. **Adobe Flex**: Flex是...

    flex+fms实现视频直播源码

    Flex+FMS实现视频直播源码是一种基于Adobe Flex和Flash Media Server (FMS)技术的视频直播解决方案。这个项目提供了一个简单示例,演示了如何利用Flex进行摄像头和音频的捕获与录制,以及如何将这些内容实时推送到...

    FMS.rar_flex_flex FMS_fms_site:www.pudn.com

    【标签】"flex flex_fms fms site:www.pudn.com" 强调了Flex与FMS的结合使用,以及资源可能来源于网络平台www.pudn.com,这是一个提供编程资源共享的网站。 在【压缩包子文件的文件名称列表】中: 1. **FMS广播...

    Flex FMS 发送和接收视频

    Flex FMS(Flash Media ...通过这个实例,开发者可以学习到如何使用Flex和FMS创建实时的视频应用,这对开发互动式在线教育、远程会议、直播服务等具有重要意义。同时,了解JMS的使用也能拓宽对分布式系统设计的理解。

    FMS3系列(五):通过FMS实现时时视频聊天(Flash|Flex)

    FMS3特别适用于开发基于Flash和Flex的应用,因为这两个技术平台可以无缝集成FMS,创建出具有高质量音视频效果的实时通信应用。 **实时视频聊天的技术原理** 1. **RTMP协议**:RTMP是实时消息协议,用于在客户端(如...

    Flex和Fms3打造在线聊天室 源码和文档

    Flex和FMS3是构建实时互动应用程序的强大工具,尤其适合创建在线聊天室这样的实时通信平台。这个源码和文档集合提供了详细的步骤和技术说明,帮助开发者理解如何利用这些技术实现一个功能完备的聊天室。 Flex是一种...

    fms.rar_flex_fms_流媒体

    在IT行业中,流媒体技术是实现在线视频和音频传输的关键技术之一,而Adobe的Flash Media Server(FMS)就是一种广泛使用的流媒体服务器解决方案。本文将深入探讨如何利用FMS作为流媒体服务器,进行实时通信视频聊天...

    Fms3和Flex打造在线多人视频会议和视频聊天附原代码

    总的来说,通过Flex和FMS3的结合,我们可以构建出功能完善的在线多人视频会议和视频聊天系统。这个过程中,不仅需要扎实的编程基础,还需要对音视频处理、网络通信和服务器管理有深入的理解。提供的"Video2"文件可能...

    通过FMS实现时时视频聊天(Flash|Flex)源码

    【标题】中的“通过FMS实现时时视频聊天(Flash|Flex)源码”是指使用Adobe的Flash Media Server (FMS)技术,结合Flash和Flex这两种编程语言,开发出一款能够实现实时视频通信的应用程序。这个标题暗示了我们将在...

    Fms3和Flex打造在线多人视频会议和视频聊天(附原代码)

    总结来说,使用FMS3和Flex构建在线多人视频会议系统,需要掌握音视频处理、网络通信、用户界面设计等多个方面的技术。有了这个教程及源代码,开发者可以深入学习并实践这一过程,为构建自己的视频会议平台打下坚实...

    FMS3.0实现视频会议代码

    通过研究并实践这个“FMS3.0实现视频会议”的项目,你可以掌握Flex和FMS3.0的核心特性,理解实时多媒体通信的原理,这对于进一步深入学习WebRTC、互动直播、在线教育等领域都大有裨益。同时,这个项目也可以作为开发...

    flex连接到FMS详解

    本文将详细阐述如何使用Flex连接到FMS,并实现视频发送功能。 **一、准备工作** 1. **开发工具**: 首先,你需要安装Flash MX Authoring工具,这是Flex的基础。同时,你也需要Flash MX Communication Server,它是...

    fms之P2P视频聊天

    另外,结合社交网络功能,用户可以邀请好友加入视频聊天,或者创建公开房间供陌生人参与。 总的来说,"fms之P2P视频聊天"项目涵盖了P2P网络技术、UDP通信、NAT穿透、流媒体服务器应用以及高清视频处理等多个IT领域...

    Flex视频会议系统

    综上所述,Flex视频会议系统通过结合Flex前端框架和FMS服务器后端支持,构建了一个高效、易用的在线会议平台,满足了现代企业远程协作和沟通的需求。而WinMeeting作为其客户端程序,为用户提供了便捷的会议参与方式...

    利用fms服务器和flex来做在线视频聊天.docx

    本文将详细介绍如何利用FMS服务器(Flash Media Server)和Flex技术实现在线视频聊天功能。FMS服务器是一种强大的实时流媒体服务器,它支持多种实时通信协议,包括RTMP(Real-Time Messaging Protocol),使得视频和...

    FLEX视频摄像头录制上传到服务器及FMS服务器的安装与配置

    在本文中,我们将深入探讨如何使用FLEX技术实现视频摄像头录制,并将录制的视频上传到FMS(Flash Media Server)服务器。首先,我们先来理解一下FLEX是什么以及它的核心功能。 FLEX全称为Flex Framework,是Adobe...

    fms+flex完成视频的录制与播放

    首先下载fms服务器安装好,并在fms安装目录的applications目录下新建一个test_video文件夹目录,一定要与flext程序中rtmp://127.0.0.1/test_video的test_video要一致,fms服务器启动后,执行flex程序,即可实现

    FMS视频会议源代码

    《FMS视频会议源代码详解》 在信息技术领域,视频会议已经成为远程协作的重要工具,而FMS(Flash Media Server)则是实现这一功能的关键技术之一。本文将深入探讨基于Flash + FMS的视频会议源代码,解析其核心概念...

Global site tag (gtag.js) - Google Analytics