浏览器播放rtsp视频流:1、开源方案

2023-11-06

浏览器播放rtsp视频流:1、开源方案

1. 方案一: html5 + websocket_rtsp_proxy 实现视频流直播

1.1 实现原理

在这里插入图片描述

1.2 实现步骤

  • 1.服务器安装streamedian服务器

  • 2.客户端通过video标签播放

<video id="test_video" controls autoplay></video>

<script src="free.player.1.8.4.js"></script>
<script>

    if (window.Streamedian) {
        var errHandler = function(err){
            console.log('err', err.message);
        };

        var infHandler = function(inf) {
            console.log('info', inf)
        };

        var playerOptions = {
            socket: "ws://localhost:8088/ws/",
            redirectNativeMediaErrors : true,
            bufferDuration: 30,
            errorHandler: errHandler,
            infoHandler: infHandler
        };

        var html5Player  = document.getElementById("test_video");
        html5Player.src = "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov";

        var player = Streamedian.player('test_video', playerOptions);

        
        window.onbeforeunload = function(){
            player && player.destroy();
            player = null;
            Request = null;
        }
    }
</script>

注意:测试时先从官网申请license key,否则socket 只能识别localhost和127.0.0.1

1.3 优缺点

优点:实现比较简单
缺点:收费的,免费版有很多限制

1.4 参考链接

html5 + websocket_rtsp_proxy 实现视频流直播

streamedian

html5_rtsp_player

2. 方案二:ffmpeg + nginx + video,rtsp转rtmp播放

rtmp是adobe开发的协议,一般使用adobe media server 可以方便的搭建起来;随着开源时代的到来,有大神开发了nginx的rtmp插件,也可以直接使用nginx实现rtmp。

rtmp方式的最大的优点在于低延时,经过测试延时普遍在1-3秒,可以说很实时了;缺点在于它是adobe开发的,rtmp的播放严重依赖flash,而由于flash本身的安全,现代浏览器大多禁用flash。

2.1 实现步骤

  • 1.安装ffmpeg工具
  • 2.安装nginx

注意:linux系统需要安装 nginx-rtmp-module 模块,Windows系统安装包含rtmp的(如nginx 1.7.11.3 Gryphon)

    1. 更改nginx配置
rtmp{
    server{
    listen 1935;

        application live{
          live on;
          record off;
        }
        application hls{
          live on;
          hls on;
          hls_path nginx-rtmp-module/hls;
          hls_cleanup off;
        }
    }
}
  • 4.ffmpeg转码
ffmpeg -i "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov" -f flv -r 25 -s 1080*720 -an "rtmp://127.0.0.1:1935/hls/mystream"
    1. video 播放
<html>
<head>
<title>video</title>
<!-- 引入css -->
<link rel="stylesheet" type="text/css" href="./videojs/video-js.min.css" />

</head>
<body>
<video id="test_video" class="video-js vjs-default-skin vjs-big-play-centered" controls autoplay>
    <source src='rtmp://127.0.0.1:1935/hls/mystream' type='rtmp/flv'/>
</video>

</body>
</html>
<!-- 引入js -->
<script type="text/javascript" src="./videojs/video.min.js"></script>
<script type="text/javascript" src="./videojs/videojs-flash.js"></script>

<script>
videojs.options.flash.swf = "./videojs/video-js.swf"
    var player = videojs('test_video', {"autoplay":true});
    player.play();
</script>

注意:使用谷歌浏览器播放时,需要开启flash允许

2.2 参考链接

在 Nginx 中启用 RTMP 服务

ffmpeg.org

videojs

videojs flash

3. 方案三:ffmpeg + video,rtsp转hls播放

HLS (HTTP Live Streaming) 直播是由苹果提出的一个基于http的协议。其原理是把整个流切分成一个个的小视频文件,然后通过一个m3u8的文件列表来管理这些视频文件。

HTTP Live Streaming 并不是一个真正实时的流媒体系统,这是因为对应于媒体分段的大小和持续时间有一定潜在的时间延时。在客户端,至少在一个分段媒体文件被完全下载后才能够开始播放,而通常要求下载完两个媒体文件之后才开始播放以保证不同分段音视频之间的无缝连接。

