首页 > 编程语言 >node通过ffmpeg将多路rtsp、rtmp流媒体转换为多端口websocket流供前端播放

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

时间:2024-09-06 10:23:37浏览次数:13  
标签:node index ffmpeg res rtsp 端口 port

node通过ffmpeg将多路rtsp、rtmp流媒体转换为多端口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)

// 初始化项目并安装插件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) => {
        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>
</template>

标签:node,index,ffmpeg,res,rtsp,端口,port
From: https://blog.csdn.net/PlanAPlanB/article/details/141896401

相关文章

  • Android平台通过RTSP服务实现摄像头麦克风共享
    技术背景前些年,我们在完成Android平台RTMP直播推送模块后,遇到这样的技术需求,好多开发者希望在Android平台,实现摄像头和麦克风音视频数据采集编码打包后,对外提供RTSP(RealTimeStreamingProtocol)服务。通常,这样的技术需求,需要通过集成支持RTSP服务功能的库或自己实现轻量级的RTSP服......
  • K8S 中的 Node 管理
    1.Node的扩缩容在实际生产系统中,经常遇到服务器容量不足的情况,这时就需要购买新的服务器,对应用系统进行水平扩展以实现扩容。在k8s中,对一个新的node的加入非常简单,只需要在node节点上安装Docker、kubelet和kube-proxy服务,然后将kubelet和kube-proxy的启动参数中的master url指定为......
  • Android平台RTSP|RTMP播放器之视音频效果设置
    RTSP|RTMP播放器模块是大牛直播SDK的SmartMediaKit下非常优异的子产品,功能丰富、性能优异,毫秒级超低延迟,支持Windows、Linux(x86_64|aarch64架构)、Android、iOS平台。先看demo主界面,可以通过界面,做基础的设置,比如旋转、镜像等操作。下面就视音频效果,做个大概的介绍。视频填充效果:......
  • 基于nodejs+vue大学生心理咨询[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着社会的快速发展与竞争的日益激烈,大学生作为社会的中坚力量,其心理健康问题日益凸显,成为社会各界关注的焦点。大学生活不仅是知识学习的黄金时期,也是个人......
  • 基于nodejs+vue大学生心理咨询管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着社会的快速发展与竞争的日益激烈,大学生面临着前所未有的学业压力、就业挑战及人际关系等多方面的心理问题。这些问题若得不到及时有效的疏导和解决,可能......
  • 基于nodejs+vue大学生选课系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着高等教育的普及和信息化时代的到来,高校管理日益复杂,尤其是学生选课管理成为教学管理中的关键环节。传统的手工选课方式不仅效率低下,且容易出错,无法满足......
  • Node.js的express模块
    一、express介绍express是一个基于Node.js平台的极简、灵活的WEB应用开发框架官方网址:https://www.expressjs.com.cn/简单来说,express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用(HTTP服务)二、express使用1.express下载我们使用npm安装express在Vi......
  • Android平台RTSP|RTMP播放器(SmartPlayer)集成必读
    技术背景好多开发者拿到大牛直播SDK的Android平台RTSP、RTMP播放模块,基本上不看说明,测试后,就直接集成到自己系统了。不得不说,我们的模块虽然接口很多,功能支持全面,但是上层的demo设计逻辑确实简单,稍微有些Android开发基础的,都可以轻松处理。从高效率的角度,磨刀不误砍柴工,在模块集成......
  • 【运维监控】prometheus+node exporter+grafana 监控linux机器运行情况(完整版)
    本示例是通过prometheus的nodeexporter收集主机的信息,然后在grafana的dashborad进行展示。本示例使用到的组件均是最新的,下文中会有具体版本说明,linux环境是centos。本示例分为四个部分,即prometheus、grafana、nodeexporter的部署和三者集成的监控linux。本文旨在说明三者......
  • Node Exporter安装
    安装https://prometheus.io/download/dochttps://prometheus.io/docs/guides/node-exporter/mkdir/usr/local/prometheus&&cd/usr/local/prometheuswgethttps://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd......