(转)red5视频聊天源码

构建Red5+Android直播系统:服务端架构与客户端开发实战 本文还有配套的精品资源,点击获取 简介:本压缩包提供了构建基于Android的直播系统所需的关键组件和服务端代码。涵盖了Red5流媒体服务器的配置、Android客户端的开发,以及服务器与客户端的交互。包括了服务器端代码、Android应用源码、配置文件、测试数据和相关文档。本工程需要开发者具备Android编程、网络通信、流媒体处理及服务器运维等知识。 1. R... 阅读详情

忙了好几天,最近也算把Red5服务器服务端基本搞定了。
    为了熟悉服务端代码,以及了解API,我仿照着FMS的模式做了一个多人聊天室。基本实现了视频、群聊、私聊几个基本功能。看到网上似乎还没有人放出这类的源代码,我索性就先当回螃蟹吧!
  我们先来看代码:
  服务端:
  Application.java
  

package org.jerry.videochat;

import java.util.*;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.service.IServiceCapableConnection;
import org.red5.server.api.so.ISharedObject;

public class Application extends ApplicationAdapter {
// 属性
private IScope appScope;

private String username;

private ISharedObject listSO;

private ISharedObject msgSO;

private Map<String, IConnection> onLineClient = new HashMap<String, IConnection>();

// 方法
// 此应用开始运行时触发的方法
public boolean appStart(IScope app) {
   if (!super.appStart(app)) {
    return false;
   }
   appScope = app;
   return true;
}

// 客户端连接的时候触发的方法
public boolean appConnect(IConnection conn, Object[] params) {
   username = (String) params[0];
   // 登入时将连接ID和连接信息形成对应关系并存入在线列表
   String link_id = conn.getClient().getId();
   onLineClient.put(username, conn);
   // 为用户列表共享对象添加属性
   // 创建用户列表共享对象
   listSO = getSharedObject(appScope, "listSO", false);
   // 创建用户聊天内容共享对象
   msgSO = getSharedObject(appScope, "msgSO", false);
   listSO.setAttribute(link_id, username);
   return true;
}

// 广播消息
public void broadcastUserMsg(String msg) {
   // 公聊
   // 刷新共享对象属性
   msgSO.setAttribute("msg", msg);
}

// 私聊信息
public void msgFromPrivate(String msg, String from, String to) {
   IServiceCapableConnection fc = (IServiceCapableConnection) onLineClient
     .get(from);
   IServiceCapableConnection tc = (IServiceCapableConnection) onLineClient
     .get(to);
   fc.invoke("showMsgByPrivate", new Object[] { msg });
   tc.invoke("showMsgByPrivate", new Object[] { msg });
}

// 用户断开连接的时候触发
public void appDisconnect(IConnection conn) {
   String dis_link_id = conn.getClient().getId();
   String user = (String) listSO.getAttribute(dis_link_id);
   // 根据ID删除对应在线纪录
   onLineClient.remove(user);
   // 删除用户列表共享对象的对应属性
   listSO.removeAttribute(dis_link_id);
}
}

  客户端代码:

  videoChat.as

