欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx + rtmp 搭建流媒体服务器直播平台

程序员文章站 2022-07-06 21:59:04
...

一、安装与配置nginx服务器

安装nginx:

1,安装参考播客:https://blog.csdn.net/u012946310/article/details/81535751

2,安装完成后下载 nginx-rtmp-module 模块(我这里的目录是在/usr/local/nginx-1.15.0 下面)

cd /usr/local/nginx-1.15.0/

nginx-rtmp-module 的官方 github 下载地址:https://github.com/arut/nginx-rtmp-module
这里使用git进行下载:

git clone https://github.com/arut/nginx-rtmp-module.git 

( 如果没有安装git使用yun进行安装,yum install git)

3,重新编译 nginx,添加 nginx-rtmp-module 模块

./configure --prefix=/usr/local/nginx  --add-module=nginx-rtmp-module  --with-http_ssl_module
make
make install

4,nginx 与 nginx-rtmp-module 模块安装完成,修改 nginx.conf 配置文件

#在最外层增加如下配置
rtmp {
    server {
        listen 1935; #监听的端口
        chunk_size 4000;

        #rtmp配置
        application live{ #rtmp推流请求路径 (切记路径错了会推不上流)
            live on; #开启实时
            hls on; #开启hls
            hls_path /www/rtmp; #rtmp推流请求路径,文件存放路径
            hls_fragment 5s; #每个TS文件包含5秒的视频内容

            #开始推流回调,url地址为java接口
            on_publish http://192.168.2.101:6540/rtmp/uploadRtmp;
            #推流停止回调,url地址为java接口
            on_done http://192.168.2.101:6540/rtmp/uploadRtmp;
        }
    }
}

nginx + rtmp 搭建流媒体服务器直播平台
至此,nginx 及 nginx-rtmp-module 部分配置完成 。

二、OBS推流测试

1,百度OBS下载及安装

2,添加来源,选择媒体源,选择本地的播放文件
nginx + rtmp 搭建流媒体服务器直播平台
nginx + rtmp 搭建流媒体服务器直播平台
3,添加来源后点击控件设置,配置OBS推流地址:
nginx + rtmp 搭建流媒体服务器直播平台

rtmp://192.168.2.122:1935/live // nginx的ip和application地址也就是推流地址
rtmp?token=123456 // 流名称,可以作为会话名称并且可以传递参数验证权限

单击开始推流,验证,查看服务器目录已经存在有流文件**(上面nginx配置的 hls_path 地址)**,并且在开始推流之前回调了所配置的java接口代码
nginx + rtmp 搭建流媒体服务器直播平台
以下为回调的java controller代码:

package cx.manager.client.demo.controller;

import cx.manager.common.vo.ResultPageVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Controller
@RequestMapping("rtmp")
@Slf4j
public class RtmpController {

    @RequestMapping("/uploadRtmp")
    @ResponseBody
    public ResultPageVo uploadRemp(String token, HttpServletRequest request, HttpServletResponse response) {
        Map<String, String[]> parameterMap = request.getParameterMap();
        System.out.println("参数数量:" + parameterMap.size());
        /**这三个参数是比较有用的参数
         tcurl:rtmp地址
         name:"rtmp://ngnix服务器地址/live/id"地址中去除推流地址的最后一个参数,可传入直播用户ID
         type:推流类型
         */
        System.out.println("tcurl:" + request.getParameter("tcurl"));
        System.out.println("name:" + request.getParameter("name"));
        System.out.println("type:" + request.getParameter("type"));
        //打印所有回调传过来的参数
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            System.out.println(entry.getKey() + "====================");
            for (String str : entry.getValue()) {
                System.out.println("\t" + str);
            }
        }
        return ResultPageVo.success();
//        try {
//            if (token.equals("123456")) {
//                return ResultPageVo.success();
//            } else {
//                response.setStatus(500);
//                return ResultPageVo.failure("token无效");
//            }
//        } catch (Exception e) {
//            response.setStatus(500);
//            return ResultPageVo.failure("token无效");
//        }
    }

    @GetMapping("/video")
    public String video(ModelMap modelMap) {

        modelMap.put("videoUrl", "rtmp://rtmp.test.orancrab.com:1935/live/rtmp");

        return "video";
    }
}