此外,在客户端开始下载之前,必须等待服务器端的编码器和流分割器至少生成一个TS文件,这也会带来潜在的时延。

服务器软件将接收到的流每缓存一定时间后包装为一个新的TS文件,然后更新m3u8文件。m3u8文件中只保留最新的几个片段的索引,以保证观众任何时候连接进来都会看到较新的内容,实现近似直播的效果。

这种方式的理论最小延时为一个ts文件的时长,一般为2-3个ts文件的时长。

3.1 实现步骤

  • 1.安装ffmpeg工具
  • 2.ffmpeg转码
ffmpeg -i "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov" -c copy -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 "D:/Program Files/html/hls/test.m3u8"

ffmpeg 关于hls方面的指令说明

  • -hls_time n: 设置每片的长度,默认值为2。单位为秒

  • -hls_list_size n:设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5

  • -hls_wrap n:设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.这个选项能够避免在磁盘上存储过多的片,而且能够限制写入磁盘的最多的片的数量

  • -hls_start_number n:设置播放列表中sequence number的值为number,默认值为0

  • 3.video 播放

<html>
<head>
<title>video</title>
<!-- 引入css -->
<link rel="stylesheet" type="text/css" href="./videojs/video-js.min.css" />

</head>
<body>
<div class="videoBox">
    <video id="my_video_1" class="video-js vjs-default-skin" controls>
        <source src="http://localhost:8088/hls/test.m3u8" type="application/x-mpegURL"> 
    </video>
</div>

</body>
</html>
<script type="text/javascript" src="./videojs/video.min.js"></script>
<script type="text/javascript" src="./videojs/videojs-contrib-hls.min.js"></script>
<script>
videojs.options.flash.swf = "./videojs/video-js.swf"
    var player = videojs('my_video_1', {"autoplay":true});
    player.play();
</script>

3.2 参考链接

ffmpeg hls

videojs

videojs-contrib-hls

4. 方案四:VLC插件播放

4.1 播放步骤

  • 1.下载安装vlc
  • 2.浏览器播放
<object type='application/x-vlc-plugin' pluginspage="http://www.videolan.org/" id='vlc' events='false' width="720" height="410">
    <param name='mrl' value='rtsp://admin:12345@192.168.10.235:554/h264/ch1/main/av_stream' />
    <param name='volume' value='50' />
    <param name='autoplay' value='true' />
    <param name='loop' value='false' />
    <param name='fullscreen' value='false' />
    <param name='controls' value='false' />
</object>

4.2 优缺点

优点: 可以直接播放RTSP,无需任何中介服务器的帮助
缺点: 需要手动安装插件; 基于NPAPI,不被最新的 Chrome 和 Firefox 支持

如果你项目的其他功能都能兼容客户电脑上的 IE 浏览器,这个方案就是首选。

4.3 参考链接

VLC wiki

插件安装方法

5. 其他方案

5.1 WebRTC

WebRTC 是支持网页浏览器进行实时音视频的一套API,例如:HTML5 通过 webRTC 直接调用摄像头,但是如果要实现远程视频流的显示,则需要将 RTSP 转换为 WebRTC 流,供 web 端显示。

参考地址:https://github.com/lulop-k/kurento-rtsp2webrtc

5.2 h5stream

参考地址:

github.com/liweilup/h5…

使用H5Stream开发实时监控系统

H5Stream入门级应用,播放RTSP流视频

5.3 GB28181

参考地址:

LiveGBS GB28181流媒体服务

github

以上内容转自:

https://juejin.cn/post/6844903877217632264

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器播放rtsp视频流:1、开源方案 的相关文章

  • TensorFlow.js - 使用 CNN(卷积神经网络) 识别手写数字

    目录 index html data js script js 备注 参考文献 index html
  • 资深架构师分享:10个 Javascript 小技巧帮你提升代码质量

    主要介绍以下几点 提炼函数 合并重复的条件片段 把条件分支语句提炼成函数 合理使用循环 提前让函数退出代替嵌套条件分支 传递对象参数代替过长的参数列表 少用三目运算符 合理使用链式调用 分解大型类 本文会不断更新 不足之处欢迎评论区补充 1
  • Qt视频播放器[QMediaPlayer+QVideowidget]

    目录 参考 一 安装K Lite 解码器 二 Qt代码结构 VideoPlayer pro main cpp videoplayer h 播放器 videoplayer cpp 播放器 videoplayer ui 播放器 playersl
  • 利用 FFmpeg 批量自动生成视频封面

    最近有一个 H5 页面的需求 里面有非常多的视频 由于视频在 H5 中播放缓冲较慢 因此需要在每一个视频前面加上一个封面 从而来避免白屏的情况 主要使用的 ffmpeg 的语法 ffmpeg i input mp4 ss 00 00 00
  • OpenCV实战(29)——视频对象追踪

    OpenCV实战 29 视频对象追踪 0 前言 1 追踪视频中的对象 2 中值流追踪器算法原理 3 完整代码 小结 系列链接 0 前言 我们已经学习了如何跟踪图像序列中点和像素的运动 但在多数应用中 通常要求追踪视频中的特定移动对象 首先确
  • uniapp使用uni.createInnerAudioContext()播放指定音频并且切换

    uniapp使用uni createInnerAudioContext播放指定音频并且切换 注意 效果图 主要代码 放上所有的代码 注意 uniapp API 中 uni createInnerAudioContext 是无法多音频播放的
  • SDL无法打开音频设备的问题:Couldn‘t open audio/video device: No available audio/video device

    解决中标麒麟下SDL无法打开音频设备的问题 root登录 首先就是一定要用root登录 这个可能是权限问题 否则后面实验不能成功 安装ALSA库 首先下载alsa lib https www alsa project org main in
  • 音视频开发开发核心知识+新手入门必看基础知识

    音视频开发是一个广泛的领域 它涉及到多个技术领域 包括音频编解码 视频编解码 媒体容器格式 流媒体传输 音视频处理等 以下是音视频开发的一些基础知识 音频编解码器 音频编解码器是将数字音频信号编码成一种压缩格式 并且能够解码压缩的音频数据以
  • RTSP,RTP,RTCP协议

    一 RTSP 1 简介 实时流传输协议 是一个应用层协议 TCP IP网络体系中 它是一个多媒体播放控制协议 主要用来使用户在播放流媒体时可以像操作本地的影碟机一样进行控制 即可以对流媒体进行暂停 继续 后退和前进等控制 RTSP体系结位于
  • 【ffmpeg基础】ffmpeg音频编码

    一 aac编码 输入raw音频编码为AAC ffmpeg i input wav acodec aac y input aac 通过 acodec来指定音频编码器 视频编码器为 vcodec 也可以使用 c a来指定音频编码器 ffmpeg
  • 海思编码:1、mpp系统详谈以及VI、VPSS、VENC之间的关系

    在HiMPP手册中都会有这么一张图 先讲一下视频缓存池这个概念 视频缓存池主要向媒体业务提供大块物理内存管理功能 负责内存的分配和回收 这部分具体什么作用 首先视频输入回需要大量的内存 打比方1080P的视频输入 VI部分怎么保存或者使用呢
  • Downie 4 4.6.12 MAC上最好的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器 可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们 Downie 4 Downie 4 for Mac Downie
  • STM32之音频数据的Flash读取与DAC播放

    文章目录 一 STM32103之内部Flash原理 1 Flash介绍 2 Flash的组成 3 STM32内部框架图 二 SD卡的读写 1 实验过程 2 查看hello txt 3 从SD卡里读出数据 三 Flash地址空间的数据读取 1
  • uniapp 上传音频(H5可以App不行),并播放后端返回的音频

    1 上传 record let this this uni chooseFile count 1 默认100 extension m4a mp3 根据文件拓展名过滤 每一项都不能是空字符串 默认不过滤 success function re
  • vue项目使用视频播放器vue-video-player

    安装使用 插件有版本限制 如果项目使用的是vue2 0版本 请选择安装 4 x版本 否则会安装不成功 yarn add vue video palyer save 或者 npm install vue video palyer save 组
  • FFmpeg转码流程和常见概念

    视频格式 mkv flv mov wmv avi mp4 m3u8 ts等等 FFmpeg的转码工具 它的处理流程是这样的 从输入源获得原始的音视频数据 解封装得到压缩封装的音视频包 对音视频包进行解码 得到原始的音视频帧 对原始音视频帧进
  • 电动车低速提示音系统(AVAS)

    随着电动汽车的迅速发展 以及电动汽车的保有量也越来越多 根据车辆的特征来说电动汽车相比于传统的内燃机汽车要安静 为了保护行人 减少事故的发生 欧盟最近发布了一项关于电动车的新法规 自2019年7月1日开始 欧盟关于电动汽车的最新法律正式生效
  • 教育场景数字化中音视频小程序的发展

    教育场景数字化逐步成为刚需 2018年以来 国家对在线教育行业的监管收紧 以及受益于 5G 技术的发展 教育科技逐步走向成熟化和规范化 教育行业的本质是人与人 老师与学生 老师与家长 以及更多角色直接的沟通与互动 而仅仅是古早式的在线文字已
  • 光端机技术综述:从理论到实践的全面探索

    在当今数据驱动的时代 光端机技术 已成为通信领域的核心组成部分 从理论的深度研究到实践的广泛应用 光端机技术不断推动着信息社会的发展 成为连接不同设备和网络的关键技术 技术特点 高速数据传输 光端机 利用光纤传输数据 具有极高的传输速率 相
  • 有没有实用的视频、图片素材网站推荐?

    在作品创作中 素材网站扮演着至关重要的角色 它们提供了海量的设计资源 为设计师 艺术家和创意工作者提供了无限的可能性 本文将为您介绍几款备受推崇的素材网站 帮助您开启创意之旅 一 制片帮素材 制片帮素材是一个提供海量精品视频素材的网站 站内

