`

在Red5 0.9版本实现 的上行带宽检测

阅读更多

一、为什么要带宽检测?

 

在多媒体应用中,尤其在桌面共享应用系统的实现中,带宽检查通常提高用户体验一种依据:

1.可以根据用户的带宽,如果用户的带宽过低,可以降低桌面抓屏的图片的质量,从而减少发送的数据,增强用户使用的稳定性。

2.可以根据用户的带宽,如果带宽比较低,则应该降低抓屏的频率,因为在网络带宽比较差的情况下,如果capture screen频率过高,会造成网络拥堵。此时可以降低capture screen的频率,从而提高用户使用的平滑性,不会造成大的延时。

 

二、如何做带宽检测以及应该注意的问题?

 

检测带宽想想是不是很容易:

一段时间内server接收到数据的byte数 /interval(s)

 

这里需要注意问题和原则:

1.做带宽检查的参考帧,一定要大,太小了误差很大,比如说,以2KB的包为例,可能几毫秒就可以完成,这样得到的数据会非常大

2.带宽检测的检测包在检测过程中要保证数据是一直发送的,例如如果20s之内,只有少量的数据发送,这样计算的结果会偏小

 

在Red5里面要做到带宽检测,需要修改两个地方:

1.需要知道一个桌面视频帧何时开始发送

2.需要知道一个桌面视频帧何时接收完毕

3.需要知道一帧发送开始和结束发送的字节数

 

注:Red5的网络层使用的是Mina作为数据传输层,它有个api专门进行带宽的检测的,它的原理简单说来就是,你告诉它时间点,它告诉你收到了多少数据,显然,有这个api,我们的带宽检查不是问题了

 /**
     * {@inheritDoc}
     */
    public final void updateThroughput(long currentTime, boolean force) {
        int interval = (int) (currentTime - lastThroughputCalculationTime);

        long minInterval = getConfig().getThroughputCalculationIntervalInMillis();
        if (minInterval == 0 || interval < minInterval) {
            if (!force) {
                return;
            }
        }

        readBytesThroughput = (readBytes - lastReadBytes) * 1000.0 / interval;
        writtenBytesThroughput = (writtenBytes - lastWrittenBytes) * 1000.0 / interval;
        readMessagesThroughput = (readMessages - lastReadMessages) * 1000.0 / interval;
        writtenMessagesThroughput = (writtenMessages - lastWrittenMessages) * 1000.0 / interval;

        lastReadBytes = readBytes;
        lastWrittenBytes = writtenBytes;
        lastReadMessages = readMessages;
        lastWrittenMessages = writtenMessages;

        lastThroughputCalculationTime = currentTime;
    }

 

 

三、修改Red5源码达到带宽检测的效果

 

有两个时间点,我们就可以大胆做了:

1.在上一个数据帧decode完毕后,做个check point

在org.red5.server.net.rtmp.BaseRTMPHandler类中messageReceived方法末尾加上:

/** {@inheritDoc} */
    public void messageReceived(RTMPConnection conn, ProtocolState state, Object in) throws Exception {

log.info("Begin to calculate the bandwidth======");
        RTMPMinaConnection connC = (RTMPMinaConnection) Red5
        .getConnectionLocal();
        final IoSession session = connC.getIoSession();
        session.updateThroughput(System.currentTimeMillis(), true);

 

2.在一个视频数据帧收发完毕后,做个check point

修改 org.red5.server.net.rtmp.codec.RTMPProtocolDecoder,增加以下红色部分的代码;

public List<Object> decodeBuffer(ProtocolState state, IoBuffer buffer) {
-------- 省略了部分代码
                if (state.hasDecodedObject()) {
                    if (decodedObject != null) {
                       
                        if(decodedObject instanceof Packet ){
                            Header header = ((Packet) decodedObject).getHeader();
                            log.info("The check package size is====="+header.getSize()/1024+"KB.");
                            if(header.getDataType()==TYPE_VIDEO_DATA && header.getSize()>(100*1024)){
                                session.updateThroughput(System.currentTimeMillis(), true);
                                log.info("The bandwidth is ====="+session.getReadBytesThroughput()/1024d+"KB/s");
                            }
                        }

                        result.add(decodedObject);
                    }

 

 

0
0
分享到:
评论

相关推荐

    RED_0.9.0.20191011120350-win32.win32.x86_64.zip

    标题中的"RED_0.9.0.20191011120350-win32.win32.x86_64.zip"表明这是RED IDE的一个版本,具体为0.9.0,发布于2019年10月11日12时35分,适用于32位的Windows系统。这个zip文件包含了RED IDE的所有组成部分。 描述中...

    red5-0.9.1.tar.gz

    这个“red5-0.9.1.tar.gz”文件是Red5的一个版本,版本号为0.9.1,被打包成.tar.gz格式,这是一种在Linux/Unix环境下常见的压缩方式,它结合了tar进行文件归档和gzip进行压缩的功能。 Red5的核心功能在于提供实时的...

    Red5-0.9.1

    为了启动Red5服务器,你需要在命令行中定位到`bin`目录,并运行相应的启动脚本(根据操作系统不同,可能是`start-red5.bat`或`red5.sh`)。一旦服务器运行,你就可以通过Web浏览器访问默认的管理控制台,通常是在`...

    red5-src-0.9.1.rar_red5 0.9_red5 java _red5-origin-core.xml_rstp

    一个采用Java开发开源的Flash流媒体服务器。它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议

    RED_feature_0.9.5.202007241017.zip

    在一个RED实例中调试Robot测试用例和Python库 变量,关键字,测试用例,资源和库的代码帮助和完成 实时测试用例验证 执行视图 通过Eclipse机制支持插件 支持robot格式:.txt,.robot,.tsv(不支持HTML格式)

    Redmine 用户手册 基于Redmine 0.9 版本

    在学习Redmine的过程中,参考《RedHat5学习笔记.doc》可能会有所帮助,因为Red Hat Linux 5可能是Redmine运行的服务器环境之一。了解Linux的基本操作和服务器配置对于优化Redmine的性能和安全性至关重要。 总结起来...

    red5 windows版本

    Windows版本的Red5允许在Windows操作系统上搭建流媒体服务,为用户提供多媒体内容的发布、录制、存储和播放等功能。 首先,让我们详细讲解一下如何在Windows系统上安装Red5: 1. **下载与准备**: - 首先,你需要...

    Red50.9+Flex配置

    本指南将详细阐述如何在Windows操作系统上配置Red5 0.9版本,并与Flex进行集成。 ### Red5 0.9安装 1. **下载Red5**:首先,你需要从Red5的官方网站或可靠的第三方源下载适用于Windows的Red5 0.9版本安装包。 2. *...

    随机早检测 RED算法实现(C++)

    随机早检测 RED算法实现 计算机网络C++算法 使路由器的队列维持两个参数,即队列长度最小门限 THmin 和最大门限 THmax。 RED 对每一个到达的数据报都先计算平均队列长度 LAV。 若平均队列长度小于最小门限 THmin,则...

    Red5+H5实现点播和直播

    ### Red5+H5 实现点播和直播 在探讨如何使用Red5与HTML5(简称H5)技术实现点播和直播之前,我们先来了解下这些技术的基础概念。 #### 1. Red5 介绍 Red5是一款开源的媒体服务器,支持多种协议如RTMP、HTTP-FLV等...

    Red5 1.0 Final Web版

    将两者结合,可以利用Tomcat的Web应用管理能力,将Red5作为Web应用程序部署,以实现更灵活的管理和配置。 整合过程通常包括以下步骤: 1. **安装准备**:确保系统上已经安装了Java Development Kit (JDK),因为Red...

    red5入门,tomcat+red5+myeclipse集成,原创禁止转载

    4. 启动Red5:在命令行中运行Red5的启动脚本(在Red5安装目录的bin目录下),如Windows系统中运行`start-red5.bat`。 5. 集成MyEclipse:在MyEclipse中新建一个Dynamic Web Project,将Red5的Web应用结构导入到项目...

    RED_0.8.5.20180516100200-win32.win32.x86_64

    标题中的"RED_0.8.5.20180516100200-win32.win32.x86_64"指的是一个特定版本的RED工具,这里的"0.8.5.20180516100200"是版本号,日期格式为年月日时分秒,表明这是2018年5月16日10点2分发布的。"win32.win32.x86_64...

    【red5】实现点播-直播功能

    【Red5】实现点播-直播功能 在IT行业中,实时流媒体技术是不可或缺的一部分,尤其是在互联网娱乐、在线教育和企业通信等领域。Red5是一款开源的流媒体服务器,它允许开发者实现点播和直播功能,为用户提供流畅的...

    red5 与 tomcat项目集成

    4. **下载与解压 Red5**:从官方网址(http://code.google.com/p/red5/)获取 Red5 的最新稳定版本(在这个例子中是 0.9.1 Final),解压并提取必要的 jar 包到项目中。 5. **配置文件集成**: - `web.xml`:这是 ...

    Red5 + Flex开发实例

    2. Red5的安装:在安装Red5之前需要确保安装了JRE(Java Runtime Environment),因为Red5运行依赖于JRE。Red5的安装过程类似于普通exe文件的安装,需要先下载安装文件,双击运行安装程序即可。安装过程中可能需要...

    基于 Red5 的流媒体服务器的搭建和应用

    访问Red5官方网站下载最新版本的Red5,解压后即可使用。对于生产环境,建议通过脚本或服务管理工具将其设置为系统服务。 ##### 3.3 配置Red5 Red5的配置文件通常位于`conf`目录下,主要包括`server.xml`、`context...

Global site tag (gtag.js) - Google Analytics