rtsp转flv

需求

Web浏览器不直接支持播放rtsp视频流,需将rtsp转成flv,提供给Web浏览器进行播放。

安装环境

二进制文件
或者

sudo apt install nodejs
sudo apt install npm

安装模块

npm install express express-ws fluent-ffmpeg websocket-stream -S -D

ffmpeg

apt install ffmpeg

或者
二进制文件

server.js

var express = require("express");
var expressWebSocket = require("express-ws");
var ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath(__dirname + "/ffmpeg-6.0-amd64-static/ffmpeg");
var webSocketStream = require("websocket-stream/stream");
var WebSocket = require("websocket-stream");
var http = require("http");
function localServer() {
    let app = express();
    app.use(express.static(__dirname));
    expressWebSocket(app, null, {
        perMessageDeflate: true
    });
    app.ws("/rtsp/:id/", rtspRequestHandle);
    app.listen(8858);
    console.log("开启nodejs服务监听8858 rtsp端口")
}

function rtspRequestHandle(ws, req) {
    const stream = webSocketStream(ws, {
        binary: true,
        browserBufferTimeout: 1000000
    }, {
        browserBufferTimeout: 1000000
    });
    let url = req.query.url;
    let params = req.params;
    if (params.id != "0") {
        url += "?" + params.id;
    }
    try {
        ffmpeg(url)
            .addInputOption("-rtsp_transport", "tcp", "-buffer_size", "102400")
            .on("start", function () {
                 console.log(url, "开始===========");
            })
            .on("codecData", function () {
                console.log(url, "编码")
                // 摄像机在线处理
            })
            .on("error", function (err) {
                console.log(url, "出错: ", err.message);
                //有可能客户端关闭请求
            })
            .on("end", function () {
                console.log(url, "结束===========");
                // 摄像机断线的处理
            })
            .outputFormat("flv").videoCodec("copy").noAudio().pipe(stream);
    } catch (error) {
        console.log(error);
    }
}
localServer();

测试

  1. 下载测试资源
wget https://vfx.mtime.cn/Video/2023/08/18/mp4/230818134330888129.mp4 -O xxx.mp4
  1. ffmpeg推流
 ffmpeg -re -i xxx.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://admin:abc123@192.168.66.116:554/h264/ch1/main/av_stream
  1. html文件播放

flv.min.js

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script src="flv.min.js"></script>
  <style>
    body,
    center {
      padding: 0;
      margin: 0;
    }
    .v-container {
      width: 100%;
      height: 100vh;
      border: solid 1px red;
      display: flex;
      flex-flow: row wrap;
      justify-content: space-evenly;
      align-content: space-evenly;
    }
    video {
      width: 33%;
    }
  </style>
</head>

<body>
  <div class="v-container">

    <video id="player1" muted autoplay="autoplay" preload="auto" controls="controls">
    </video>
    <video id="player2" muted autoplay="autoplay" preload="auto">
    </video>
    <video id="player3" muted autoplay="autoplay" preload="auto">
    </video>
    <video id="player4" muted autoplay="autoplay" preload="auto">
    </video>
    <video id="player5" muted autoplay="autoplay" preload="auto">
    </video>
    <video id="player6" muted autoplay="autoplay" preload="auto">
    </video>
  </div>

  <script>
    if (flvjs.isSupported()) {
      for (let i = 1; i < 7; i++) {
        var wsAddr = "ws://127.0.0.1:8858/rtsp/";
        switch (i) {
          case 1:
            wsAddr += "0/?url=rtsp://admin:abc123@192.168.66.116:554/h264/ch1/main/av_stream";
            break;
          case 2:
            wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.101:554/h264/ch1/main/av_stream";
            break;
          case 3:
            wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.111:554/h264/ch1/main/av_stream";
            break;
          case 4:
            wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.115:554/h264/ch1/main/av_stream";
            break;
          case 5:
            wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.120:554/h264/ch1/main/av_stream";
            break;
          case 6:
            wsAddr += "channel=1&subtype=0/?url=rtsp://admin:abc123456@192.168.64.251:554/cam/realmonitor";
            break;
          default: break;
        }
        var videoElement = document.getElementById('player' + i);
        var flvPlayer = flvjs.createPlayer({
          type: 'flv',
          url: wsAddr
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
      }
    }
  </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值