h5 推流rstp

网上关于该 需求的博客很多,但能直接用的很少,经个人实践后提供一个最简版本;

思路是基于B站的开源播放器flv.js 和后台 ffmpeg转换

 

express工程

package.json

{
  "name": "express",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "express-ws": "^4.0.0",
    "fluent-ffmpeg": "^2.1.2",
    "websocket-stream": "^5.5.2"
  }
}

index.js

var express = require('express')
var expressWebSocket = require('express-ws')
var ffmpeg = require('fluent-ffmpeg')
const webSocketStream = require("websocket-stream/stream");
let server;
function localServer() {
  server = express();
  server.use(express.static(__dirname));
  expressWebSocket(server, undefined, {
    perMessageDeflate: true
  });
  server.ws("/rtsp/:id/", rtspRequestHandle);
  server.listen(8888);
}
function rtspRequestHandle(ws, req) {
  let url = req.query.url;
  console.log("rtsp url:", url);
  console.log("rtsp params:", req.params);
  const stream = webSocketStream(ws, {
      binary: true
  });
  url = `rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov`
  console.log("rtsp url:", url);
  let ffmpegCommand = ffmpeg(url)
    .addInputOption("-analyzeduration", "100000", "-max_delay", "1000000")
    .on("start", function () {
        console.log(url, "Stream started.");
    })
    .on("codecData", function () {
        console.log(url, "Stream codecData.")
    })
    .on("error", function (err) {
        console.log(url, "An error occured: ", err.message);
        stream.end();
    })
    .on("end", function () {
        console.log(url, "Stream end!");
        stream.end();
    })
    .outputFormat("flv").videoCodec("copy").noAudio()
  stream.on("close", function () {
    ffmpegCommand.kill('SIGKILL');
  });
  try {
      ffmpegCommand.pipe(stream);
  } catch (error) {
      console.log(error);
  }
}

localServer()
console.log('正在监听8888端口')

然后在相应的目录执行node index.js即可启动rstp的推流服务

前端调用代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.5.0/flv.min.js"></script>
    <style>
        #cs{
            width:300px;
            height: 600px;
           
        }
    </style>
</head>
<body>
<div id="cs">
		<button type="button" onclick="play()">开始直播</button>
    <video class="demo-video" ref="player" id = 'vedio'></video>
</div>
<script>

    let video = document.getElementById('vedio');
    let player
    if (video) {
       player = flvjs.createPlayer({
            type: "flv",
            isLive: true,
             url: `ws://127.0.0.1:8888/rtsp/1/?url=rtsp://127.0.0.1:8554/changan.E01.sdp`
        });
        player.attachMediaElement(video);
		            window.player = player

        try {
             player.load();
           // window.player = player
        } catch (error) {
            console.log(error);
        };
    }
	function play(){
	player.play()
	}
</script>
</body>
</html>

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值