package
{
import fl.controls.Button;
import fl.controls.List;
import fl.controls.TextArea;
import fl.controls.TextInput;
import fl.data.DataProvider;
import fl.managers.StyleManager;
import flash.display.Sprite;
import flash.events.AsyncErrorEvent;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.events.SyncEvent;
import flash.media.Camera;
import flash.media.Microphone;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.SharedObject;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.ui.Keyboard;

/**
* ... Red5 视频聊天 ...
* @author Jerry
*/
public class videoChat extends Sprite {
   //属性
   private var IP:String;
   private var redPath:String;
   private var nc:NetConnection;
   private var ns:NetStream;
   private var ns2:NetStream;
   private var cam:Camera;
   private var mic:Microphone;
   private var listSO:SharedObject;
   private var msgSO:SharedObject;
   private var userArr:Array;
   private var sendMsg:String;
   private var now:Date;
   private var userIDObj:Object;

   //构造函数
   public function videoChat() {
    _init();       //初始化
    _setComponentStyle();    //设置组件样式
    _startConnect();     //开始连接服务器
   }

   //初始化
   private function _init() {
    IP = "192.168.0.10";
    redPath = "rtmp://" + IP + "/videoChat";
    nc = new NetConnection();
    from.text = "guest" + int(Math.random() * 1000);
    to.text = "所有人";
    now = new Date();
   }

   //设置组件样式
   private function _setComponentStyle() {
    var myTF:TextFormat = new TextFormat();
    myTF.size = 12;
    myTF.font = "雅黑宋体";
    StyleManager.setStyle("textFormat", myTF);
   }

   //开始连接
   private function _startConnect() {
    nc.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler);
    nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _securityHandler);
    nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler);
    nc.connect(redPath, from.text);
    nc.client = this;
   }

   //状态监听
   private function _statusHandler(evt:NetStatusEvent) {
    if (evt.info.code == "NetConnection.Connect.Success") {
     chatCon.text += "连接成功!/n";
     _scrollToEnd();
     _publishVideo();     //发布自己的视频
     _setListSO();      //创建用户列表共享对象
     _setMsgSO();      //创建发言信息共享对象
     sendBtn.addEventListener(MouseEvent.CLICK, _sendBtnByClick);   //单击发送信息
     stage.addEventListener(KeyboardEvent.KEY_DOWN, _sendBtnByKey);     //回车发送信息
    }
    if (evt.info.code == "NetConnection.Connect.Failed") {
     chatCon.text += "连接失败!/n";
     _scrollToEnd();
    }
    if (evt.info.code == "NetConnection.Connect.Closed") {
     chatCon.text += "连接关闭!/n";
     _scrollToEnd();
    }
   }

   //安全性监听
   private function _securityHandler(evt:SecurityError) {
    chatCon.text += "安全性错误!/n";
    _scrollToEnd();
   }

   //异步错误
   private function _asyncHandler(evt:AsyncErrorEvent) {
    chatCon.text += "异步错误!/n";
    _scrollToEnd();
   }

   //发布自己的视频
   private function _publishVideo() {
    ns = new NetStream(nc);
    cam = Camera.getCamera();
    mic = Microphone.getMicrophone();
    liveVideo.attachCamera(cam);
    ns.client = this;
    ns.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler);
    ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler);
    ns.attachCamera(cam);
    ns.attachAudio(mic);
    ns.publish(from.text, "live");
    whoseVideo.text = from.text + "的视频";
   }

   //创建用户列表共享对象
   private function _setListSO() {
    listSO = SharedObject.getRemote("listSO", nc.uri, false);
    listSO.connect(nc);
    listSO.addEventListener(SyncEvent.SYNC, _listSOSyncHandler);
   }

   //创建发言信息共享对象
   private function _setMsgSO() {
    msgSO = SharedObject.getRemote("msgSO", nc.uri, false);
    msgSO.addEventListener(SyncEvent.SYNC, _msgSOSyncHandler);
    msgSO.connect(nc);
   }

   //用户列表共享对象被更新之后事件
   private function _listSOSyncHandler(evt:SyncEvent) {
    _showUserList();     //更新用户列表
    //用户列表添加鼠标事件
    userList.addEventListener(MouseEvent.CLICK, _updateChatTo);
    userList.addEventListener(MouseEvent.DOUBLE_CLICK, _updateVideoShow);
   }

   //发言信息共享对象被更新之后事件
   private function _msgSOSyncHandler(evt:SyncEvent) {
    //更新聊天内容
    for (var i in msgSO.data) {
     chatCon.htmlText += msgSO.data[i];
    }
   }

   //更新用户列表
   private function _showUserList() {
    userArr = new Array();
    //用户数组更新
    for (var tmp in listSO.data) {
     userArr.push(listSO.data[tmp]);
    }
  
  
    //添加DataProvider
    var tmpDP:DataProvider = new DataProvider();
    for (var i = 0; i < userArr.length; i++ ) {
     tmpDP.addItem( { label:userArr[i] } );
    }
    //名称排序
    tmpDP.sortOn("label");
    //在用户列表顶端加一个“所有人”
    tmpDP.addItemAt( { label:"所有人" }, 0);
    //将数组添加到列表中显示出来
    userList.dataProvider = tmpDP;
   }

   //更新聊天对象
   private function _updateChatTo(evt:MouseEvent) {
    to.text = userList.selectedItem.label;
   }

   //更新视频显示和视频文本显示
   private function _updateVideoShow(evt:MouseEvent) {
    ns2 = new NetStream(nc);
    if (from.text == to.text) {
     //显示我的视频
     ns2.close();
     liveVideo.clear();
     whoseVideo.text = "我的视频";
     liveVideo.attachCamera(cam);
    }
    else {
     //显示其他人的视频
     whoseVideo.text = to.text + "的视频";
     ns2.client = this;
     ns2.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler);
     ns2.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler);
     liveVideo.attachNetStream(ns2);
     ns2.play(to.text);
    }
   }

   //单击发送信息
   private function _sendBtnByClick(evt:MouseEvent) {
    _sendMsg();
   }

   //回车发送信息
   private function _sendBtnByKey(evt:KeyboardEvent) {
    if (evt.keyCode == Keyboard.ENTER) {
     _sendMsg();
    }
   }


   //发送信息处理方法
   private function _sendMsg() {
    sendMsg="<font color='#ff0000'>" + from.text + "</font>" + " 对 " + "<font color='#ff0000'>" + to.text + "</font>" + " 说 " + "(" + "<font color='#0000ff'>" + now.getHours() + ":" + (now.getMinutes() < 10?"0" + now.getMinutes():now.getMinutes()) + ":" + (now.getSeconds() < 10?"0" + now.getSeconds():now.getSeconds()) + "</font>" + ")" + ":" +"/t" + msgInput.text + "/n";
  
    if (from.text == to.text) {
     //禁止对自己发言
     chatCon.text += "对不起,您不能对自己发言!";
     _scrollToEnd();
    }
    else if(msgInput.text==""){
     //发言不能为空
     chatCon.text += "请在下面的文本框中输入发言内容!";
     _scrollToEnd();
    }
    else if (to.text == "所有人") {
     //调用服务端广播方法
     nc.call("broadcastUserMsg", null, sendMsg);
     msgInput.text = "";
    }
    else {
     //私聊
     nc.call("msgFromPrivate", null, sendMsg, from.text, to.text);
     msgInput.text = "";
    }
   }

   //将滚动条滚动到最底端
   private function _scrollToEnd() {
    chatCon.verticalScrollPosition = chatCon.maxVerticalScrollPosition;
   }

   //私聊方法(被服务端调用)
   public function showMsgByPrivate(_msg:String) {
    chatCon.htmlText += _msg;
    _scrollToEnd();
   }
}

}
视频语音聊天源码 视频语音聊天源码,值得大家学习的一个综合应用例子! 全部是 无窗口实现,对底层框架也可以深入了解起来! 立即下载

