Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放_Flex

通过它我们可以非常方便的实现在线视频录制、视频直播、视频聊天以及视频会议等类似应用程序的开发。

 在《FMS3系列(四):在线视频录制、视频回放 》这篇文章里我写了通过FMS来实现在线视频录制和视频回放的功能,客户端的开发和这篇文章是相同的,不同的是本文将使用Flex来开发。

      首先我们来看看使用FluorineFx服务端是如何开发的,建立ApplicationAdapter是必然的,这里我们为本文中的示例程序建立的ApplicationAdapter为VideoApplication,并为其添加RemotingServiceAttribute 如下代码块:

namespace Fx.Adapter
{
    /// <summary>
    /// 视频应用
    /// </summary>
    [RemotingService]
    public class VideoApplication : ApplicationAdapter
    {
        public override bool AppStart(IScope application)
        {
            return base.AppStart(application);
        }

        public override bool AppConnect(IConnection connection, object[] parameters)
        {
            return base.AppConnect(connection, parameters);
        }
    }
}

      ApplicationAdapter模板所提供的方法在实际项目开发中根据自己的需求去重写,这里不作过多介绍。光是这样还是不能实现视频的录制和回放的功能,这只是实现了基本的启动应用程序和客户端连接等基本功能,要想实现视频录制和回放,我们还得让 VideoApplication实现IStreamService接口,该接口提供了实现视频发布和播放的相应功能,其定义如下:

namespace FluorineFx.Messaging.Api.Stream
{
    [CLSCompliant(false)]
    public interface IStreamService : IScopeService, IService
    {
        void closeStream();
        int createStream();
        void deleteStream(int streamId);
        void deleteStream(IStreamCapableConnection connection, int streamId);
        void pause(bool pausePlayback, double position);
        void play(bool dontStop);
        void play(string name);
        void play(string name, double start);
        void play(string name, double start, double length);
        void play(string name, double start, double length, bool flushPlaylist);
        void publish(bool dontStop);
        void publish(string name);
        void publish(string name, string mode);
        void receiveAudio(bool receive);
        void receiveVideo(bool receive);
        void releaseStream(string streamName);
        void seek(double position);
    }
}

      OK,有了应用处理器接下来在FluorineFx网站的apps中添加应用程序(VideoApp),并配置好由此处理器来处理视频录制和回放。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <application-handler type="Fx.Adapter.VideoApplication"/>
</configuration>

      要使用RTMP协议,那么配置RTMP通信信道肯定是不能少的,在配置文件WEB-INF/flex/service-config.xml中配置使用RTMP协议的通信信道。

?xml version="1.0" encoding="utf-8" ?>
<services-config>
  <channels>
    <channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel">
      <endpoint uri="rtmp://{server.name}:1617" class="flex.messaging.endpoints.RTMPEndpoint"/>
    </channel-definition>
  </channels>
</services-config>

       于此FluorineFx服务器端“基本”算是完成了。下面转到客户端的开发,建立Flex项目并设计好界面,如下图:            
            

      建立与FluorineFx服务器上应用程序的连接,连接成功则将自己的视频数据显示到界面上,如下实现代码:

private function connectionServer(event:MouseEvent):void
{
    nc = new NetConnection();
    nc.connect("rtmp://localhost:1617/VideoRecord","beniao","123456");
    nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStautsHandler);
    nc.client = this;
}

private function onNetStautsHandler(event:NetStatusEvent):void
{
    if(event.info.code == "NetConnection.Connect.Success")
    {
        cam = Camera.getCamera();
        if(cam != null)
        {
            this.myVideo.attachCamera(cam);
        }
        else
        {
            Alert.yesLabel = "确定";
            Alert.show("没有检测到视频摄像头","系统提示");
        }
    }
}

      录制视频也就是将自己本机的视频摄像头获取的视频数据以及音频设备的数据附加到网络流(NetStream),使用网络流的publish()方法将流发布到服务器上,这和使用FMS是相同的。

private function onRecordVideo(event:MouseEvent):void
{
    if(this.nc)
    {
        var mic:Microphone = Microphone.getMicrophone();
        ns = new NetStream(this.nc);
        ns.attachCamera(cam);
        ns.attachAudio(mic);
        ns.client = this;
        ns.publish(this.videoName.text,"record");

        this.btnStart.enabled = false;
        this.btnEnd.enabled = true;                
    }
}

