浏览器播放rtsp视频流解决方案 浏览器播放rtsp流媒体
liuian 2024-12-23 12:08 56 浏览
最近项目中需要实时播放摄像头rtsp视频流,于是就专门做了些研究。而浏览器不能直接播放,只有通过插件或者转码来实现这个需求。
要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些开源的方案。这里的方案都是我尝试过了的,有些成功,有些没成功。但是因为每个项目情况不同,这次没成的方法,换个项目也许就能成。
方案一: html5 + websocket_rtsp_proxy 实现视频流直播
实现原理
实现步骤
- 服务器安装streamedian服务器
- 客户端通过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
优缺点
- 优点:实现比较简单
- 缺点:收费的,免费版有很多限制
参考链接
- html5 + websocket_rtsp_proxy 实现视频流直播
- streamedian
- html5_rtsp_player
方案二:ffmpeg + nginx + video,rtsp转rtmp播放
rtmp是adobe开发的协议,一般使用adobe media server 可以方便的搭建起来;随着开源时代的到来,有大神开发了nginx的rtmp插件,也可以直接使用nginx实现rtmp
rtmp方式的最大的优点在于低延时,经过测试延时普遍在1-3秒,可以说很实时了;缺点在于它是adobe开发的,rtmp的播放严重依赖flash,而由于flash本身的安全,现代浏览器大多禁用flash
相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~
实现步骤
- 安装ffmpeg工具
- 安装nginx 注意:linux系统需要安装 nginx-rtmp-module 模块,Windows系统安装包含rtmp的(如nginx 1.7.11.3 Gryphon)
- 更改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;
}
}
}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"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允许
参考链接
- 在 Nginx 中启用 RTMP 服务
- ffmpeg.org
- videojs
- videojs flash
方案三:ffmpeg + video,rtsp转hls播放
HLS (HTTP Live Streaming) 直播 是有苹果提出的一个基于http的协议。其原理是把整个流切分成一个个的小视频文件,然后通过一个m3u8的文件列表来管理这些视频文件
HTTP Live Streaming 并不是一个真正实时的流媒体系统,这是因为对应于媒体分段的大小和持续时间有一定潜在的时间延时。在客户端,至少在一个分段媒体文件被完全下载后才能够开始播放,而通常要求下载完两个媒体文件之后才开始播放以保证不同分段音视频之间的无缝连接。
此外,在客户端开始下载之前,必须等待服务器端的编码器和流分割器至少生成一个TS文件,这也会带来潜在的时延。
服务器软件将接收到的流每缓存一定时间后包装为一个新的TS文件,然后更新m3u8文件。m3u8文件中只保留最新的几个片段的索引,以保证观众任何时候连接进来都会看到较新的内容,实现近似直播的效果。
这种方式的理论最小延时为一个ts文件的时长,一般为2-3个ts文件的时长。
实现步骤
- 安装ffmpeg工具
- 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
- 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>参考链接
- ffmpeg hls
- videojs
- videojs-contrib-hls
方案四:VLC插件播放
播放步骤
- 下载安装vlc
- 浏览器播放
<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>优缺点
- 优点: 可以直接播放RTSP,无需任何中介服务器的帮助
- 缺点: 需要手动安装插件; 基于NPAPI,不被最新的 Chrome 和 Firefox 支持
- 如果你项目的其他功能都能兼容客户电脑上的 IE 浏览器,这个方案就是首选。
参考链接
- VLC wiki
- 插件安装方法
其他方案
WebRTC
WebRTC 是支持网页浏览器进行实时音视频的一套API,例如:HTML5 通过 webRTC 直接调用摄像头,但是如果要实现远程视频流的显示,则需要将 RTSP 转换为 WebRTC 流,供 web 端显示。
参考地址:github.com/lulop-k/kur…
h5stream
参考地址:
- github.com/liweilup/h5…
- 使用H5Stream开发实时监控系统
- H5Stream入门级应用,播放RTSP流视频
GB28181
参考地址:
- LiveGBS GB28181流媒体服务
- github
jsmpeg.js + ffmpeg + websocket + node
参考地址
- # 在web中播放rtsp视频方案对比
原文 浏览器播放rtsp视频流解决方案 - 掘金
相关推荐
- 一键ghost备份还原工具绿色版硬盘版
-
可以的。1.打开GHOST软件,接受许可协议,点击OK。2.从图像中选择Local→Partition→,3.选择镜像文件所在的分区,找到镜像文件(winxp.gho),然后单击enter。4.显示镜...
- 延缓写入失败电脑卡死(电脑显示延缓写入失败)
-
您好,请您检查下是否有人下载、网络电影等极大占据带宽的行为还有可能是您的地区网络和游戏服务器之间的网络衔接不佳,您可以使用一款网游加速器来解决希望对您有所帮助
- 手机变电脑桌面免费版(手机秒变电脑桌面下载破解版免费)
-
方法一、无需特别硬件,PC开热点手机连上即可投影,支持用PC的键鼠控制设备,如果是用来演示的话,这是解决方案之一。方法二、类似投影仪的原理这个需要设备制造商提供例如HDMI的输出支持,Android代...
- 惠普打印机墨盒怎么加墨水(惠普2622打印机怎么换墨盒)
-
惠普墨盒加墨水的步骤如下:确保墨盒已加满,取下墨盒。准备一张干净的纸,将墨盒放在上面。注意每个墨盒的顶上贴着一张胶纸,一般胶纸下面就会有注入墨水的孔。小心加墨一次挤入不能太多。如果打印墨色浅,可以在设...
- tplink无线路由器桥接教程(tplink路由器如何进行无线桥接)
-
步骤1:将扩展路由器插电源,不要插网线。步骤2:看易展路由器底部标签的SSID,打开手机的wifi设置,搜索这个wifi信号步骤3:链接上易展路由器的wifi信号步骤4:进入设置界面,部分手机可以自动...
- 怎样还原电脑原来的系统(咋样还原电脑系统)
-
首先,我们必须确保打开系统还原,否则无法恢复操作系统。在确保已打开的情况下,单击菜单,选择“附件”,点系统工具,并还原系统。接下来,打开系统还原,找到系统还原点,找到最佳适合系统还原的时间点,但确保系...
- 惠普服务中心电话(孚惠教育退费服务中心电话)
-
百脑汇里有两家鸿鹄的店面,电话分别是85133339/88609104
- win7装xp怎么装系统(windows7装xp)
-
Windows7和WindowsXP是两个不同的操作系统。但是安装的方法是相同的。第1种就是用安装盘。放入光驱以后。设置启动项以光驱优先,重启电脑,安装光盘,自动引导,按照提示一步一步的就可以安装...
- 磁盘不相邻怎么扩展卷(磁盘分区不相邻)
-
要扩展不相邻的磁盘,可以使用磁盘扩展技术,如磁盘阵列(RD)或逻辑卷管理(LVM)。RAID可以将多个磁盘组合成一个逻辑卷,提供更大的存储空间。LVM允许将多个物理卷组合成一个逻辑卷组,并在其中创建逻...
- cad2018永久激活密钥(cad 2018激活)
-
1、首先打开未激活的CAD软件,点击输入序列号。2、选择我同意后进入下一步。然后再点击界面右下角的激活。3、然后输入序列号:666-69696969和产品密钥:001J1。4、然后在界面内点选选择...
- 文件管理应用(文件管理应用同意怎么设置)
-
推荐文件极客App,免费下载,无广告无内购,功能强大。文件极客app是一款强大的本地、网络文件、iCloud文件共享管理专家,专注于iOS文件一体化管理。在文件极客里面,我们可以通过简单的拖动操作...
- ghost64下载(ghost64下载)
-
方法/步骤分步阅读1/4登陆账号首先进入AppStore,然后登陆美区id账号。2/4搜索点击顶部的搜索栏进入搜索页面。3/4查找结果在搜索结果中找到theghost,点击进入详情页面。4/4下载安...
- 一般家庭买什么电脑好(不懂电脑的人建议买联想吗)
-
家庭在使用电脑时,要根据自己的需求来选择电脑。目前电脑主要有两种,一种是笔记本,一种是台式机。1、如果是经常出门办公,比如经常出差需要带电脑,作为家庭在选择电脑时,这时由于自己经常出差带电脑,就要选择...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
