Red5下的room
http://blog.csdn.net/whycold/article/details/6142475
package com.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.service.IServiceCapableConnection;
import org.red5.server.api.Red5;
public class RoomApplication extends ApplicationAdapter{
private static HashMap<String,IScope> scopeMap = new HashMap<String,IScope>();
private static HashMap<String,List> userMap = new HashMap<String,List>();
private static HashMap<String,String> videoMap = new HashMap<String,String>();
@Override
public boolean roomConnect(IConnection conn, Object[] arg1) {
// TODO Auto-generated method stub
String userName = arg1[0].toString();
String roomName = arg1[1].toString();
if(userMap.containsKey(roomName)){
List list = userMap.get(roomName);
list.add(userName);
}else{
List<String> list = new ArrayList<String>();
list.add(userName);
userMap.put(roomName, list);
}
conn.getClient().setAttribute("userName", userName);
return super.roomConnect(conn, arg1);
}
@Override
public void roomDisconnect(IConnection client) {
// TODO Auto-generated method stub
super.roomDisconnect(client);
}
@Override
public boolean roomJoin(IClient client, IScope s) {
// TODO Auto-generated method stub
System.out.println("room join" + s.getName());
updateUserList(s.getName());
String roomName = s.getName();
String userName = client.getAttribute("userName").toString();
sendVideo(userName,roomName);
return super.roomJoin(client, s);
}
public void sendVideo(String userName,String roomName){
if(videoMap.containsKey(roomName)){
System.out.println("我要拿视频啦");
IScope s = scopeMap.get(roomName);
System.out.println(s);
Iterator <IConnection>iterator = scope.getConnections();
while(iterator.hasNext()){
System.out.println("connection");
IConnection conn = iterator.next();
if(conn.getClient().getAttribute("userName").toString().equalsIgnoreCase(userName)){
if (conn instanceof IServiceCapableConnection)
{
//转发消息
System.out.println("conn====" + conn);
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("netStream", new Object[]{videoMap.get(roomName)});
}
}
}
}
}
@Override
public void roomLeave(IClient client, IScope s) {
// TODO Auto-generated method stu
String userName = client.getAttribute("userName").toString();
String roomName = s.getName();
List list = userMap.get(roomName);
list.remove(userName);
updateUserList(roomName);
if(videoMap.containsKey(roomName)){
if(videoMap.get(roomName).toString().equalsIgnoreCase(userName)){
videoMap.remove(roomName);
}
}
super.roomLeave(client, s);
}
@Override
public boolean roomStart(IScope s) {
// TODO Auto-generated method stub
System.out.println("room start" + s.getName());
scopeMap.put(s.getName(), s);
return super.roomStart(s);
}
@Override
public void roomStop(IScope s) {
// TODO Auto-generated method stub
scopeMap.remove(s.getName());
System.out.println("房间彻底关闭了");
super.roomStop(s);
}
public void sendToRoom(String msg,String roomName,String userName,String toUserName){
IScope scope = scopeMap.get(roomName);
Iterator <IConnection>iterator = scope.getConnections();
while(iterator.hasNext()){
IConnection conn = iterator.next();
String connUserName = conn.getClient().getAttribute("userName").toString();
if (conn instanceof IServiceCapableConnection)
{
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
if("all".equalsIgnoreCase(toUserName)){
//转发消息
String str = userName + "说:"+msg;
sc.invoke("sendToRoom", new Object[]{str});
}else if(connUserName.equalsIgnoreCase(userName)){
String str = "你对" + toUserName + "说:"+msg;
sc.invoke("sendToRoom", new Object[]{str});
}else if(connUserName.equalsIgnoreCase(toUserName)){
String str = userName + "对你说:"+msg;
sc.invoke("sendToRoom", new Object[]{str});
}
}
}
}
public void updateUserList(String roomName){
System.out.println("send userlist==" + roomName);
List list = userMap.get(roomName);
System.out.println("有"+list.size()+"个子");
IScope s = scopeMap.get(roomName);
System.out.println(s);
Iterator <IConnection>iterator = scope.getConnections();
while(iterator.hasNext()){
System.out.println("connection");
IConnection conn = iterator.next();
if (conn instanceof IServiceCapableConnection)
{
//转发消息
System.out.println("conn====" + conn);
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("updateList", new Object[]{list});
}
}
}
public void playVideo(String userName,String roomName){
IScope scope = scopeMap.get(roomName);
videoMap.put(roomName, userName);
Iterator <IConnection>iterator = scope.getConnections();
while(iterator.hasNext()){
IConnection conn = iterator.next();
if (conn instanceof IServiceCapableConnection)
{
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("netStream", new Object[]{userName});
}
}
}
public void escVideo(String roomName){
IScope scope = scopeMap.get(roomName);
videoMap.remove(roomName);
Iterator <IConnection>iterator = scope.getConnections();
while(iterator.hasNext()){
IConnection conn = iterator.next();
if (conn instanceof IServiceCapableConnection)
{
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("escVideo", new Object[]{});
}
}
}
public void checkVideo(String userName,String roomName){
System.out.println("checkVideo");
IScope scope = scopeMap.get(roomName);
Iterator <IConnection>iterator = scope.getConnections();
while(iterator.hasNext()){
IConnection conn = iterator.next();
String connUserName = conn.getClient().getAttribute("userName").toString();
System.out.println("conUserName");
if(userName.equalsIgnoreCase(connUserName)){
if (conn instanceof IServiceCapableConnection)
{
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
if(videoMap.containsKey(roomName)){
sc.invoke("canNotVideo", new Object[]{});
}else{
System.out.println("canvideo");
sc.invoke("canVideo", new Object[]{});
}
}
}
}
}
}
mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="con()">
<mx:Script>
<![CDATA[
import mx.events.ListEvent;
import flash.utils.flash_proxy;
import mx.core.UIComponent;
import mx.messaging.AbstractConsumer;
import mx.collections.ArrayCollection;
import flash.events.*;
import flash.media.Video;
import flash.net.*;
import flash.external.ExternalInterface;
[Bindable]
private var net:NetConnection;
import mx.controls.Alert;
private var username:String;
private var roomname:String;
[Bindable]
private var arrayCon:ArrayCollection;
[Bindable]
private var comboArrayCon:ArrayCollection;
var ns:NetStream;
var nsPlay:NetStream;
public function con():void{
//chat.addEventListener(Event.ENTER_FRAME,onEnterFrame);
username = parameters.name;
roomname = parameters.roomname;
//username="22";
//roomname="11";
if(comboArrayCon==null){
comboArrayCon = new ArrayCollection();
}
comboArrayCon.addItem("all");
//Alert.show(username,roomname);
l.text = "您在"+roomname+"聊天室里!";
if(net==null){
net = new NetConnection();
net.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
net.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncError);
net.connect("rtmp://192.168.1.32/mychat/"+roomname+"/",username,roomname);
net.client = this;
}
}
private function onAsyncError(event:AsyncErrorEvent):void{
trace("asyncerror");
}
private function onEnterFrame(event:Event):void{
}
public function netStatus(event:NetStatusEvent):void{
trace(event.info.code);
switch(event.info.code){
case "NetConnection.Connect.Success":
ns = new NetStream(net);
var mic:Microphone = Microphone.getMicrophone();
mic.setUseEchoSuppression(true);
mic.setSilenceLevel(0);
ns.attachAudio(mic);
try{
var cam:Camera = Camera.getCamera();
cam.setMode(271,241,15);
cam.setQuality(144000,85 );
ns.attachCamera(cam);
}catch(error:Error){
trace(error);
}
getVideo();
break;
}
}
protected function image1_clickHandler(event:MouseEvent):void
{
ExternalInterface.call("geturl");
}
private function onEnterClick(event:KeyboardEvent):void{
if(event.keyCode==13){
sendMsg();
}
}
private function onSendClick(event:Event):void{
sendMsg();
}
private function sendMsg():void{
if(msg.text==""){
Alert.show("请输入内容!");
}else{
net.call("sendToRoom",null,msg.text,roomname,username,o.selectedItem);
msg.text = "";
this.setFocus();
this.focusManager.setFocus(msg);
msg.setSelection(0,0);
}
}
public function sendToRoom(str:String):void{
c.text = c.text + str+"/n";
this.focusManager.setFocus(msg);
}
public function updateList(user:String):void{
try{
trace("update");
var arr:Array;
if(user==""){
arr = new Array();
}else{
arr = user.split(",");
}
arrayCon = new ArrayCollection(arr);
}catch(err:Error){
trace(err);
}
}
protected function userlist_itemClickHandler(event:ListEvent):void
{
if(!comboArrayCon.contains(userlist.selectedItem)){
comboArrayCon.addItem(userlist.selectedItem);
o.selectedIndex = comboArrayCon.length;
}else{
o.selectedIndex = comboArrayCon.getItemIndex(userlist.selectedItem);
}
}
private function oLabel(object:Object):String{
return object.toString();
}
public function netStream(name:String):void{
nsPlay = new NetStream(net);
nsPlay.play(name);
var video:Video = new Video(v.width,v.height);
v.addChild(video);
video.attachNetStream(nsPlay);
video.width = v.width;
video.height = v.height;
}
public function playVideo():void{
net.call("checkVideo",null,username,roomname);
}
public function getVideo():void{
net.call("sendVideo",null,username,roomname);
}
public function canVideo():void{
ns.publish(username);
w.enabled = false;
s.enabled = true;
net.call("playVideo",null,username,roomname);
}
public function canNotVideo():void{
Alert.show("有人抢先啦,慢慢等吧");
}
public function escVideo():void{
trace("escvideo");
nsPlay.close();
w.enabled = true;
s.enabled = false;
}
]]>
</mx:Script>
<mx:Label width="168" id="l"/>
<mx:TextArea width="472" height="239" id="c" editable="false" x="5" y="26"/>
<mx:TextInput x="67" y="273" width="335" id="msg" keyUp="onEnterClick(event)"/>
<mx:List x="484" y="24" width="122" height="241" id="userlist" dataProvider="{arrayCon}" itemClick="userlist_itemClickHandler(event)"/>
<mx:ComboBox x="-1" y="273" editable="false" width="60" id="o" dataProvider="{comboArrayCon}" />
<mx:Button x="414" y="273" label="send" width="63" id="send" click="onSendClick(event)"/>
<mx:Button x="485" y="273" label="我要视频" click="playVideo()" id="w"/>
<mx:VideoDisplay x="623" y="24" width="271" height="241" id="v"/>
<mx:Button x="563" y="273" label="不视频了" click="net.call('escVideo',null,roomname)" enabled="false" id="s"/>
</mx:Application>
Red5下的room的更多相关文章
- red5下nginx安装配置
http://zfl110.iteye.com/blog/1155149 原址:http://lqw.iteye.com/blog/652763 安装Nginx 1.首先安装pcre-8.02.tar ...
- C++程序结构---1
C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...
- CentOS下Red5安装
Red5介绍 Red5是一个采用Java开发开源的Flash流媒体服务器.它支持:把音频(MP3)和视频(FLV)转换成播放流: 录制客户端播放流(只支持FLV):共享对象:现场直播流发布:远程调用. ...
- Windows环境搭建Red5流媒体服务器指南
Windows环境搭建Red5流媒体服务器指南 测试环境:Windows 7 一. 下载安装程序 red5-server 下载地址 https://github.com/Red5/red5-ser ...
- Red5 1.0.0RC1 集成到tomcat6.0.35中运行&部署新的red5项目到tomcat中
1.下载red5-war-1.0-RC1.zip 解压之得到 ROOT.war 文件. 2.处理tomcat. 下载apache-tomcat-6.0.35-windows-x86.zip包,解压到你 ...
- ubuntu12.04server下red5-1.0.0RC1的部署
一.搭建环境 Linux版本:ubuntu12.04sever 64位 Java 版本:Java 1.7(jdk+jre) Red5 版本:red5-1.0.0-RC1 二.安装JDK 下载jdk ...
- ubuntu16.04部署RED5流媒体服务器
前提:jdk已经安装 1,下载RED5(https://github.com/Red5/red5-server/releases)选择red5-server-X.X.X-MXX.tar.gz 2,解压 ...
- 开源代码Window下搭建rtmp流媒体服务器
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综合:有这样需求,将摄像头 ...
- android + red5 + rtmp
背景:在已有的red5服务器环境下实现android客户端的视频直播 要实现客户端视频直播就先先对服务器端有所了解 Red5流媒体服务器是Adboe的产品,免费并且是开源的,与Flash搭配的时候可谓 ...
随机推荐
- (三)C#关于txt文件的读取和写入
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- [转载]深入理解JAVA的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- px,dp,sp单位转换工具类
在layout中使用dp 在代码中getWidth系列得到的是px 设置字体大小时使用的是sp /** * Android大小单位转换工具类 */ public class PxDpSpUtil { ...
- toad for sqlserver5.7
toad for sqlserver5.7 虽然SSMS很好很强大,不过有时候使用一些第三方工具可以使MSSQL DBA们更加的方便管理MSSQL toad for sqlserver5.7就是这样一 ...
- Android开发之onActivityResult()中的resultCode为0,intent为null的解决办法
BUG:昨天在使用activity之间传值的时候,遇到了一个bug,该bug为:Activity A启动Activity B,然后在Activity B中取到一个值,并通过back键返回到Activi ...
- 设置COOKIE过期时间的方法
第一,日期运算法 1)将期限设置为当前日期后的第N天的0时0分0秒 Response.Cookies(LastView).Expires=dateadd(d,N,date) 2)将期限设置为当前日期后 ...
- 好!recover-binary-search-tree(难)& 两种好的空间O(n)解法 & 空间O(1)解法
https://leetcode.com/mockinterview/session/result/xyc51it/https://leetcode.com/problems/recover-bina ...
- Relativelayout属性
// 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上; android:layout_below 将该控件的底部置于给定ID的控件之下; andro ...
- BZOJ 2194 快速傅里叶之二
fft. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...
- jvm内部现成运行
hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据. 前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来 ...