private function onStopRecord(event:MouseEvent):void
{
    if(this.nc)
    {
        this.nc.close();
        this.btnStart.enabled = true;
        this.btnEnd.enabled = false;
        this.btnPlay.enabled = true;
    }
}

      停止视频录制的功能就更加简单了,直接断开当前客户端与服务器端的连接就可以,使用网络连接(NetConnection)的close()方法。 

             

     录制好的视频将会保存在网站下的apps/VideoApp/stream目录中,如下图:                              

            

      实现录制的视频回放实际上就是播放服务器上的一个.flv视频文件,同样需要先建立与服务器端的网络连接,通过网络流去加载指定的视频文件,最后将其显示到应用界面上。

private function onPlayVideo(event:MouseEvent):void
{
    nc = new NetConnection();
    nc.connect("rtmp://localhost:1617/VideoRecord","beniao","123456");
    nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayNetStautsHandler);
    nc.client = this;
}
private function onPlayNetStautsHandler(event:NetStatusEvent):void
{
    if(event.info.code == "NetConnection.Connect.Success")
    {
        ns = new NetStream(this.nc);
        ns.client = this;
        var video:Video = new Video();
        video.width = 320;
        video.height = 240;
        video.attachNetStream(this.ns);
        this.myVideo.addChild(video);
        this.ns.play(this.videoName.text);
    }
}

      到此就完成了使用FluorineFx.Net来实现视频录制和回放的功能,接下来我们来看看FluorineFx对发布录制视频流以及实况视频流的安全方面是怎么处理的。FluorineFx.Messaging.Api.Stream.IStreamPublishSecurity 接口就是专门用来处理发布流是的安全处理的,如果要对发布流进行安全方面的处理,那么就自定义一个实现该接口的安全策略类,在策略类里根据自己的实际情况来处理安全设置。

      通过该安全策略类可以很方便的判断发布流的类型、流的名称以及对发布流进行授权等相关操作。如下安全策略类:

namespace Fx.Adapter
{
    public class PublishSecurity : IStreamPublishSecurity
    {
        public bool IsPublishAllowed(IScope scope, string name, string mode)
        {
            //是否为录制流
            if (!"record".Equals(mode))
            {
                return false;
            }

            //文件名是否以test开头
            if (!name.StartsWith("test"))
                return false;
            else
                return true;
        }
    }
}

      在应用处理程序里通过ApplicationAdapter提供的RegisterStreamPublishSecurity()方法注册安全策略,该方法的定义如下所示:

public void RegisterStreamPublishSecurity(IStreamPublishSecurity handler); 

      

      要注册发布流的安全策略,通常都是在应用程序启动中注册,如下代码块:

public override bool AppStart(IScope application)
{
    RegisterStreamPublishSecurity(new PublishSecurity());
    return base.AppStart(application);
}

      通过RegisterStreamPublishSecurity()方法注册好发布流的安全策略后,每次发布流都会通过自定义的安全策略来检测当前发布流是否符合自定义的安全规则。这样一方便可以保证别人恶意连接到你的应用程序进行流的发布,消耗网络带宽等多中不利现象,更多的好处还待研究。
本文示例程序下载

时间: 2024-08-03 10:50:31

Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放_Flex的相关文章

Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放

本文主要介绍使用FluorineFx.Net来实现视频录制与视频回放,FluorineFx如同FMS一样,除了有AMF通信,RTMP协议,RPC和远程共享对象 外,它同样具备视频流服务的功能.通过它我们可以非常方便的实现在线视频录制.视频直播.视频聊天以及视频会议等类似应用程序的开发 . 在<FMS3系列(四):在线视频录制.视频回放>这篇文章里我写了通过FMS来实现在线视频录制和视频回放的功能,客户端的开发和 这篇文章是相同的,不同的是本文将使用Flex来开发. 首先我们来看看使用Fluor

Flex与.NET互操作 了解FluorineFx的环境配置(远程对象、网关、通道、目的地)_Flex

