最近正在做基于 Red 5 的简单开发,之所以说简单,因为没有利用 Red 5 提供的大多数功能接口,只利用其提供的接口来检测一个流媒体源(用的 OBS Studio 16.5)是否连接到服务器上,我所使用的 Red 5 Server 版本是 1.0.8。

主要参考了如下链接中代码
http://blog.csdn.net/supercrsky/article/details/47611365
当然还参考了一些其他的帖子,发现关于 Red 5 的资料真的很少,因为一来官方不提供编程示例(可能是我 low b 没找到吧);二来网上的资料很多是关于老版本的 Red 5,比如很多会介绍如何将 Red 5 搭建在 tomcat 中,实际新版本已经集成了网页发布等功能,并不需要再单独配 Tomcat 了(只是举个例子,因为我发现很多帖子真的和新版本的 Red 5 对应不上)。

1 第一次尝试利用 Red5 Server 发布 rtmp 视频

这部分内容很多帖子中都有详细介绍,比较熟悉的同学可以直接跳到第二部分

抱怨结束,言归正传。如果想配置 Red 5 上跑的程序,首先要了解其配置文件(新老版本配置文件有一些出入),这个配置文件的配置可以参考其自带的示例代码,位于: 解压目录\red5-server\webapps\live 下,可以先尝试着使用一下这个示例代码,具体方法如下:

  1. 当然是下载 red5 server 并安装,这都很简单,我记得是直接解压缩就可以(记不清了)
  2. 运行 red5 server,对于 windows 用户,只需运行 解压目录\red5-server 目录下的 red5.bat,关闭服务器运行该目录下的 red5-shutdown.bat;相应的 *nix 用户运行 red5.sh 或 red5-shutdown.sh(可以说和 tomcat 已经非常相像了)
  3. 只要将 red5 server 运行起来,就可以利用推流软件 OBS Studio 进行推流了,具体的推流方法可以查阅相关的帖子。配置中的一些要点是配置项中的地址填写 rtmp://本机ip/live,流密钥随便写什么都可以,这里的 live 很重要,不能随便写别的东西,这是因为所有的服务都部署在 red5-server\webapps 内,你可以看里面有一个 live 文件夹。
  4. 配置好串流地址就可以点击 OBS 的开始串流,如果一切顺利开始串流的按钮会变成可以点击的停止串流(如果失败一般会报错或者卡在那里……)
  5. 此时就可以通过客户端来查看推流是否成功了,常见的客户端如 vlc 播放器,或者一些网页的客户端,例如
    http://www.wowza.com/resources/3.5.0/examples/LiveVideoStreaming/FlashRTMPPlayer/player.html,又如已故雷霄骅提供的自己写网页 rtmp 播放器帖子
    http://blog.csdn.net/leixiaohua1020/article/details/43936415/,实际上 red5 server 自己本身就可以播放,只需要在浏览器中输入 http://localhost:5080,然后进入其 Example 链接中,点击 publisher 这个例子,其中 location 中填 OBS 中填的地址,Name 填 OBS 中填的流密钥,点击 connect 就可以了。

2 对 live 例子的简单修改

完成了上面的步骤就对 red5 有了一个简单的认知。那么实际上我们可以看一下 解压目录\red5-server\webapps\live 文件夹下究竟有什么东西。。。你会发现除了三个配置文件什么都没有。。。

由于本人对 spring 啊 tomcat 啊什么的还只是一知半解,所以就大概说一下自己的理解。

  • web.xml:主要是网页发布的一些配置信息,以及 spring 所用到的一些配置。这和一般 tomcat 中的 web.xml 应该没有太大的区别
  • red5-web.properties:这个文件只有两行配置,实际其被使用的地方是 red5-web.xml 文件
  • red5-web.xml:这是 red5 server 的配置文件,这个文件很重要

    其中的部分 1 就是一些基本的套路;部分 2 是用在 spring 上的;部分 3 不知道是干什么的;部分 4 画了红色框框的地方就是 red5-web.properties 配置的两个值,你想自己填一些固定的值也 ok;此外部分 4 和部分 5 画绿线的地方是对应的,代表着你自己程序的入口点,我说的是第 5 部分 class 等号后面的类名。

所以如果你想写一个新的应用叫 myLive,只需要在 webapps 下创建新的 myLive 文件夹,然后将原来的“解压目录\red5-server\webapps\live“ 文件夹下的内容都复制到 myLive 文件夹下,再将上面提到的几个配置文件中的 live 改为 myLive 即可。(实际 web.xml 文件并不需要修改也能运行)

3 尝试着写一点自己的程序

这部分内容可能不够详尽,但我已经尽力了