相关推荐

视频聊天室的源代码 可以多人

视频聊天室的源代码 想要研究的朋友期待你的下载 可以多人聊天 无需下载插件 直接在线即可进行聊天

【游戏开发实战】Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(附源码 | Mirror | 多人视频 | 详细教程)

【游戏开发实战】Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(Mirror | 多人视频 | 清晰度切换)

linxinfa的专栏 1万+

某视频聊天室源码-服务端+客户端+网站程序

某视频聊天室源码-服务端+客户端+网站程序 比较实用

实现Linux 视频聊天、远程桌面(源码,支持信创环境,可与Windows版、安卓版互通)

本文讲述如何实现跨平台的视频聊天、远程桌面/屏幕分享 系统(Windows、Linux、Android),并让其支持在国产操作系统(如银河麒麟,统信UOS)和国产CPU(如鲲鹏、龙芯、海光、兆芯、飞腾等)上运行 。

zhuweisky 3290

【联邦学习】联邦平均(FedAvg)_附pytorch代码实现

其他代码包括1)数据集划分;2)训练;3)保存结果;4)绘图都可在 https://github.com/kt4ngw/fedavg-pytorch 找到。如果您对文章有建议及指定,也欢迎您留言评论,作者定当虚心修正。

kt4ngw的博客 5110

