要做一个完整的录制程序,处理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 参数的值相匹配的文件,则删除它。

服务器端代码:

  1. MyVideoApp.cs
  1. public class MyVideoApp : ApplicationAdapter
  2. {
  3. public override bool AppStart(FluorineFx.Messaging.Api.IScope application)
  4. {
  5. RegisterStreamPublishSecurity(new PublishSecurity());
  6. return base.AppStart(application);
  7. }
  8. }
  1. PublishSecurity.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using FluorineFx.Messaging.Api.Stream;
  5. using FluorineFx.Messaging.Api;
  6. using FluorineFx.Context;
  7.  
  8. namespace ServiceLibrary5
  9. {
  10. public class PublishSecurity : IStreamPublishSecurity
  11. {
  12. public bool IsPublishAllowed(IScope scope, string name, string mode)
  13. {
  14. //if (!"live".Equals(mode))
  15. //{
  16. // // Not a live stream
  17. // return false;
  18. //}
  19.  
  20.  
  21. if (!"record".Equals(mode))
  22. {
  23. //不是录制流
  24.                 return false;
    }
  25.  
  26. IConnection connection = FluorineContext.Current.Connection;
  27. if (!"authenticated".Equals(connection.GetAttribute("UserType")))
  28. {
  29. // User was not authenticated
  30. return false;
  31. }
  32.  
  33. if (!name.StartsWith("testing"))
  34. return false;
  35. else
  36. return true;
  37. }
  38. }
  39. }

客户端代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  3. <mx:UIComponent id="uiBox" width="320" height="240" />
  4. <mx:Label x="371" y="222" text="Label" id="lblMessage"/>
  5. <mx:Button x="371" y="48" label="连接服务器" click="onConnect()" />
  6. <mx:Button x="371" y="94" label="开始录制" click="onStartRecord()" />
  7. <mx:Button x="371" y="136" label="停止录制" click="onStopRecord()" />
  8. <mx:Button x="371" y="180" label="播放视频" click="onPlayRecord()" />
  9.  
  10. <mx:Script>
  11. <![CDATA[
  12. private var nc:NetConnection;
  13.  
  14. private function onConnect():void
  15. {
  16. nc = new NetConnection();
  17. nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
  18. nc.connect("rtmp://localhost:8323/MyVideoRoom");
  19. nc.client = this;
  20. }
  21.  
  22. private function onNetStatus(event:NetStatusEvent):void
  23. {
  24. if(event.info.code == "NetConnection.Connect.Success")
  25. {
  26. this.lblMessage.text = "连接服务器成功";
  27. }
  28. else
  29. {
  30. this.lblMessage.text = "连接服务器失败";
  31. }
  32. }
  33.  
  34. private function onStartRecord():void
  35. {
  36. if(nc)
  37. {
  38. var ns:NetStream = new NetStream(nc);
  39.  
  40. var mic:Microphone = Microphone.getMicrophone();
  41. var camera:Camera = Camera.getCamera();
  42.  
  43. ns.attachAudio(mic);
  44. ns.attachCamera(camera);
  45.  
  46. ns.publish("demo001","record");
  47. this.lblMessage.text = "录制中……";
  48. }
  49. }
  50.  
  51. private function onStopRecord():void
  52. {
  53. if(nc)
  54. {
  55. nc.close();
  56. this.lblMessage.text = "已停止录制";
  57. }
  58. }
  59.  
  60. private function onPlayRecord():void
  61. {
  62. nc = new NetConnection();
  63. nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus2);
  64. nc.connect("rtmp://localhost:8323/MyVideoRoom");
  65. }
  66.  
  67. private function onNetStatus2(event:NetStatusEvent):void
  68. {
  69. if(event.info.code == "NetConnection.Connect.Success")
  70. {
  71. var ns:NetStream = new NetStream(nc);
  72.  
  73. var video:Video = new Video();
  74. video.attachNetStream(ns);
  75. this.uiBox.addChild(video);
  76.  
  77. ns.play("demo001");
  78. }
  79. }
  80. ]]>
  81. </mx:Script>
  82. </mx:Application>