只做了个简单测试,可根据这些参数完善后台,实现用户推流开始把用户ID和推流地址存入redis或其他高性能存储,前台展示当前直播的用户,点击用户返回推流地址,实现直播,用spring boot写的

三、http拉流播放

拉流地址:rtmp://192.168.2.122:1935/live/rtmp

1,百度VLC下载及安装

2,安装好之后选择媒体 -> 流,选择网络,输入流地址后开始拉流

nginx + rtmp 搭建流媒体服务器直播平台
输入后点击串流直接下一步到完成就好了
nginx + rtmp 搭建流媒体服务器直播平台
最后看到已经拉取到流了

3,使用网络播放器进行验证

(网络拉流播放器地址:http://www.cutv.com/demo/live_test.swf)
RTMP拉流地址:rtmp://192.168.2.122:1935/live/rtmp(和VLC拉流地址一样)
nginx + rtmp 搭建流媒体服务器直播平台
验证通过,已经可以拉到流了。。。。。。。

4,使用移动端app设置推流与h5拉流测试

安卓推流App下载地址(小米9可用,其他机型没试,IOS自己在网上找):https://download.csdn.net/download/u012946310/11170486

下载好后打开APP点击左上角 -> Profile 里面编辑推流地址和其他参数,推流地址就是之前的推流地址
nginx + rtmp 搭建流媒体服务器直播平台
4-1,h5播放页面代码(页面需要放在服务容器里面运行,如nginx、tomcat等,电脑需要安装flash,手机端不支持),拉流地址改成自己的流地址就可以了

<html>  
  <head>  
  <title>视频直播</title>  
  <meta charset="utf-8">  
  <link href="http://vjs.zencdn.net/5.5.3/video-js.css" rel="stylesheet">  
  <!-- If you'd like to support IE8 -->  
  <script src="http://vjs.zencdn.net/ie8/1.1.1/videojs-ie8.min.js"></script>  
</head>  
<body>  
  <h1>直播间</h1>
  <h1>本地测试</h1>
  <h2>推流命令:/usr/local/ffmpeg/bin/ffmpeg -re -i rtmp.mp4 -f flv rtmp://192.168.2.122:1935/live/rtmp?token=123456</h2>
  <h2>拉流地址:rtmp://192.168.2.122:1935/live/rtmp?token=123456</h2>
  <h1>远程测试</h1>
  <h2>推流地址:</h2>
  <h2>播放地址:http://cx.manager.test.orancrab.com/client_demo/rtmp/video</h2>
 <video id="my-video" class="video-js" controls preload="auto" width="640" height="300"  
 poster="http://ppt.downhot.com/d/file/p/2014/08/12/9d92575b4962a981bd9af247ef142449.jpg" data-setup="{}">
     <!-- src=推流地址,需要改成自己的推流地址 -->
    <source src="rtmp://192.168.2.122:1935/live/rtmp" type="rtmp/flv">
    <!-- 如果上面的rtmp流无法播放,就播放hls流 -->  
    <!-- <source src="http://10.10.5.119/live/livestream.m3u8" type='application/x-mpegURL'> -->  
    <p class="vjs-no-js">播放视频需要启用 JavaScript,推荐使用支持HTML5的浏览器访问。  
      To view this video please enable JavaScript, and consider upgrading to a web browser that  
      <a href="http://videojs.com/html5-video-support/video.ftl" target="_blank">supports HTML5 video</a>
    </p>  
 </video>  
 <script src="http://vjs.zencdn.net/5.5.3/video.js"></script>  
</body>  
</html> 

4-2,搭建完成,运行页面测试
nginx + rtmp 搭建流媒体服务器直播平台

五、结尾

到此一个简单的 nginx + rtmp 搭建流媒体服务器,完成!虽然不是一个完整的例子,但是核心就是以上这些,大家可以在次基础上扩展,有什么不妥的地方希望大家指正,共同学习