阿里云天池大数据长期赛:金融风控-贷款违约预测(含代码)

本次比赛让自己在大数据的处理流程上有了更明确的认知,从数据清洗、特征工程、数据建模,每一个过程都能学到很多经验和知识,值得去历练。

weixin_46685991的博客 1万+

实现一个简单的视频聊天室(源码)

       在 《实现一个简单的语音聊天室》一文发布后,很多朋友建议我也实现一个视频聊天室给他们参考一下,其实,视频聊天室与语音聊天室的原理是差不多的,由于加入了摄像头、视频的处理,逻辑会繁杂一些,本文就实现一个简单的多人视频聊天系统,让多个人可以进入同一个房间进行语音视频沟通。先看看3个人进行视频聊天的运行效果截图:             上面两张截图分别是:登录界面、标注了各个控件的视...

weixin_34054931的博客 1898

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)

PacketTracer软件内MCU芯片编程入门 零基础

ChloeMax_的博客 9455

实现Android屏幕分享和视频聊天(附源码)

在一些有人际互动的手机APP中,增加语音视频聊天功能是一个常见的需求。而现在,更进一步,在某些场景下,我们需要能将自己的手机屏幕分享给他人,或者是观看他人的手机屏幕。那么,这些常见的功能是如何实现的了?

zhuweisky 2699

【技术解析】华为智算中心:昇腾AI算力与无损网络如何驱动大模型训练

本文深入解析了华为智算中心如何通过昇腾AI算力与超融合以太无损网络的协同,驱动千亿参数大模型的高效训练。昇腾NPU提供专用计算引擎,而基于RoCE的无损网络则通过PFC、ECN等技术确保万卡集群间的高带宽、零丢包通信,实现算力利用率最大化,解决大规模AI训练的核心瓶颈。

weixin_29311017的博客 193

Keil MDK v6迁移指南:从AC5到AC6的编译器升级与工程适配

编译器是嵌入式开发的底层基石,决定了代码的执行效率与工程的可维护性。随着ARM工具链向LLVM/Clang架构演进,Arm Compiler 6(AC6)正逐步取代经典的AC5,成为Keil MDK的核心编译引擎。AC6在C11标准支持、代码优化、诊断信息及LTO链接优化上全面超越AC5,但迁移过程中往往伴随内联汇编重写、类型检查严格化、库兼容性等问题。理解编译器差异、掌握CMSIS-Toolbox的工程描述机制,能帮助嵌入式工程师在Cortex-M系列项目中平滑过渡。本文结合Cortex-M4量产工程实战

weixin_29189363的博客 237

C# 实现 Linux 视频聊天、远程桌面(源码)

前言之前文章有朋友在下载并了解了《C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)》中提供的源码后,留言给我说,这个视频会议有点复杂了,代码比较多,看得有些费劲。问我能不能整个简单点的Demo,只要有视频聊天和远程桌面的功能就可以。于是,我就又写了一个Demo来供大家参考,它可以在Windows和Linux(包括国产OS,如银河麒麟、统信UOS、深度Deepin等)上运...

weixin_68436326的博客 1421

提示词编写:从新手到专家的进阶之路

本文旨在为提示词编写者提供一条从新手到专家的进阶之路。我们将详细探讨提示词编写的背景与意义、基础与进阶技巧、实战应用以及最佳实践。通过逐步深入的分析与实操,读者将掌握提示词编写的核心要点,提高编写效率和作品质量。提示词是用于引导人工智能生成文本的关键词或短语,它包含了作者想要传达的主题、情感和细节。随着人工智能技术的普及,自动化写作工具逐渐应用于各行各业。为了提高写作效率,项目团队决定开发一款基于人工智能的自动化写作工具。成功开发了一款自动化写作工具,生成文本质量较高。

AI天才研究院 1087

red5视频聊天源码

忙了好几天,最近也算把Red5服务器服务端基本搞定了。&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt; 为了熟悉服务端代码,以及了解API,我仿照着FMS的模式做了一个多人聊天室。基本实现了视频、群聊、私聊几个基本功能。看到网上似乎还没有人放出这类的源代码,我索性就先当回螃蟹吧!&lt;br&gt;   我们先来看代码:&lt;br&gt;   &lt;span style=...