利用FluorineFX录制音频与视频的更多相关文章

  1. 使用PYaudio录制音频和视频(自己)

    参考:https://blog.csdn.net/zhaoyun_zzz/article/details/84341801 音频录制:简洁版 import pyaudioimport waveimpo ...

  2. 【Android】20.0 第20章 音频、视频、拍照、语音合成

    分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 Android提供了常见的多媒体文件编码.解码机制,你可以直接调用Android提供的API,实现相册.播放器.录 ...

  3. Android录制音频的三种方式

    对于录制音频,Android系统就都自带了一个小小的应用,可是使用起来可能不是特别的灵活.所以有提供了另外的俩种. 下边来介绍下这三种录制的方式; 1.通过Intent调用系统的录音器功能,然后在录制 ...

  4. 利用FFmpeg玩转Android视频录制与压缩(二)<转>

    转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...

  5. 使用 Xbox Game 录制桌面视频(录制音频)

    使用 Xbox Game 录制桌面视频(附带音频) 前言:可能自己音频输出的问题,一直无法用工具录制桌面的音频,而最后发现利用 Xbox Game 录制游戏视频的功能很好地解决我们的问题. 1)打开游 ...

  6. Java 利用缓冲字节流来实现视频、音频、图片的复制粘贴

    InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位). OutputSteam:继承自OutputStream的流都是程序用于向外输出数据的, ...

  7. iOS音频与视频的开发(二)- 使用AVAudioRecorder进行录制音频

    1.使用AVAudioRecorder录制视频 AVAudioRecorder与AVAudioPlayer类似,它们都属于AVFoundation的类.AVAudioRecorder的功能类似于一个录 ...

  8. Windows Store App 音频和视频

    在Windows应用商店应用中提供了MediaElement控件,该控件能为应用提供音频和视频播放功能.就像之前提到的,虽然在多媒体应用开发中,开发人员可以自行开发一套音频.视频编解码规范和开发媒体播 ...

  9. 使用HTML 5捕捉音频与视频信息

    长期以来,音频与视频信息的捕捉一直是Web开发中的一个难点.许多年来,我们一直依赖浏览器插件来实现这个需求. 在HTML 5中,出现了许多可以访问硬件设备的API,例如访问GPS设备的Geolocat ...

随机推荐

  1. kali工具学习

    使用前的准备 开启/关闭 HTTP服务 Service apache2 start/stop 自动启动HTTP服务:update-rc.d apache2 defaults 开启/关闭 mysql S ...

  2. Linux 通过YUM安装rzsz

    yum自动安装: yum install lrzsz

  3. cmd命令 chcp

    chcp是“change code page”的缩写.(关于代码页的相关知识详见:http://www.cnblogs.com/minisculestep/articles/4920992.html)

  4. 积累PDU

    PDU,即专业发展单元PDUs(Professional Development Units)用来量化PMP所参与的学习和专业服务活动.典型情况下,每个小时所进行的有计划的.系统的学习或专业活动可获得 ...

  5. configsections規範配置信息

    對於小型項目,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 1 ...

  6. 遵守GPL的开源软件能用于商用吗?

    遵守GPL的开源软件能用于商用吗? 比较经典的开源协议有 GPL,BSD 等等. GPL 软件可以用于商业用途,甚至说,RMS 撰写 GPL 协议的目的就是为了让自己的 GPL 软件 emacs 可以 ...

  7. 使用RSA非对称密钥算法实现硬件设备授权

    一.硬件设备授权 即用户在硬件设备输入一个序列号(或一个包含授权信息的文件),然后硬件设备便可正常使用.    二.授权方案 构思授权方案时,参考了下面网址的思路: http://bbs.csdn.n ...

  8. ipc.Client: Retrying connect to server: h1/192.168.1.61:9000. Already tried 0 time(s);解决方法

    1.检查namenode服务器的是否运行正常,我的问题是没有开启hadoop集群出现的. 2.检查namenode服务器的防火墙是否开放的响应端口,一般内网建议关闭.

  9. CentOS下MySQL 5.7.9编译安装

    MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 ...

  10. easyui问题小记

    在easyui1.4.3版本中,(其他版本不知道是不是也是这样的),绑定在datagridview上面的数据最好不要是带有特殊符号的字段,不然会导致部分的属性不好用,比如这样的字段  START_DA ...