RTSP流媒体播放器

news2024/11/20 12:28:02

rtsp主要还是运用ffmpeg来搭建node后端转发到前端,前端再播放这样的思路。

这里讲的到是用两种方式,一种是ffmpeg设置成全局来实现,一种是ffmpeg放在本地目录用相对路径来引用的方式。

ffmpeg下载地址:http://www.ffmpeg.org/download.html
jsmpeg下载地址:https://jsmpeg.com/jsmpeg.min.js

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

一、设置成全局变量的方式。

1.安装ffmpeg。

1) Linux下先安装ffmpeg,详情可参考以下地址,一定要配置成全局可用。参考文档
https://blog.csdn.net/wangyongpro/article/details/104036835

2)如何配置window版本ffmpeg全局可用,先下载ffmpeg,找到ffmpeg里的路径:\ffmpeg\bin然后加入你的环境变量path里。

2.node服务器的搭建。

安装插件node-rtsp-stream, npm i --save-dev node-rtsp-stream.

创建一个index.js,代码如下

const Stream=require('node-rtsp-stream');
// 设置rtsp视频流地址
const rtsp_urls = 'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov'
const streams = new Stream({
  name: 'sockets',
  streamUrl: rtsp_urls,
  wsPort: 9998,
  ffmpegOptions: { // 选项ffmpeg标志
    '-stats': '', // 没有必要值的选项使用空字符串
    '-r': 30, // 具有必需值的选项指定键后面的值<br>    '-s':'1920*1080'
  }
})

然后运行index.js。node index.js

3.搭建前端vue

需要引入插件jsmpeg,这里可以把jsmpeg下载到本地然后将JSMpeg对象添加到window对象中,方便vue里调用,并且不会报错。

<canvas id="video-canvas" width="1366" height="750" style="width:980px;height:544px"></canvas>
export default {
  name: 'App',
  data () {
  },
  mounted () {
    require('./jsmpeg.min.js')
    const canvas = document.getElementById('video-canvas')
    var urls = 'ws://localhost:9998'
    new window.JSMpeg.Player(urls, {canvas: canvas})
  },
  beforeUnmount () {
    this.player.destory()
  }
}
</script>

至此就搭建好一个rtsp直播流的方案。

二、另一种不需要设置成全局变量的方式。

1.搭建一个Node后端服务。

需要先下载ffmpeg,可以不用配置成全局变量,就放在和node服务目录下。

先安装我们所需要的插件npm install express express-ws fluent-ffmpeg websocket-stream –save-dev

然后创建一个Index.js,代码入下

var express =  require("express");
var expressWebSocket = require("express-ws");
var ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath("./ffmpeg/bin/ffmpeg");  // 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(8888);
  console.log("express listened")
}
function rtspRequestHandle(ws, req) {
  console.log("rtsp request handle");
  const stream = webSocketStream(ws, {
    binary: true,
    browserBufferTimeout: 1000000
  }, {
    browserBufferTimeout: 1000000
  });
  let url = req.query.url;
  console.log("rtsp url:", url);
  console.log("rtsp params:", req.params);
  try {
    ffmpeg(url)
      .addInputOption("-rtsp_transport", "tcp", "-buffer_size", "102400")  // 这里可以添加一些 RTSP 优化的参数
      .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);
      })
      .on("end", function () {
        console.log(url, "Stream end!");
        // 摄像机断线的处理
      })
      .outputFormat("flv").videoCodec("copy").noAudio().pipe(stream);
  } catch (error) {
    console.log(error);
  }
}
localServer();

然后启动index.js。node index.js

2.vue前端代码

安装flv.js,npm i --save-dev flv.js