当然上面的改动还是很小的,如果想自己写一个可以稍微采集一些流媒体发布端和客户端信息的简单程序实际也不难(博主的能力也只能写一些简单程序了,太复杂的能力所限,无奈只是一个普通的学渣)。具体的步骤如下:

  1. 首先博主使用的 Java IDE 是 eclipse,可以去 red 5 的官网(https://github.com/Red5/red5-eclipse-plugin)下载 eclipse 插件,具体安装细节就不细说了,上面的连接中就有教程,还挺复杂的,网上也有一些帖子会介绍。
  2. 安装完的效果就是,你可以在你的 eclipse 中创建一个 dynamic web project,盗用一张官网的图片

    在选择服务的时候可以配成 red 5 服务器(就好像 tomcat 服务器那样),这个插件使得你可以在 eclipse 中直接调试你的 red 5 应用。
  3. 你创建好的项目的目录结构应该是这个样子的(虽然你看到这个帖子可能已经是很多年后,结构也不是这个样子。。。)。红色方框中是博主创建的包和 java 文件
  4. 根据我目前看到的资料,基本上都说自己写的应用要继承 ApplicationAdapter 类或者 MultiThreadedApplicationAdapter 类,这两个类在 red5-server.jar 包内,这个 jar 包如果你上面关于 Eclipse 的插件安装正确的应该已经被自动导入了;如果没有也不要紧,因为这个 jar 包就位于“解压目录\red5-server”目录下。
  5. 你可以写类似于下面的代码,但一般这时会报错,因为你还需要将“解压目录\red5-server\lib”文件夹下的 jar 包导入你的工程。下面这段代码虽然简单,但在后面我还是会进行详细介绍的 233333

    package providerTest;import org.red5.server.adapter.ApplicationAdapter;
    import org.red5.server.api.stream.IBroadcastStream;public class ProviderTester extends ApplicationAdapter{@Overridepublic void streamPublishStart(IBroadcastStream stream){System.out.println(stream.getPublishedName());super.streamPublishStart(stream);}@Overridepublic void streamBroadcastClose(IBroadcastStream stream){System.out.println(stream.getPublishedName());super.streamBroadcastClose(stream);}
    }
    
  6. 此时如果一切顺利(没有任何错误提示),你就可以右键选择

  7. 如果一切顺利,你的 Eclipse 会运行起 red5 服务器,然后等待启动完毕,Eclipse 会自动在 red5 的 webapps 文件夹下创建你的应用,名字就是你刚刚创建的 Java 工程的名字。
  8. 此时你刚刚创建的 Java 工程还无法接受视频流的发布数据,你需要先关闭 red5 服务器,然后按照第二部分的内容配置相关的配置信息。此时特别注意的是第四张图中的 red5-web.xml 配置信息的第 5 部分,一定要 class 配成你的 包名.类名,例如,我上面的例子就是 providerTest.ProviderTester。
  9. 这是再次启动 red5 服务器,你就可以利用 OBS 按照前面的介绍发布一个视频流,发布地址这次要写“rtmp://你的ip/你自己的应用名称”。
  10. 一切顺利的话,你的控制台会输出此刻 OBS 发布视频的流密钥。

4. 对于程序的一点解释

red5 服务器会读取应用下的 red5-web.xml 配置文件,只要你的 handler 配置项配置的对(并且这个类确实写好编译好了),服务器就会调用你写的应用程序。你的程序继承 ApplicationAdapter 类,而 ApplicationAdapter 类继承 MultiThreadedApplicationAdapter 类(当然你也可以跳过 ApplicationAdapter 类,选择直接继承 MultiThreadedApplicationAdapter 类)。ApplicationAdapter 类实现了 6 个方法,分别是

public boolean start(IScope scope)
public void stop(IScope scope)
public boolean connect(IConnection conn, IScope scope, Object[] params)
public void disconnect(IConnection conn, IScope scope)
public boolean join(IClient client, IScope scope)
public void leave(IClient client, IScope scope)

,而 ApplicationAdapter 类提供了更加丰富的方法示例,例如博主所覆写的

public void streamPublishStart(IBroadcastStream stream)
public void streamBroadcastClose(IBroadcastStream stream)

这两个函数分别是当流媒体发布源接入和关闭的时候被触发。当然,这两个事件也会触发 connect、disconnect、join 和 leave 函数,但这几个函数无法提供博主所需要的 stream 对象。

你可能发现,这里我对这两个重要的类,还有诸如 IConnection 和 IScope 等接口并没有做深入细致的分析,你猜的没错,因为我还没有足够的时间做这件事。。。如果以后还涉及这块业务,可能会深入研究一下吧。。。

5 扣题:猝不及防的一个坑

就像 tomcat 一样,red5 webapps 文件夹下的应用,其 WEB-INF 文件夹下都要有 lib 文件夹,用来存放你的 Java 程序所依赖的类库。然后博主最开始就很手贱的把“解压目录\red5-server\lib”下的所有 jar 包放在了自己应用的 lib 文件夹下,之后一直发布视频都失败,提示 scope not found 的错误。谷歌了一下,red5 的作者回答了一些人的相关提问,不过回答的都是配置文件没配好啊,webapps 文件夹下是不是没有你的应用啊这一类的,我这个引发问题的原因应该是很少见的了。。。

调试了好久才发现是这个原因,希望可以帮到正在看本文的你

Red 5 中让你猝不及防的一个坑相关推荐

  1. vue中的data为什么是一个函数?起到什么作用?

    前言 在学习vue的时候,我们一直在思考的一件事: 组件的data数据为什么必须要以函数返回的形式,为什么不是简单的对象形式呢? 一.data为什么是一个函数 面试回答: 如果data是一个函数的话, ...

  2. c语言中如何设计和编写一个应用系统?

    C程序中,如何设计和编写一个应用系统? 一. C语言文件的操作 1. 文件操作的基本方法: C语言将计算机的输入输出设备都看作是文件.例如,键盘文件.屏幕文件等. 向屏幕输出一个信息,例如" ...

  3. R语言dplyr包使用anti_join()函数返回在一个dataframe中存在而在另一个dataframe中没有匹配值的所有行实战

    R语言dplyr包使用anti_join()函数返回在一个dataframe中存在而在另一个dataframe中没有匹配值的所有行实战 目录

  4. 《Oracle SQL疑难解析》——1.6 批量地从一个表中复制数据到另一个表

    本节书摘来自异步社区出版社<Oracle SQL疑难解析>一书中的第1章,第1.6节,作者: [美]Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以 ...

  5. IntelliJ IDEA中跳转到上一个视图位置(向后/向前导航)的键盘快捷键

    本文翻译自:Keyboard shortcut for Jump to Previous View Location (Navigate back/forward) in IntelliJ IDEA ...

  6. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件

    怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...

  7. python导入其他py文件-Python中py文件引用另一个py文件变量的方法

    最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requests r = requests.get(&quo ...

  8. PHP电商的sku,tech| 关于电商系统中sku与spu的一个难题

    date: 2018-8-1 21:17:14 title: tech| tech| 关于电商系统中sku与spu的一个难题 description: 业务上碰到的关于电商系统中sku与spu的一个难 ...

  9. 精度问题——直线方程的系数判断实际生产中三点能否确定一个圆

    已知三点p1(x1,y1,z1).p2(x2,y2,z2).p3(x3,y3,z3),求平面方程如下: c=向量AB=向量OB-向量OA=(x2-x1,y2-y1,z2-z1) b=向量AC=向量OC ...

最新文章

  1. Windows客户端C/C++编程规范“建议”——宏
  2. C# 学习笔记(8) 控件的跨线程访问
  3. 视觉错觉模型_有才!将立体模型涂改伪装成平面二次元,视觉错觉玩法在日本风靡...
  4. 《springcloud超级入门》Spring Boot简介《五》
  5. 看看你爱的他今天是什么‘颜色‘ -- Python爬取微博评论制作专属偶像词云
  6. 系统没有安装vc9.注意是x86 32位_Windows 软件默认安装位置之谜
  7. 第七章 二叉搜索树 (d2)AVL树:插入
  8. ThreadLocal,静态变量,实例变量,局部变量的线程安全
  9. 提升Windows 7在双核CPU下的启动速度
  10. MySql 集群/主从
  11. envi自定义坐标系
  12. 一般意义的resolution地图分辨率和比例尺理解
  13. request请求 下载附件
  14. 通信信道带宽为1Gbit/s,端到端时延为10ms。TCP的发送窗口为65535字节。试问: 可能达到的最大吞吐量是多少?信道的利用率是多少?
  15. js第六、七天 Array、string
  16. pygal:一款好用到爆的 Python 可视化利器,炫酷动态图轻松绘制
  17. 如何利用直通车系统的打造爆款完整流程!QT1130找24团珍帅
  18. 智和网管平台-真正开放源码的网元管理系统(EMS)
  19. javascript-原生javascript实现类似节奏大师小游戏
  20. django学习日记2017-10-20: 登录界面

热门文章

  1. jQuery MiniUI开发系列之:UI和数据分离
  2. ftrack Review 双重校验
  3. python脚本部署为Windows服务
  4. 2018春季-华南理工-计算机概论,【7A文】华南理工大学网络教育学院2018计算机概论作业...
  5. 【算法实验四】(DP-动态规划)【花生米3】
  6. Go语言接口为什么是颠覆性的?
  7. exlc如何对比_excel怎么做数据比对 excel数据比对方法
  8. 【踩坑专栏】JSON parse error: Cannot deserialize value of type `java.util.Date` from String
  9. 量化论文不可复现是人品问题,赚不赚钱不是评价它的标准!
  10. android实现桌面icon未读信息图标(类似与iPhone的badge)