Red 5 中让你猝不及防的一个坑

来源:互联网 发布:知我网是正品吗 编辑:程序博客网 时间:2024/06/02 09:43

最近正在做基于 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{    @Override    public void streamPublishStart(IBroadcastStream stream){        System.out.println(stream.getPublishedName());        super.streamPublishStart(stream);    }    @Override    public 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 文件夹下是不是没有你的应用啊这一类的,我这个引发问题的原因应该是很少见的了。。。

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

0 0
原创粉丝点击