当前位置: 首页 > news >正文

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

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

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

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> namespace Fx.Adapter
{
/// <summary>
/// 视频应用
/// </summary>
[RemotingService]
public class VideoApplication:ApplicationAdapter
{
public override bool AppStart(IScopeapplication)
{

return base .AppStart(application);
}

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

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> namespace FluorineFx.Messaging.Api.Stream
{
[CLSCompliant(
false )]
public interface IStreamService:IScopeService,IService
{
void closeStream();
int createStream();
void deleteStream( int streamId);
void deleteStream(IStreamCapableConnectionconnection, 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),并配置好由此处理器来处理视频录制和回放。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> <? xmlversion="1.0"encoding="utf-8" ?>
< configuration >
< application-handler type ="Fx.Adapter.VideoApplication" />
</ configuration >

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> ?xmlversion="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服务器上应用程序的连接,连接成功则将自己的视频数据显示到界面上,如下实现代码:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> private functionconnectionServer( event :MouseEvent): void
{
nc
= new NetConnection();
nc.connect(
" rtmp://localhost:1617/VideoRecord " , " beniao " , " 123456 " );
nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStautsHandler);
nc.client
= this ;
}

private functiononNetStautsHandler( 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是相同的。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> private functiononRecordVideo( event :MouseEvent): void
{
if ( this .nc)
{
varmic: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 functiononStopRecord( 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视频文件,同样需要先建立与服务器端的网络连接,通过网络流去加载指定的视频文件,最后将其显示到应用界面上。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> private functiononPlayVideo( event :MouseEvent): void
{
nc
= new NetConnection();
nc.connect(
" rtmp://localhost:1617/VideoRecord " , " beniao " , " 123456 " );
nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayNetStautsHandler);
nc.client
= this ;
}
private functiononPlayNetStautsHandler( event :NetStatusEvent): void
{
if ( event .info.code == " NetConnection.Connect.Success " )
{
ns
= new NetStream( this .nc);
ns.client
= this ;
varvideo: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接口就是专门用来处理发布流是的安全处理的,如果要对发布流进行安全方面的处理,那么就自定义一个实现该接口的安全策略类,在策略类里根据自己的实际情况来处理安全设置。

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> namespace Fx.Adapter
{
public class PublishSecurity:IStreamPublishSecurity
{
public bool IsPublishAllowed(IScopescope, string name, string mode)
{
// 是否为录制流
if ( ! " record " .Equals(mode))
{
return false ;
}

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

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public void RegisterStreamPublishSecurity(IStreamPublishSecurityhandler);

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public override bool AppStart(IScopeapplication)
{
RegisterStreamPublishSecurity(
new PublishSecurity());
return base .AppStart(application);
}

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


本文示例程序下载:http://www.cnblogs.com/beniao/archive/2009/06/07/1497690.html

相关文章:

  • Swift中的本地化实现
  • Azure .Net应用架构原型
  • Nebula3中的委托(Delegate)
  • 使用微软T4 template进行代码生成
  • ora-12537教训
  • Asp.Net MVC webAPI Token based authentication
  • Asp.Net 2.0 TreeView的Checkbox级联操作
  • azure最佳实践系列1-自我修复的设计
  • Nebula3 RTTI 小技巧
  • azure 最佳实践 -- 保持冗余
  • Swift 3 打印功能
  • 还需要编写DAO代码吗?SQL+接口就足够了!(Part 1)
  • 百度关闭竞价排名部分功能,以提升用户体验
  • linux 更新nodejs到最新
  • 移动MM初探之一:苹果APP Store模式将不再赢利?
  • 345-反转字符串中的元音字母
  • HTTP--网络协议分层,http历史(二)
  • isset在php5.6-和php7.0+的一些差异
  • JS+CSS实现数字滚动
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Lsb图片隐写
  • Meteor的表单提交:Form
  • nfs客户端进程变D,延伸linux的lock
  • ReactNative开发常用的三方模块
  • SpiderData 2019年2月25日 DApp数据排行榜
  • supervisor 永不挂掉的进程 安装以及使用
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 排序算法学习笔记
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 删除表内多余的重复数据
  • 算法-插入排序
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 延迟脚本的方式
  • 转载:[译] 内容加速黑科技趣谈
  • # 达梦数据库知识点
  • (Forward) Music Player: From UI Proposal to Code
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计ssm电影分享网站
  • (七)Knockout 创建自定义绑定
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十八)SpringBoot之发送QQ邮件
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)重识new
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net 4.0发布后不能正常显示图片问题
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET4.0并行计算技术基础(1)
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net下的签名与混淆