本文主要介绍使用FluorineFx.Net来实现视频录制与视频回放,FluorineFx如同FMS一样,除了有AMF通信,RTMP协议,RPC和远程共享对象外,它同样具备视频流服务的功能。通过它我们可以非常方便的实现在线视频录制、视频直播、视频聊天以及视频会议等类似应用程序的开发。

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

本文示例程序下载: FluorineFxVideo.rar

版权说明

本文属原创文章,欢迎转载,其版权归作者和博客园共有。

作      者:Beniao

文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

转载于:https://www.cnblogs.com/beniao/archive/2009/06/07/1497690.html

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

  1. Flex与.NET互操作系列文章

    本系列文章主要介绍了关于Flex与.NET结合开发中的一些互操作性,包括网络通信.数据加载.数据传输.文件传输.以及应用于Flex与.NET协作开发的通信网关开源项目FluorineFx的相关知识点. ...

  2. Flex与.NET互操作系列文章索引

    本系列文章主要介绍了关于Flex与.NET结合开发中的一些互操作性,包括网络通信.数据加载.数据传输.文件传输.以及应用于Flex与.NET协作开发的通信网关开源项目FluorineFx的相关知识点. ...

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

    远程共享对象(Remote Shared Objects) 可以用来跟踪.存储.共享以及做多客户端的数据同步操作.只要共享对象上的数据发生了改变,将会把最新数据同步到所有连接到该共享对象的应用程序客户 ...

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

    注:本文内容原本计划在上一篇<Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx >中写出,考虑到写在一起文章内容太长故分为两篇. Flex中的远程对象访问 ...

  5. Flex与.NET互操作(十):基于FluorineFx.Net的及时通信应用(Real-time Messaging Applications)(一)...

     使用FluorineFx.Net开发的每一个实时通讯功能应用都拥有一个应用程序适配器(ApplicationAdapter),用来管理整个实时通讯应用的生命周期,以及接受和拒绝客户端的连接等.应用程 ...

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

    本文将使用FluorineFx和Flex结合介绍一个简单的视频聊天室案例开发,希望通过此篇和大家交流FluorineFx和Flex的相关技术,同时也希望本篇可以帮助到需要使用FluorineFx做及时 ...

  7. Flex与.NET互操作(三):基于WebService的数据访问(下)

    在上一篇文章<Flex与.NET互操作(二):基于WebService的数据访问(上) >中介绍了通过<mx:WebService>标签来访问Webservice.实际上我们也 ...

  8. [转]Flex与.NET互操作(三):基于WebService的数据访问(下)

    转自:http://blog.csdn.net/beniao277/archive/2009/01/19/3837605.aspx 在上一篇文章<Flex与.NET互操作(二):基于WebSer ...

  9. FluorineFx:视频录制及回放(Flash/AS3环境)

    如果不考虑安全因素(指任何人都可连接FluorineFx进行视频录制,而不需要登录认证),其实服务端不用写一行代码,仅需要在apps目录下建一个子目录当作应用,以及在services-config.x ...

最新文章

  1. 复旦大学邱锡鹏教授:一张图带你梳理深度学习知识脉络
  2. ADMT3.2域迁移之Server2003至Server2012系列(八)生成密钥文件及安装密码迁移工具...
  3. 用户名登陆的两种格式
  4. 华为人工智能计算机平台,华为发布首个人工智能移动计算平台
  5. 解决Pytohn安装第三方库出现read timed out 问题
  6. android 编译 bison,Ubuntu搭建android编译环境问题总结
  7. Secret 的使用场景 - 每天5分钟玩转 Docker 容器技术(109)
  8. EMNLP 2021 投稿FAQ
  9. 彻底理解PHP的SESSION机制
  10. 阿里云云计算 29 AS的原理
  11. 匹配滤波器结合Matlab实现
  12. word2007 计算机考试题库,2015年职称计算机考试题库word2007
  13. PowerBi包含什么,以及每一个的介绍
  14. 【云原生架构】阿里云 —— 主要架构模式
  15. 微信ipad 62 A16登录协议,小程序code 小程序sessionid 获取
  16. Web全栈工程师技能树梳理
  17. gif、bmp、jpg、jpeg图片有什么区别
  18. 什么叫实时操作系统,什么叫非实时操作系统,两者有什么区别?
  19. hdu6060 RXD and dividing
  20. layui数据表格分页简单实现

热门文章

  1. 村庄规划中核心技术(村土地利用规划方面)
  2. java 事件分发机制_用两段代码带你看懂事件分发机制
  3. php把时间戳改为时间格式,php怎么把时间格式转换为时间戳?
  4. 浏览器与硬件交互的方法_【第2058期】现代浏览器内部揭秘之一
  5. 如何建立个人博客网站
  6. java程序a-z b-y,请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串,输出这个串加密后的结 - 赏学吧...
  7. java本地方法不能是final_Java final关键字
  8. 移动端页面rem+media写法过程
  9. 检查服务器端口占用情况命令
  10. @EqualsAndHashCode