<video class="demo-video" ref="player" muted autoplay></video>
<script>
import flvjs from 'flv.js'
export default {
  name: 'App',
  data () {
    return {
      id: "1",
      rtsp: "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov", //rtsp地址
      player: null
    }
  },
  mounted () {
    if (flvjs.isSupported()) {
      let video = this.$refs.player;
      if (video) {
        this.player = flvjs.createPlayer({
          type: "flv",
          isLive: true,
          url: `ws://localhost:8888/rtsp/${this.id}/?url=${this.rtsp}`
        });
        this.player.attachMediaElement(video);
        try {
          this.player.load();
          this.player.play();
        } catch (error) {
          console.log(error);
        }
      }
    }
  },
  beforeUnmount () {
    this.player.destory()
  }
}
</script>

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1282675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嘉里大荣物流与极智嘉再度携手,合作助力物流服务高效升级

近日&#xff0c;全球仓储机器人引领者极智嘉(Geek)与3PL知名企业嘉里大荣物流联合宣布&#xff0c;双方再度携手&#xff0c;6周内共建全新自动化订单履行中心&#xff0c;赋能国际时尚运动品牌New Balance加速B2B和B2C订单交付&#xff0c;为其客户提供更高效便捷的物流服务。…

数据结构算法-插入排序算法

引言 玩纸牌 的时候。往往 需要将牌从乱序排列变成有序排列 这就是插入排序 插入排序算法思想 先看图 首先第一个元素 我默认已有序 那我们从第二个元素开始&#xff0c;依次插入到前面已有序的部分中。具体来说&#xff0c;我们将第二个元素与第一个元素比较&#xff0c;…

肺癌二期治疗效果与方案

肺腺癌II期治疗方案主要包括手术治疗、化疗、放疗等&#xff0c;建议患者积极配合医生治疗。 1、手术治疗 肺腺癌属于肺部恶性肿瘤&#xff0c;生长速度比较缓慢&#xff0c;早期患者可以通过手术的方式切除病变部位&#xff0c;能够达到根治目的&#xff0c;术后患者要注意伤…

kubeadm 安装k8s1.28.x 底层走containerd 容器

1. k8s1.28.x 的概述 1.1 k8s 1.28.x 更新 Kubernetes v1.28 是 2023 年的第二个大版本更新&#xff0c;包含了 46 项主要的更新。 而今年发布的第一个版本 v1.27 有近 60 项&#xff0c;所以可以看出来&#xff0c;在发布节奏调整后&#xff0c; 每个 Kubernetes 版本中都会包…

录视频人不在电脑旁,怎么设置定时关机

如果你平常工作比较忙&#xff0c;或者要录制的视频/音频文件需要很长时间&#xff0c;最好选择预约录制&#xff0c;这样可使录屏软件自动开始和停止录制&#xff0c;并且定时关机。此外&#xff0c;你还可以设置保存录制文件、关闭录屏软件。是不是听起来很感兴趣&#xff1f…

Qt内存泄漏工具vld使用

安装vld 下载并安装vld Github镜像站-GitHub - KindDragon/vld: Visual Leak Detector for Visual C 2008-2015 我安装在d盘的&#xff0c;如下图所示 拷贝文件 复制三个文件夹到工程目录的vld下 pro文件添加 win32: LIBS -L$$PWD/vld/lib/Win32/ -lvld INCLUDEPATH $$P…

等保测评报价相差很大,里面有什么门道

等保测评报价的差异主要源于以下几点&#xff1a; 服务质量评估标准不同&#xff1a;不同的测评机构在测评过程中所提供的服务范围、深度、细节等方面可能存在差异&#xff0c;因此导致报价有所不同。一些机构可能提供全面且细致的测评服务&#xff0c;致力于提供高质量的等保测…

软件测试真实项目案例【内附演示视频】

没有实战经验&#xff0c;简历不好编写&#xff0c;而且也不好就业。今天给大家分享一个非常适合练手的软件测试项目&#xff0c;此项目涵盖web端、app端、h5端、小程序端&#xff0c;可以说非常之全面。获取方式在文末。 项目介绍 项目名&#xff1a;XX商城 涉及端&#xf…

个人独立开发者能否踏上敏捷之路