随机推荐

  • 蓝牙HCI Dongle说明

    Chipsets 本项目主要实现了蓝牙Host协议栈 并没有包含Controller部分 如果需要实现蓝牙交互 按照Core Spec 需要通过HCI接口连接其他蓝牙芯片实现蓝牙功能 由于HCI接口层是Spec有规定的 所以只要符合HCI接
  • mysql基准测试 -benchmarks

    测试环境 基准测试结果 root 192 168 103 43 sql bench test insert server mysql user root password hive log Testing server MySQL 5 6
  • vue下拉框数据清空后,赋值无效

    1 页面效果 2 背景 一级项目与二级项目联动 当选择 一级项目 后 清空 二级项目 选择框内容 此时出现赋值无效的问题 3 解决 页面 method getSecondName this forceUpdate 添加this forceU
  • 兼容性 --- 页面宽度控制导航栏的显示与隐藏

    我要实现这么一个需求 当页面宽度window innerWidth gt 769的时候显示成这样 当页面宽度window innerWidth lt 769的时候 下面一行导航栏的字隐藏 显示成这样 1 首先获取这个ul 类名叫 subna
  • vue简单封装axios

    axios 封装 1 使用axios create 去封装 创建一个单独的实例 2 BaseUrl设置公共的服务器地址 3 timeOut设置访问超时时间 默认5000sm 4 设置前置请求拦截器 axios interceptors re
  • Vue + 项目优化 通过externals加载外部CDN资源

    问题 生成打包报告时 终端vue ui指令 通过可视化UI面板查看报告 在可视化的UI面板中 通过控制台和分析面板 看到项目中所存在的问题 echarts element ui quill等依赖项所占体积太大 控制台中显示 第三方依赖项占项
  • 有效延缓痴呆症:延世大学发现梯度提升机模型能准确预测 BPSD 亚综合征

    内容一览 随着人口老龄化程度不断加剧 痴呆症已经成为公共健康问题 目前医学界治疗该病还只能通过药物缓解 尚未发现治愈的有效方法 因此 预防痴呆症尤为紧迫 在这一背景下 延世大学的研究人员开发了多个预测 BPSD 的机器学习模型 并对这些模型
  • IMX6ULL NXP官方原版u-boot编译烧录体验以及出现的问题

    编译 guangjie ubuntu work imx6ull uboot imx rel imx 4 1 15 2 1 0 ga xgj cat make imx6ull emmc sh bin bash make ARCH arm CR
  • iPhone/iPad通过iSH使用adb免越狱网络连接安卓【phonesploit使用】【adb使用】【渗透工具】

    最后一次更新 2023 1 26 请勿利用文章内的相关技术从事非法测试 由于传播 利用此文所提供的信息而造成的任何直接或者间接的后果及损失 均由使用者本人负责 作者不为此承担任何责任 目录 1 前言 2 iSH 已安装且对iSH有所了解的用
  • 尺取法解决区间问题

    尺取法 尺取法通常是对数组保存一对下标 即所选取的区间的左右端点 然后根据实际情况不断地推进区间左右端点以得出答案 尺取法比直接暴力枚举区间效率高很多 尤其是数据量大的时候 所以说尺取法是一种高效的枚举区间的方法 题目 给定一个数组和一个数
  • Docker CE 镜像源站 CentOS 7 (使用yum进行安装)

    step 1 安装必要的一些系统工具 sudo yum install y yum utils device mapper persistent data lvm2 Step 2 添加软件源信息 sudo yum config manage
  • KMP算法之基础思想篇

    KMP算法是快速求字符串P 是不是字符串S的子串的一个算法 具体案例呢 可以看力扣的28题 实现 strStr 题意也很简单 就是找出P在S中出现的第一个位置 实际上就是找子串 这种最简单的方法就是暴力 直接两层for循环 O n m 的复
  • 前端实现元素拖拽的组件react-draggable

    参考官网https www npmjs com package react draggable
  • jquery绑定点击事件,随着点击次数的增加,发送的网络请求也累加,该如何避免此种情况?

    今天在用jQuery写项目的时候发现 当我点击部门与地方并来回切换的时候 发送的网络请求也是逐步累加 这样的情况很影响性能 很难通过压力测试 之所以会出现这样的原因是绑定的点击事件不是每点击一次就替换上一次的数据 他是逐步累积的 解决这个方
  • 蜻蜓刷脸支付就算是双胞胎也能轻松辨别

    随着科技的发展 我们进入了一个全新的时代 各类新鲜的行业也涌现 为了跟上人们生活所需 各个行业都要各自完善 更新更适合人们的产品 才能在这个信息的时代存活 我们告别了现金的时代 迎来了移动支付 这使得我们的生活更加的便捷 同样的节省了我们的
  • adb的安装和配置

    下载工具 解压后 进行环境配置 SDK 平台工具版本说明 Android 开发者 Android Developers 将adb exe所在路径 新建到Path中 adb version 可查看adb版本信息即可
  • NumPy 函数手册

    NumPy手册 文章目录 NumPy手册 获取属性 秩 形状 大小 元素数据类型 元素占用空间大小 内存地址 创建数组 创建空数组 创建零数组 创建1数组 创建对角矩阵 创建序列数组 创建概率分布的数组 已有列表 元组创建 切片 索引 切片
  • upload_libs通关教程

    Pass 01 js检查 只能上传jpg png gif js验证 上传php文件被拦截 删除js验证 上传成功 Pass 02 MIME Type验证 文件有MIME Type验证 可以用burpsuit抓包 修改Content Type
  • 【PostgreSQL 数据库技术峰会(成都站)】云原生虚拟数仓 PieCloudDB Database 的架构和关键模块实现...

    2023年6月17日 中国开源软件推进联盟 PostgreSQL 分会在成都举办了数据库技术峰会 此次峰会以 新机遇 新态势 新发展 为主题 结合当下信创热潮 人工智能等产业变革背景 探讨 PostgreSQL 数据库在这些新机遇下的发展前
  • 浏览器播放rtsp视频流:1、开源方案

    浏览器播放rtsp视频流 1 开源方案 文章目录 浏览器播放rtsp视频流 1 开源方案 1 方案一 html5 websocket rtsp proxy 实现视频流直播 1 1 实现原理 1 2 实现步骤 1 3 优缺点 1 4 参考链接