在本系列文章的前面几篇文章中所介绍的访问Webservice的方法,也就是一种远程对象方法,只不过他是基于WEB服务(WebServie)的远程访问,不是基于远程对象(Remoting Object)的的远程访问.要想直接实现基于对象的远程访问是比较麻烦的,然后FluorineFx则专门为我们提供了该功能,通过 FluorineFx的核心库来开发远程对象(Remoting Object)服务,具体是怎么实现的呢? FluorineFx要求为远程对象提供[RemotingService]标记来提供

Flex与.NET互操作 使用HttpService、URLReqeust和URLLoader加载/传输数据_Flex

ActionScript 3.0中提供的数据加载请求类主要是HTTPService,URLLoader和URLRequest,可以通过他们协同来完成数据加载和请求.下面我么便来看看这三个类是怎么来完成数据加载工作.      在本地IIS服务器上有如下定义的XML文件:  1 <?xml version="1.0" encoding="utf-8" ?> 2 <Root> 3   <Book> 4     <Id>1&

Flex与.NET互操作(十二):FluorineFx.Net的及时通信应用(Remote Shared Objects)(三)_Flex

FluorineFx所提供的远程共享对象(Remote Shared Objects)和FMS的共享对象的功能是一样,对于熟悉FMS开发的朋友来说,学习FluorineFx的远程共享对象是非常简单的.       共享对象可以在服务器端创建,也可以在客户端创建.在客户端创建共享对象的方法和使用FMS开发是一样的,创建一个 NetConnection对象,通过该对象的connect()方法连接到服务器,然后通过SharedObject.getRemote()方法就可以在客户端创建一个远程共享对象.

Flex与.NET互操作(十六):FluorineFx + Flex视频聊天室案例开发

本文将使用FluorineFx和Flex结合介绍一个简单的视频聊天室案例开发,希望通过此篇和大家交流FluorineFx和Flex的相关技术,同时也希 望本篇可以帮助到需要使用FluorineFx做及时应用开发的新手朋友.首先列举下本篇中所涉及到的开发环境和相关技术以及简单的需求定义: 1. Microsoft Visual Studio 2008(VS SP1)+.NET Framework 3.5(SP1) 2. FluorineFx v1.0.0.15 3. Adobe Flex Buil

Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx

在本系列前面几篇文章中分别介绍了通过WebService.HTTPService.URLLoader以及FielReference等组件或类来完成Flex与.NET服务端的 通信的相关知识点.通过这些方式来完成与服务端的通信是非常方便和简单的,但有他的缺点就是通信数据量较小,如要传输大量的数据或是 实现不同对象的序列化传输,它们则满足不了我们的需求,需要寻找另外一种通信协议,另一种高效的传输协议来代替SOAP协议传输的方案, 那便是AMF(ActionScript Message Format)

Flex与.NET互操作(十):FluorineFx.Net的及时通信应用(ApplicationAdapter)(一)_Flex

应用程序适配器对象也就相当于是一个Flash媒体服务器应用程序的对象. 使用FluorineFx.Net开发及时通信应用,我们可以通过ASP.NET网站来宿主,一个ASP.NET网站可以承载多个实时通讯应用程序.这些应用程序都存储ASP.NET网站的根目录下指定文件夹的根目录中.如下图示:                                       在开发FluorineFx的及时通信应用的时候,按照FluorineFx的目录结构配置ASP.NET的站点目录是非常简单的,只需要在

Flex和.NET协同开发利器FluorineFx Flex与.NET互操作_Flex

通过这些方式来完成与服务端的通信是非常方便和简单的,但有他的缺点就是通信数据量较小,如要传输大量的数据或是实现不同对象的序列化传输,它们则满足不了我们的需求,需要寻找另外一种通信协议,另一种高效的传输协议来代替SOAP协议传输的方案,那便是AMF(ActionScript Message Format)协议.      开源项目FluorineFx就是专门针对.NET平台与Flex通信提供的AMF协议通信网关,我们可以通过FluorineFx很方便的完成与.NET的通信.      Fluori

Flex与.NET互操作(十五)

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传 前几天一位朋友问我一个问题,他说:"我用HTTP接口或是WebService接口可以实现图片上传功能,那么用FluorineFx如何实现图片 上传功能呢?",其实仔细看官方文档和示例程序的自己都可以找到答案,实现上传可以有很多种实现,这里我以官方所提供是示例为基 础稍加改动,通过ByteArray类实现图片上传. 首先建立FluorineFx库和网站,在远程服务器类里添加一个处理文