Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg

参考文章:

https://blog.csdn.net/whatareyouding/article/details/144317654

https://www.cnblogs.com/Gredae/p/18362900

https://www.cnblogs.com/kn-zheng/p/17422707.html

https://blog.51cto.com/u_16099344/10281495

https://www.tulingxueyuan.cn/tlzx/jsp/2198.html

https://blog.csdn.net/wzt001005/article/details/145032455

搭建Nginx

1、下载包到/usr/local位置

wget或者手动下载,注意做好版本映射支持关系

nginx-1.24.0.tar.gz
nginx-http-flv-module-1.2.9.tar.gz

2、解压下载的两个文件:
tar -zxvf 文件名

3、安装所需依赖

RHEL

yum -y install gcc gcc-c++ openssl openssl-devel zlib zlib-devel pcre pcre-devel

Ubuntu

sudo apt update
sudo apt install -y gcc g++ libssl-dev zlib1g-dev libpcre3 libpcre3-dev

4、配置编译项

进入目录/usr/local/nginx-1.24.0

如有error检查路径

./configure --prefix=/usr/local/nginx  --add-module=/usr/local/nginx-http-flv-module-1.2.9

5、安装

如有error检查缺少的依赖,根据提示安装

make
sudo make install

6、验证安装
/usr/local/nginx/sbin/nginx -V

如果在输出中未看到 --add-module 参数,可能表示模块未成功编译进 Nginx

[root@iZf4o05j05ne6r1jkkogkpZ local]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
built with OpenSSL 3.0.8 7 Feb 2023
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --add-module=/usr/local/nginx-http-flv-module-1.2.9
[root@iZf4o05j05ne6r1jkkogkpZ local]# 

配置Nginx

修改/usr/local/nginx/conf/nginx.conf

配置rtmp,服务端口,live路径等

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;
        }
    }
}


http {
    include       mime.types;
    default_type  application/octet-stream;


    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8099;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        
       location /live {
            flv_live on;
            chunked_transfer_encoding on;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Headers' 'X-Requested-With';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Cache-Control' 'no-cache';
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

安装ffmpeg

Ubuntu/Debian

sudo apt update
sudo apt install ffmpeg
ffmpeg -version

CentOS/RHEL

sudo yum install ffmpeg ffmpeg-devel
ffmpeg -version

RTMP转http-flv视频流

已知我的视频流:rtsp://10.21.37.252:554/rtp/0501001305

输入命令ffmpeg -i "rtsp://10.21.37.252:554/rtp/0501001305" -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/0501001305"

然后浏览器访问http://127.0.0.1:8081/live?port=1935&app=live&stream=0501001305

就可以看到视频可以播放了,或者vlc访问测试

这个地址可以直接嵌入浏览器播放:http://127.0.0.1:8081/live?port=1935&app=live&stream=0501001305

如果对画质等视频参数进行调整可以研究下ffmpeg

java调用

得到outUrl地址为http-flv地址

java 复制代码
		String rtspUrl = "rtsp://10.21.37.252:554/rtp/0501001305";
        String outUrl = null;
        // 如果流地址不为空,进行转码:
        if (rtspUrl != null) {
            try {
                LOGGER.info("===准备转流===:{}", rtspUrl);
                String[] parts = rtspUrl.split("/");
                String channelCode = parts[parts.length - 1];
                String rtmpUrl = "rtmp://127.0.0.1:1935/live/" + channelCode;
                // 创建 ffmpeg 命令
                String[] command = {
                        "ffmpeg",
                        "-i", rtspUrl,
                        "-vcodec", "copy",
                        "-acodec", "copy",
                        "-f", "flv",
                        "-fflags", "+genpts",   // 生成新的时间戳,可能有助于解决时间戳无效或不连续的问题
                        rtmpUrl
                };
                // 创建 ProcessBuilder
                ProcessBuilder processBuilder = new ProcessBuilder(command);
                // 启动进程
                Process process = processBuilder.start();

                // 创建一个线程来处理进程输出
                new Thread(() -> {
                    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                        String line;
                        while ((line = reader.readLine()) != null) {
                            LOGGER.info("FFmpeg Output: {}", line);
                        }
                    } catch (IOException e) {
                        LOGGER.error("Error reading ffmpeg output: {}", e.getMessage());
                    }
                }).start();

                // 创建一个线程来处理进程错误流
                new Thread(() -> {
                    try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
                        String line;
                        while ((line = errorReader.readLine()) != null) {
                            LOGGER.error("FFmpeg Error: {}", line);
                        }
                    } catch (IOException e) {
                        LOGGER.error("Error reading ffmpeg error stream: {}", e.getMessage());
                    }
                }).start();


                outUrl = "http://127.0.0.1:8081/live?port=1935&app=live&stream=" + channelCode;
            } catch (Exception e) {
                e.printStackTrace();
                LOGGER.error(e.toString());
            }

前端vue播放

样式根据需要调整

html 复制代码
      <div id="video_Player" class="video_mian video_mian_bg">
        <video
            id="mmiid"
            class="video-js vjs-big-play-centered vjs-fluid"
            controls
            preload="auto"
            width="100%"
            height="100%">
        </video>
      </div>
js 复制代码
import Videojs from 'video.js'
import 'video.js/dist/video-js.css'
import "videojs-flvjs-es6";
 
      startLive(this.send).then((res) => {
        console.log(res)	// 得到http-flv地址
        this.videoPlayer = Videojs(document.querySelector('#mmiid'), {
          autoplay: 'muted',//自动播放
          controls: true,//用户可以与之交互的控件
          loop: true,//视频一结束就重新开始
          muted: false,//默认情况下将使所有音频静音
          aspectRatio: "16:9",//显示比率
          fullscreen: {
            options: {navigationUI: 'hide'}
          },
          techOrder: ["html5", "flvjs"],// 兼容顺序
          flvjs: {
            mediaDataSource: {
              isLive: false,
              cors: true,
              withCredentials: false
            }
          },
          sources: [{
            src: res.data,
            type: "video/x-flv"
          }]
        })
      });
相关推荐
爆爆凯14 分钟前
MobaXterm_Portable_v23.2 免费下载与使用教程(附安卓替代方案)
java·github
+7201 小时前
如何在java中用httpclient实现rpc get请求
java·qt·rpc
秋野酱1 小时前
基于 JavaWeb 的 SSM+Maven 微信小程序快递柜管理系统设计和实现(源码+文档+部署讲解)
java·微信小程序·maven·课程设计
你在我身后1 小时前
Spring-JAVA
java·后端·spring
卓越软件开发2 小时前
Java计算机毕业设计基于SSM宠物美容信息管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解
java·课程设计·宠物
丁总学Java2 小时前
Cannot deserialize instance of java.lang.String out of START_ARRAY token
java·windows·python
+7202 小时前
Java 的 HttpClient 中使用 POST 请求传递参数
java·开发语言
lozhyf3 小时前
如何使用Spring boot框架实现图书管理系统
java·spring
_extraordinary_3 小时前
Linux基本指令(三)+ 权限
linux·运维·服务器