利用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>
时间: 2024-08-01 22:37:18

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

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

参考:https://blog.csdn.net/zhaoyun_zzz/article/details/84341801 音频录制:简洁版 import pyaudioimport waveimport timeimport sys CHUNK = 1024FORMAT = pyaudio.paInt16CHANNELS = 2RATE = 44100RECORD_SECONDS = 5000WAVE_OUTPUT_FILENAME = "output.wav" p = pyaudi

【Android】20.0 第20章 音频、视频、拍照、截图

分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 Android提供了常见的多媒体文件编码.解码机制,你可以直接调用Android提供的API,实现相册.播放器.录音.摄像等功能.换言之,你可以通过Activity和Intent,直接访问各种多媒体文件或流数据(本地媒体文件.外部存储文件.资源文件.URL指定的音频视频网络流). 本章要点: l 音频和视频播放:MediaPlayer类. l 播放视频播放:MediaPlayer类.MediaControlle

利用FFmpeg玩转Android视频录制与压缩(二)&lt;转&gt;

转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女票已经分了又合,合了又分,本屌依旧骄傲单身.上一次啊我们大致说了一些简单的FFmpeg命令以及Java层简单的调用方式,然后有很多朋友在github或者csdn上给我留言,很多时候我都选择避而不答,原因是本库以前用的so包是不开源的,我根本改不了里面东西.但是这一次啊我们玩点大的,我重新编译了FFm

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

1.使用AVAudioRecorder录制视频 AVAudioRecorder与AVAudioPlayer类似,它们都属于AVFoundation的类.AVAudioRecorder的功能类似于一个录音器,使用AVAudioRecorder录制音频十分简单,当程序控制AVAudioRecorder对象创建完成之后,可以调用AVAudioRecorder的如下方法进行录制. 1.prepareToRecord:准备开始录制.调用record方法时,如果音频还没有准备好,程序会隐式先执行该方法. 2

音频、视频框架概括说明

一.音频基础知识: 1.音频文件的组成:文件格式+音频编码,文件格式用于形容文件本身的格式,音频编码是通过不同编码格式编码后得到的音频数据. 2.音频质量的标准:声卡对声音的处理质量可以用三个基本参数来衡量,即采样频率.采样位数和声道数.采样频率是指单位时间内的采样次数,采样频率越大,采样点之间的间隔就越小,数字化后得到的声音就越逼真.采样位数是记录每次采样值数值大小的位数,采样位数通常有8bits和16bits两种,采样位数越大,所能记录声音的变化度越细腻,相应的数据量就越大.声道数是指处理的

插入音频、视频

三种 分别用<bgsound />.<embed>和<video>标签,当用<embed><video>插入背景音乐时可以设置宽度和高度为0,隐藏播放器,在这里重点说前两者. ■ <bgsound>:<bgsound> 是用来插入背景音乐,但只适用于 ie,其参数设定不多.如下<bgsound src="your.mid" autostart=true loop=infinite>src=&

利用FFMPEG简单分离音视频数据流

上一篇文章我们搭好了环境并编译出所需的ffmpeg库,本篇我们讨论如何利用ffmpeg提供的API函数进行多媒体文件的解封装(demux)过程.在讲解之前,我们需要了解一些基本的多媒体文件知识,大虾请飘过. 容器格式:不管是音频文件还是视频格式的文件,都是一个多媒体的容器,即container,比如常见的视频容器格式有avi.mp4.mkv.flv.rm/rmvb.mov.ts.vob.dat,音频容器格式有MP3.WAV.AAC.APE,FLAC等等,它容纳了视频.音频.字幕(subtitle

笔记- iphone手机音频AAC视频H264推流(一) iphone手机推流最佳方案

这几个月一直在做iphone手机音视频的东西,由于个人比较懒,所以一直没整理,现在闲的蛋疼,并且以后项目要搁置了,在这里记录一下我做的iphone手机推流的东西. 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1    功能概况 *  实现音视频的数据的采集 *  实现音视频数据的编码,视频编码成h264,音频编码成aac *  实现音视频数据的发布,将编码好的音视频数据传输到服务器 2 视频和音频编码方案 视频硬编码需要使用AVAssetWriter,但是他只支持直接将数据编

可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK

LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SDK,通过一些不同的配置来创建一些客户端/服务器应用程序.例如,如果有一个服务器需要向多个客户端发送音频/视频数据,那么就可以在服务器上创建这样的应用程序,比如多点传送或Web广播中的web多点传播.此外,当有多个捕捉点向一个源发送视频数据时,您可以创建安全/监控应用程序. 产品特征: 视频会议二进制