轻轻草原 253

SPSS 多重共线性问题:编程解决方案

多重共线性会导致回归模型的不稳定性,使得估计的回归系数失去解释力,降低模型的准确性和可靠性。通过执行这些代码,你将能够计算和查看VIF和CI的结果,并确定是否存在多重共线性问题。上述代码执行了一个回归分析,其中A是我们感兴趣的因变量,B、C、D和E是我们要检查的自变量。接下来,我们将执行多重共线性的检测。通过执行上述代码,你将能够看到每个自变量的VIF和CI值,以及预先设置的阈值。上述代码将计算VIF和CI的值,并将结果写入指定路径的结果文件中。接下来,我们可以使用以下代码来计算和显示VIF和CI的值。

CyberGenius的博客 1426

【DaVinci Developer工具实战】03 -导入xml文件

本文档描述了 DaVinci Developer 导入数据的的具体功能 ,它适用于导入AUTOSAR SWC 模板【AUTOSAR XML 文件】 文件。

1991

Red5 学习

Red5 学习 Red5的初次安装与配置 http://yaofeng911.iteye.com/blog/1059851  (测试可用) Red5 plugin for Eclipse V0.2的安装及配置 http://xlh1221it.blog.163.com/blog/static/129587224201032871841814/ Red5的官方网站(下载) htt...

tl_oni 228

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux下Red5安装和配置

转载于:这里 Red5安装和配置 一、Red5简介 Red5是一个采用Java开发开源的Flash流媒体服务器。它支持:把音频 (MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录 制,flash流媒体播放,在线聊天,视频会议等一些基本功能。  

dc_show的专栏 1180

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

基于java Red5服务器客户端视频聊天室搭起来了

  基于java Red5服务器客户端视频聊天室(ldfu) 开发环境: Red5(视频服务端内嵌Tomcat6),Mina(高性能  socket通讯框架), Flash(Flex) Builder4,Myeclipse8.0,java sdk6.0   一.先看看客户端的界面,呵呵。  (1)Flash Buidler开发原型图   (2)全屏图:     (3)UI部分源码...

醉翁蜗居 746

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Red5 流媒体服务器 的使用(开发)

1. 什么是Red5. Red5是一个开源项目,用于实现flash与服务器端之间通过rtmp(real time messaging protocal)协议通信,可以实现视频、音频的传输,remote shared object等等。相对于FMS, Red5是免费、开源的。 2. 环境搭建(用Tomcat好了). 首先下载Red5,我们这里适用0.7版。下载地址:http://osf...

zyanyan的博客 401

red5 html5,RHEL5 流媒体服务器的搭建--Red5

Red5是一个采用Java开发开源的Flash流媒体服务器。它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能。1:下载并安装java开发环境http://java.sun.com/javase...

weixin_29497981的博客 894

ubuntu 12.10下 源码安装red5

1、Red5简介 Red5是一个采用Java开发开源的Flash流媒体服务器。它支持:把音频 (MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录 制,flash流媒体播放,在线聊天,视频会议等一些基本功能。 2、Red5的安装安装前的准备   2.1 安装JD

liwf616的专栏 3536

ffplay不能直播red5上的直播流问题解决

1 我一直使用flex4和flash开发视频聊天的程序,以前再flex中和flash直接写上服务器路径然后指定play的流的名称就可以了。代码如下: // Check for reconnect. if ( nsPlay != null ) {     // Stop and close previous NetStream.     var stopStreamEvent : Sto

一名清官 2532

基于flex 和red5的视频聊天

源码过两天放出 首先 向某人道个歉,没有按时把源码放出来 现在源码已经上传了 可以下载。 http://www.uushare.com/user/feiyan35488/files/2390810 不好意思 放上的的视频会议的代码,没有使用框架,很简单。 我也是新手,把代码放出来献丑了。...

feiyan35488的专栏 518
上一篇: 如何由WIN安装版的RED5建立应用程序
下一篇: RED5 NetConnection.Connect.InvalidApp 解决办法
hacktt
博客等级 码龄19年 21粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值