node通过ffmpeg将多路rtsp、rtmp流媒体转换为多端口websocket流供前端播放

PlanAPlanB 2024-10-07 17:03:01 阅读 92

node通过ffmpeg将多路rtsp、rtmp流媒体转换为多端口websocket流供前端播放

这里写目录标题

node通过ffmpeg将多路rtsp、rtmp流媒体转换为多端口websocket流供前端播放1 安装node2 安装ffmpeg3 【重要】使用node搭建rtsp、rtmp转码服务器(必须要提前安装ffmpeg)4 前端(vue3)播放websocket流

1 安装node

node官网下载安装:https://nodejs.org/zh-cn/download/prebuilt-installer

2 安装ffmpeg

ffmpeg官网下载:https://ffmpeg.org/

github下载:https://github.com/FFmpeg/FFmpeg

3 【重要】使用node搭建rtsp、rtmp转码服务器(必须要提前安装ffmpeg)

<code>// 初始化项目并安装插件node-rtsp-stream

npm init -y

npm install express

npm install node-rtsp-stream

npm install get-port

新建index.js作为主文件,代码如下

const Stream = require("node-rtsp-stream"); // 引入node-rtsp-stream模块,rtsp/rtmp转码工具

const express = require("express"); // 引入express模块,http模块封装了http协议

const getPort = require("get-port");

const app = express(); // 创建一个express实例,提供http服务

/* **************************************************http-config************************************************ */

// 设置跨域资源共享

app.use((req, res, next) => { -- -->

res.header("Access-Control-Allow-Origin", "*"); // 允许任何源

res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");

res.header(

"Access-Control-Allow-Headers",

"Origin, X-Requested-With, Content-Type, Accept"

);

next();

});

app.use((req, res, next) => {

res.setHeader(

"Content-Security-Policy",

"default-src https: 'self'; script-src https: 'self' 'unsafe-inline' 'unsafe-eval' http://trusted-domain.com;"

);

next();

});

/* **************************************************var************************************************ */

// ws流使用端口列表

let PostList = [];

/* **************************************************api************************************************ */

/* 关闭组件进程未关闭 */

// Name of the stream, used to identify it in the API

// 定义接口

/* 清除某一端口任务 */

app.get("/cleraWsPort", (req, res) => {

let query = req.query;

if (PostList.length == 0) {

res.send({ status: "success", message: "未找到该端口" });

return;

}

PostList.forEach((element, index) => {

if (element.port == query.port) {

element.stream.stop();

PostList.splice(index, 1);

res.send({ status: "success", message: "关闭成功:" + port });

} else {

res.send({ status: "success", message: "未找到该端口" });

}

});

});

/* 清空所有端口任务 */

app.get("/cleraWsAll", async (req, res) => {

for (let index = 0; index < PostList.length; index++) {

await PostList[index].stream.stop();

}

PostList = [];

console.log("PostList->>>", PostList);

res.send({ status: "success", message: "已清空所有端口" });

});

/* rtmp、rtsp转weboscket流 */

app.get("/rtmpToWebsocket", (req, res) => {

let query = req.query; // 获取请求参数

// 获取该端口是否已经存在,存在则返回该端口,不存在则创建可用端口

for (let index = 0; index < PostList.length; index++) {

const element = PostList[index];

if (element.name == query.name) {

/* 存在则返回该端口 */

res.send({ port: element.port, message: "已存在该端口" });

return;

}

}

// 该视频流为发现,获取可用端口,并进行发布websocket流

getPort({ port: getPort.makeRange(20000, 21000) }) // 获取可用端口

.then((port) => {

try {

// log

console.log("rtmpUrl->>>", query.rtmpUrl);

console.log("port->>>", port);

// 创建一个Stream实例,将rtmpUrl转换为websocket流并发布到(getport)指定的端口

let stream = new Stream({

name: "name",

streamUrl: query.rtmpUrl, //query.rtmpUrl,

wsPort: port, //18965,随机端口号

wsPath: "/" + query.name, //暂时无效,如果需要使用效果需要修改videoStram.js中new WebSocket函数

/* ffmpegOptions,其他配置 */

ffmpegOptions: {

// options ffmpeg flags

"-stats": "", //

"-r": "60", //key,帧率

"-s": "1920x1080", //帧像素

},

});

PostList.push({ name: query.name, port, stream });

} catch (error) {

console.log("error->>>", error);

}

res.send({ port, message: "创建成功" });

})

.catch((err) => {

console.error(`Error: ${ err}`);

});

});

/* ************************************************http_listen************************************************ */

// 监听3000端口

app.listen(9001, () => {

console.log("Server running on http://localhost:9001");

});

// 执行命令为

node ./index.js

传参:

rtmpUrl:‘rtmp或rtsp流媒体路径’

name:‘自己随机定义,唯一标识,name重复的rtmp或rtsp不会进行转码’

请求样例:

http://127.0.0.1:9001/rtmpToWebsocket?rtmpUrl=‘rtmp://xxx’&name=‘name1’

回参样例:

{

port:‘20000’,

message: “创建成功”

}

可以通过前端播放ws://127.0.0.1:20000了

4 前端(vue3)播放websocket流

// 安装jsmpeg-player

npm i jsmpeg-player

npm i axios

<script setup>

// jsmpeg播放器

import JSMpeg from 'jsmpeg-player'

import axios from 'axios'

...

axios.get(`http://127.0.0.1:9001/rtmpToWebsocket?rtmpUrl='rtmp://xxx'&name='name1'`).then((res) => { -- -->code>

wsport = res.data.port

new JSMpeg.Player(`ws://127.0.0.1:` + wsport + `/`, { -- -->

bufferSize: 8,

videoBufferSize: 20484096,

canvas: document.getElementById('video')

})

})

...

</script>

<template>

<canvas :id="video" style="width: 100%; height: 100%"></canvas>code>

</template>



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。