很多软件开发团队都在使用Scrum、极限编程&#xff08;XP&#xff09;、看板等敏捷方法管理项目流程&#xff0c;持续迭代并更快、更高效地为客户持续交付可用的产品。除了团队&#xff0c;国内外很多个人独立开发者也在尝试将敏捷应用到自己的开发工作流程中&#xff0c;但大多…

git常用命令小记

&#xff08;文章正在持续更新中&#xff09; git init - 在当前目录下初始化一个新的 Git 仓库。 git clone [url] - 克隆远程仓库到本地。 git add [file] - 将文件添加到暂存区。 git commit -m "commit message" - 将添加到暂存区的文件提交到本地仓库。 git pus…

【Linux | 编程实践】 crontab 命令编辑大全 scp 应用

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

P9 链表 清空链表|销毁链表

目录 前言 01销毁链表 02 清空链表 测试代码 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ …

Redis5新特性-stream

Stream队列 Redis5.0 最大的新特性就是多出了一个数据结构 Stream&#xff0c;它是一个新的强大的 支持多播的可持久化的消息队列&#xff0c;作者声明 Redis Stream 地借鉴了 Kafka 的设计。 生产者 xadd 追加消息 xdel 删除消息&#xff0c;这里的删除仅仅是设置了标志位&am…

sqlserver2019基本操作

一、下载管理工具 sql server2019官方的管理工具是SQL Server Management Studio 简称SSMS。 下载连接: https://learn.microsoft.com/zh-CN/sql/ssms/download-sql-server-management-studio-ssms?viewsql-server-ver16二、登录 1.连接服务器 点击 文件 --> 连接对象资…

模型层——多表操作

多表操作 一 创建模型 实例&#xff1a;我们来假定下面这些概念&#xff0c;字段和关系 作者模型&#xff1a;一个作者有姓名和年龄。 作者详细模型&#xff1a;把作者的详情放到详情表&#xff0c;包含生日&#xff0c;手机号&#xff0c;家庭住址等信息。作者详情模型和作…

Python搭建代理IP池实现接口设置与整体调度

目录 前言 1. 搭建免费代理IP爬虫 2. 将获取到的代理IP存储到数据库中 3. 构建一个代理IP池 4. 实现调度器来调度代理IP池 5. 实现带有代理IP池的爬虫 总结 前言 在网络爬虫中&#xff0c;代理IP池是一个非常重要的组件。由于许多网站对单个IP的请求有限制&#xff0c;…

对点云进行凸包提取

void getConcaveHull(PointCloud::Ptr& cloud,const pcl::PointCloud<PointXYZ>::Ptr &hull) {if(cloud->points.size()<3){return ;}PointCloud ::Ptr cloud_filtered(new PointCloud());downSample(cloud,cloud_filtered);// 创建凹包提取对象pcl::Conca…

安科瑞参加全国建筑电气设计技术协作及情报交流网2023年会-安科瑞 蒋静

2023年11月19日~20日&#xff0c;广州市东方宾馆内人潮涌动&#xff0c;热闹非凡&#xff0c;全国建筑电气设计技术协作及情报交流网2023年年会暨“建筑电气传承与创新”高峰论坛在此盛大举办。 会议由全国建筑电气设计技术协作及情报交流网、中国建筑东北设计研究院有限公司主…

【numpy】np.triu的使用

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 np.triu使用&#xff0c;参数辨析 1. 正文 import numpy as nparr np.ones((3,3)) print(arr)print(np.triu(arr,0))0时&#xff0c;包含对角线上的元…

【go语言开发】Minio基本使用,包括环境搭建,接口封装和代码测试

本文主要介绍go语言使用Minio对象存储&#xff0c;首先介绍搭建minio&#xff0c;创建bucket等&#xff0c;然后讲解封装minio客户端接口&#xff0c;包括但不限于&#xff1a;上传文件&#xff0c;下载&#xff0c;获取对象url&#xff0c;最后测试开发的接口 文章目录 前言Mi…