利用FluorineFX录制音频与视频
要做一个完整的录制程序,处理RPC请求的类不仅要继承ApplicationAdapter,还要继承IStreamService接口,该接口定义了play(),pause(),publish(),createStream()等一系列方法来完善程序
关于安全性,可以自定义一个实现FluorineFx.Messaging.Api.Stream.IStreamPublishSecurity接口的类,并定义一个IsPublishAllowed()方法,在该方法里可以判断发布流的类型、流的名称以及对发布流进行授权等相关操作。然后重写applicationAdapter类的appStart()方法,并注册该安全策略:RegisterStreamPublishSecurity(new PublishSecurity());
录制的文件保存在apps/MyRoom/streams下
录制时通过netStream.publish(name,type)来实现的,参数说明如下:
name:String (default = null) — 标识该流的字符串。 如果传递 false,则发布操作将停止。 订阅此流的客户端必须在调用 NetStream.play() 时仍然传递此名称。 不必在流名称中包含文件扩展名
type:String (default = null) — 指定如何发布该流的字符串。 有效值为“record”、“append”和“live”。 默认值为“live”
如果传递“record”,则 Flash Player 将发布并录制实时数据,同时将录制的数据保存到名称与传递给 name 参数的值相匹配的 FLV 文件中。 该文件保存在服务器上服务器应用程序所在目录的子目录中。 如果该文件已经存在,则覆盖该文件。
如果传递“append”,则 Flash Player 将发布并录制实时数据,同时将录制的数据追加到名称与传递给 name 参数的值相匹配的 FLV 文件中,该文件保存在服务器上服务器应用程序所在目录的子目录中。 如果未找到名称与 name 参数相匹配的文件,则创建一个。
如果省略此参数或传递“live”,则 Flash Player 将发布实时数据而不进行录制。 如果存在名称与传递给 name 参数的值相匹配的文件,则删除它。
服务器端代码:
- MyVideoApp.cs
- public class MyVideoApp : ApplicationAdapter
- {
- public override bool AppStart(FluorineFx.Messaging.Api.IScope application)
- {
- RegisterStreamPublishSecurity(new PublishSecurity());
- return base.AppStart(application);
- }
- }
- PublishSecurity.cs
- using System;
- using System.Collections.Generic;
- using System.Text;
- using FluorineFx.Messaging.Api.Stream;
- using FluorineFx.Messaging.Api;
- using FluorineFx.Context;
- namespace ServiceLibrary5
- {
- public class PublishSecurity : IStreamPublishSecurity
- {
- public bool IsPublishAllowed(IScope scope, string name, string mode)
- {
- //if (!"live".Equals(mode))
- //{
- // // Not a live stream
- // return false;
- //}
- if (!"record".Equals(mode))
- {
- //不是录制流
- return false;
}- IConnection connection = FluorineContext.Current.Connection;
- if (!"authenticated".Equals(connection.GetAttribute("UserType")))
- {
- // User was not authenticated
- return false;
- }
- if (!name.StartsWith("testing"))
- return false;
- else
- return true;
- }
- }
- }
客户端代码:
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
- <mx:UIComponent id="uiBox" width="320" height="240" />
- <mx:Label x="371" y="222" text="Label" id="lblMessage"/>
- <mx:Button x="371" y="48" label="连接服务器" click="onConnect()" />
- <mx:Button x="371" y="94" label="开始录制" click="onStartRecord()" />
- <mx:Button x="371" y="136" label="停止录制" click="onStopRecord()" />
- <mx:Button x="371" y="180" label="播放视频" click="onPlayRecord()" />
- <mx:Script>
- <![CDATA[
- private var nc:NetConnection;
- private function onConnect():void
- {
- nc = new NetConnection();
- nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
- nc.connect("rtmp://localhost:8323/MyVideoRoom");
- nc.client = this;
- }
- private function onNetStatus(event:NetStatusEvent):void
- {
- if(event.info.code == "NetConnection.Connect.Success")
- {
- this.lblMessage.text = "连接服务器成功";
- }
- else
- {
- this.lblMessage.text = "连接服务器失败";
- }
- }
- private function onStartRecord():void
- {
- if(nc)
- {
- var ns:NetStream = new NetStream(nc);
- var mic:Microphone = Microphone.getMicrophone();
- var camera:Camera = Camera.getCamera();
- ns.attachAudio(mic);
- ns.attachCamera(camera);
- ns.publish("demo001","record");
- this.lblMessage.text = "录制中……";
- }
- }
- private function onStopRecord():void
- {
- if(nc)
- {
- nc.close();
- this.lblMessage.text = "已停止录制";
- }
- }
- private function onPlayRecord():void
- {
- nc = new NetConnection();
- nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus2);
- nc.connect("rtmp://localhost:8323/MyVideoRoom");
- }
- private function onNetStatus2(event:NetStatusEvent):void
- {
- if(event.info.code == "NetConnection.Connect.Success")
- {
- var ns:NetStream = new NetStream(nc);
- var video:Video = new Video();
- video.attachNetStream(ns);
- this.uiBox.addChild(video);
- ns.play("demo001");
- }
- }
- ]]>
- </mx:Script>
- </mx:Application>
利用FluorineFX录制音频与视频的更多相关文章
- 使用PYaudio录制音频和视频(自己)
参考:https://blog.csdn.net/zhaoyun_zzz/article/details/84341801 音频录制:简洁版 import pyaudioimport waveimpo ...
- 【Android】20.0 第20章 音频、视频、拍照、语音合成
分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 Android提供了常见的多媒体文件编码.解码机制,你可以直接调用Android提供的API,实现相册.播放器.录 ...
- Android录制音频的三种方式
对于录制音频,Android系统就都自带了一个小小的应用,可是使用起来可能不是特别的灵活.所以有提供了另外的俩种. 下边来介绍下这三种录制的方式; 1.通过Intent调用系统的录音器功能,然后在录制 ...
- 利用FFmpeg玩转Android视频录制与压缩(二)<转>
转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...
- 使用 Xbox Game 录制桌面视频(录制音频)
使用 Xbox Game 录制桌面视频(附带音频) 前言:可能自己音频输出的问题,一直无法用工具录制桌面的音频,而最后发现利用 Xbox Game 录制游戏视频的功能很好地解决我们的问题. 1)打开游 ...
- Java 利用缓冲字节流来实现视频、音频、图片的复制粘贴
InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位). OutputSteam:继承自OutputStream的流都是程序用于向外输出数据的, ...
- iOS音频与视频的开发(二)- 使用AVAudioRecorder进行录制音频
1.使用AVAudioRecorder录制视频 AVAudioRecorder与AVAudioPlayer类似,它们都属于AVFoundation的类.AVAudioRecorder的功能类似于一个录 ...
- Windows Store App 音频和视频
在Windows应用商店应用中提供了MediaElement控件,该控件能为应用提供音频和视频播放功能.就像之前提到的,虽然在多媒体应用开发中,开发人员可以自行开发一套音频.视频编解码规范和开发媒体播 ...
- 使用HTML 5捕捉音频与视频信息
长期以来,音频与视频信息的捕捉一直是Web开发中的一个难点.许多年来,我们一直依赖浏览器插件来实现这个需求. 在HTML 5中,出现了许多可以访问硬件设备的API,例如访问GPS设备的Geolocat ...
随机推荐
- kali工具学习
使用前的准备 开启/关闭 HTTP服务 Service apache2 start/stop 自动启动HTTP服务:update-rc.d apache2 defaults 开启/关闭 mysql S ...
- Linux 通过YUM安装rzsz
yum自动安装: yum install lrzsz
- cmd命令 chcp
chcp是“change code page”的缩写.(关于代码页的相关知识详见:http://www.cnblogs.com/minisculestep/articles/4920992.html)
- 积累PDU
PDU,即专业发展单元PDUs(Professional Development Units)用来量化PMP所参与的学习和专业服务活动.典型情况下,每个小时所进行的有计划的.系统的学习或专业活动可获得 ...
- configsections規範配置信息
對於小型項目,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 1 ...
- 遵守GPL的开源软件能用于商用吗?
遵守GPL的开源软件能用于商用吗? 比较经典的开源协议有 GPL,BSD 等等. GPL 软件可以用于商业用途,甚至说,RMS 撰写 GPL 协议的目的就是为了让自己的 GPL 软件 emacs 可以 ...
- 使用RSA非对称密钥算法实现硬件设备授权
一.硬件设备授权 即用户在硬件设备输入一个序列号(或一个包含授权信息的文件),然后硬件设备便可正常使用. 二.授权方案 构思授权方案时,参考了下面网址的思路: http://bbs.csdn.n ...
- ipc.Client: Retrying connect to server: h1/192.168.1.61:9000. Already tried 0 time(s);解决方法
1.检查namenode服务器的是否运行正常,我的问题是没有开启hadoop集群出现的. 2.检查namenode服务器的防火墙是否开放的响应端口,一般内网建议关闭.
- CentOS下MySQL 5.7.9编译安装
MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 ...
- easyui问题小记
在easyui1.4.3版本中,(其他版本不知道是不是也是这样的),绑定在datagridview上面的数据最好不要是带有特殊符号的字段,不然会导致部分的属性不好用,比如这样的字段 START_DA ...