网页全终端h5浏览器视频流解决方案RTSP/FLV/HLS
背景
项目上需要基于视频巡检,在线勘查填写定制表单,降低巡检成本。
本文着重讲前端部分视频流展示解决方案。
调研
流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送数据,在网上即时传输影音以供观赏的一种技术与过程,此技术使得数据包得以像流水一样发送;如果不使用此技术,就必须在使用前下载整个媒体文件。流式传输可传送现场影音或预存于服务器上的影片,当观看者在收看这些影音文件时,影音数据在送达观看者的计算机后立即由特定播放软件播放。用户边下载边观看,而不必等待整个文件下载完毕;通过网络播放流媒体文件时,文件本身不会在本地磁盘中存储,这样就节省了大量的磁盘空间开销。流媒体实际指的是一种新的媒体传送方式,有声音流、视频流、文本流、图像流、动画流等。流媒体服务器广泛应用于视频点播、视频会议、远程教育(直播游戏或者在线课堂时候电脑窗口画面转播给其他人)、远程医疗、在线直播系统中、校园安防接入的摄像头视频流、
流媒体传输协议

- RTSP (Real-Time Streaming Protocol):
- 特点:RTSP 由Real Networks 和 Netscape共同提出的,基于文本的多媒体播放控制协议。RTSP定义流格式,流数据经由RTP传输;RTSP实时效果非常好,适合视频聊天,视频监控等方向。一般摄像头都是RTSP格式的。h5原生不支持这种格式。
- 优势:可以控制到视频帧,因此可以承载实时性很高的应用。这个优点是相对于HTTP方式的最大优点。复杂度主要集中在服务器端,可以进行倍速播放功能,其他视频协议都无法支持。 网络延时低,一般在0.5S以内;
- 缺点:就是服务器端的复杂度也比较高,实现起来也比较复杂。ios端不支持该协议,对移动端支持较弱;除了 Firefox 浏览器可以直接播放 RTSP 流之外,几乎没有其他浏览器可以直接播放 RTSP 流。RTSP协议,此协议和RTMP效果差不多,在技术上只是区别于传输数据上占用多少通道、传输格式流不太一样而已,RTSP其实也可以用于直播。但依然是因为市场环境,RTSP目前主要应用在安防监控上,和RTMP一样,早已形成了自己的盈利链。
- HTTP:
- 特点:HTTP: 当使用http协议的时候视频格式需要是m3u8或HTTP-FLV协议视频流。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息m3u8是有延迟的。并不能实时,实时传输方面不如rtmp协议。因为m3u8的直播原理是将直播源不停的压缩成指定时长的ts文件(比如9秒,10秒一个ts文件)并同时实时更新m3u8文件里的列表以达到直播的效果。这样就会有一个至少9,10秒的时间延迟。如果压缩的过小,可能导致客户端网络原因致视频变卡。HTTP-FLV 即将流媒体数据封装成 FLV 格式,然后通过 HTTP 协议传输给客户端 HTTP协议中有个约定:content-length字段,http的body部分的长度服务器回复http请求的时候如果有这个字段,客户端就接收这个长度的数据然后就认为数据传输完成了,如果服务器回复http请求中没有这个字段,客户端就一直接收数据,直到服务器跟客户端的socket连接断开。http-flv直播就是利用第二个原理,服务器回复客户端请求的时候不加content-length字段,在回复了http内容之后,紧接着发送flv数据,客户端就一直接收数据了

- 特点:HTTP: 当使用http协议的时候视频格式需要是m3u8或HTTP-FLV协议视频流。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息m3u8是有延迟的。并不能实时,实时传输方面不如rtmp协议。因为m3u8的直播原理是将直播源不停的压缩成指定时长的ts文件(比如9秒,10秒一个ts文件)并同时实时更新m3u8文件里的列表以达到直播的效果。这样就会有一个至少9,10秒的时间延迟。如果压缩的过小,可能导致客户端网络原因致视频变卡。HTTP-FLV 即将流媒体数据封装成 FLV 格式,然后通过 HTTP 协议传输给客户端 HTTP协议中有个约定:content-length字段,http的body部分的长度服务器回复http请求的时候如果有这个字段,客户端就接收这个长度的数据然后就认为数据传输完成了,如果服务器回复http请求中没有这个字段,客户端就一直接收数据,直到服务器跟客户端的socket连接断开。http-flv直播就是利用第二个原理,服务器回复客户端请求的时候不加content-length字段,在回复了http内容之后,紧接着发送flv数据,客户端就一直接收数据了
其他的有兴趣可以自行深入了解,除了HTTP、WebSocket类的传输协议,其他是无法通用地传输到浏览器的,所以,如果要做一款通用的H5视频播放器,基本上就是一款HTTP/WebSocket协议的视频播放器,如果是类似于RTMP、RTSP类型协议的视频源,是不可避免,需要经过服务器转换的。
调研社区常用轮子
下面是调研安装的依赖,下面有详细说明,最终使用的是hls.js



解决方案
在 HTML5 中播放视频流有几种解决方案,以下是一些常见的方法:
HTML5 Video 标签:HTML5 提供了
<video>标签,可以在网页上直接嵌入视频内容。你可以通过设置src属性来指定视频的 URL,然后浏览器会自动处理播放。这对于常规的视频文件(如 MP4、WebM、Ogg 等格式)非常有效。HLS(HTTP Live Streaming):HLS 是苹果推出的一种流媒体传输协议,适用于在网页上播放实时的音视频流。HLS 将视频内容切分为小块,并生成一个包含媒体资源的 M3U8 播放列表文件。HTML5 Video 标签支持 HLS,但在不同的浏览器上可能需要不同的处理方式。通常,你可以使用
video.js、hls.js等 JavaScript 库来更好地支持 HLS。MPEG-DASH(Dynamic Adaptive Streaming over HTTP):与 HLS 类似,MPEG-DASH 也是一种流媒体传输协议,适用于在网页上播放实时的音视频流。MPEG-DASH 使用
.mpd格式的播放列表文件,通过适应网络带宽动态调整视频质量。同样地,需要使用 JavaScript 库(如dash.js)来更好地支持 MPEG-DASH。WebRTC(Web Real-Time Communication):如果你需要实时通信,如视频会议或实时视频流传输,WebRTC 是一个强大的选择。它允许浏览器之间直接进行点对点的音视频传输,而不需要传统的中间服务器。
RTMP(Real-Time Messaging Protocol):RTMP 是一种流媒体传输协议,广泛用于实时视频流传输。然而,由于浏览器对 RTMP 的支持有限,通常需要使用 Flash 或其他插件来播放 RTMP 流。
服务器代理:如果服务器不支持跨域访问,你可以在你自己的服务器上设置代理,将视频流从服务器获取然后传递给前端。这样,你可以在代理服务器上处理 CORS 和其他请求头,然后将流转发给前端,避免浏览器的跨域限制。
选择适合你需求的解决方案取决于你的具体情况。你可能需要考虑浏览器兼容性、服务器支持、网络带宽等因素。
RTSP
html5 + websocket_rtsp_proxy 实现视频流直播
web页面上播放RTSP视频流,通常可以采用“jwplayer +ffmpeg+red5”的方案,由于这种方案首先将RTSP协议对应的视频流转码成RTMP协议的视频流,因此延迟通常会很高。为了降低直播的延迟,最好直接能直接在页面上播放RTSP协议的视频流。
在https://github.com/Streamedian/html5_rtsp_player提供了一种“html5_rtsp_player + websock_rtsp_proxy”的技术方案,可以通过html5的video标签直接播放RTSP的视频流。
整个架构如下图所示,分为服务器端和浏览器端两部分。

官方文档:https://streamedian.com/docs/
项目地址:https://github.com/Streamedian/html5_rtsp_player
在线测试:https://streamedian.com/demonstration/ 这个我放入链接是通了的
框架示例:https://streamedian.com/#demo
项目里面的framework/react 我是跑通了。

注意:跑的时候我把socket地址改成他们测试的地址才可以。

后来发现商用要license,于是放弃了。rtsp确实是支持的,我是考虑未来风险,其实免费的也可以用的。
HTTP HLS
在 Vue 2 中使用 hls.js 来播放 HLS(HTTP Live Streaming)流的视频需要一些设置。以下是一般步骤:
安装
hls.js包:首先,你需要在你的 Vue 2 项目中安装hls.js。你可以使用 npm 或 yarn 进行安装。在命令行中运行:npm install hls.js
或者
yarn add hls.js
在组件中引入和使用:在你的 Vue 组件中,你需要引入
hls.js,创建一个video元素,然后将 HLS URL 和hls.js实例关联起来。以下是一个简单的示例:<template>
<div>
<video ref="videoElement" controls></video>
</div>
</template> <script>
import Hls from 'hls.js'; export default {
mounted() {
this.initVideoPlayer();
},
methods: {
initVideoPlayer() {
const video = this.$refs.videoElement; if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource('YOUR_HLS_VIDEO_URL.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED, () => {
video.play();
});
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = 'YOUR_HLS_VIDEO_URL.m3u8';
video.addEventListener('loadedmetadata', () => {
video.play();
});
}
},
},
};
</script>
替换
'YOUR_HLS_VIDEO_URL.m3u8'为你实际的 HLS 视频 URL。
这个示例中,我们在 mounted 钩子中调用 initVideoPlayer 方法来初始化视频播放器。如果浏览器支持 hls.js,我们使用 Hls 类来加载 HLS 流,并将其附加到 <video> 元素。如果浏览器支持原生的 HLS 播放,我们直接使用 <video> 元素的 src 属性来播放。
请注意,这只是一个基本示例。实际中,你可能需要根据你的项目结构和需求进行适当的调整和扩展。确保在组件加载时初始化播放器,并根据需要处理错误和状态变化。
这个可行,视频很流畅清晰。

下午连好以后,看视频里的大姐吃鸡爪看了一会。
最后也有试过videojs,报错,遂弃之。

总结
h5 常用就用hls,要求更高的用RTSP,有些方案需要后端配合,跨域,ws等,可以根据实际情况选型。
其他相关文章
videojs:https://blog.csdn.net/a0405221/article/details/80923090
推拉流:https://stronger.blog.csdn.net/article/details/128989752
测试视频:https://blog.csdn.net/xia296/article/details/118651949
常见方案:https://zhuanlan.zhihu.com/p/359005370
EasyPlayer:https://github.com/tsingsee/EasyPlayer.js (star挺多,装了报错)
叮嘱
以后发现过时的文章和广告贴,看到时直接关闭。
今天经过浏览多篇文章和查阅GitHub仓库,发现网络上存在大量错误信息,导致时间浪费。
当下午最终成功运行时,我突然感到自己有些愚蠢,为什么要花费如此多的时间查看未经验证的内容。
例如,这篇文章 https://zhuanlan.zhihu.com/p/75406976,底部留言有许多人称呼为“大佬”,我尝试了一下,发现无法实施。
在此再强调一点,许多网络文章的项目前提和背景可能与您当前的情况不同,因此盲目追随可能会浪费时间。最好还是从原始信息处寻找并解决问题。
然而,对于许多不熟悉的技术或业务情境,我们可能不知道从何处寻找,可能会走弯路。在这里,我要推荐 ChatGPT,向其提问可以事半功倍。这也再次提醒了我自己!
网页全终端h5浏览器视频流解决方案RTSP/FLV/HLS的更多相关文章
- SimpleNVR安防监控RTSP/FLV/HLS直播流服务如何分权限添加用户指定通道观看
背景分析 随着SimpleNVR的用户越来越多,很多客户反馈给了我们很宝贵的简易以及用户体验.在此非常感谢大家对我们的支持.其中很多客户不想把所有的视频直播展现出来,想分权限添加新用户,指定通道让其观 ...
- EasyPlayer.js网页全终端播放器安装使用文档
EasyPlayer.js 集 rtmp, hls, flv, websocket 于一身的网页直播/点播播放器, 使用简单, 功能强大 属性(Property) video-url 视频流地址 St ...
- EasyNVR网页/微信播放RTSP摄像机HLS/RTMP播放时出现起播等待问题的优化过程
EasyNVR 项目中, 我们需要在网页/微信中嵌入 HLS 播放器, 实现直播效果. 开发过程中, 我们调研了很多HLS播放器, 包括 百度cyberplayer, ckplayer, flowpl ...
- EasyNVR智能云终端硬件与EasyNVR解决方案软件综合对比
背景分析 互联网视频直播越来越成为当前视频直播的大势,对于传统的安防监控,一般都是局限于内网,无法成批量上云台.传统的海康和大华的平台虽然可以通过自身私有协议上云平台 集总管控,但是往往只是支持自身的 ...
- 最全的CSS浏览器兼容问题(转至http://68design.net/Web-Guide/HTMLCSS/37154-1.html)
最全的CSS浏览器兼容问题 CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2 ...
- Chimee - 简单易用的H5视频播放器解决方案
Chimee是由奇舞团开源的一套H5视频播放器解决方案,由奇舞团视频云前端团队结合在业务和视频编解码方向的沉淀积累倾心打造.Chimee支持MP4.M3U8.FLV等多种媒体格式,同时它也帮我们解决了 ...
- 最全的CSS浏览器兼容问题http://www.68design.net/Web-Guide/HTMLCSS/37154-1.html
最全的CSS浏览器兼容问题 来源:68design.net 作者:邓飞飞 2008年09月23日 14:17 网友评论:7条 点击:71865 CSS 对浏览器的兼容性有时让人很头疼,或许当你了解当中 ...
- 网页直播、微信直播技术解决方案:EasyNVR与EasyDSS流媒体服务器组合之区分不同场景下的easynvr
近期遇到好多客户咨询关于实现微信直播.或者是将直播页面集成进入自己项目中. 该方案的主要目的:完成在公网一直进行内网摄像头的RTMP/HLS直播! 实现方案的具体实现: EasyNVR+EasyDSS ...
- EasyNVR H5直播流媒体解决方案前端构建之:如何播放自动适配RTMP/HLS直播播放
之前在进行EasyNVR多屏开发的时候,由于多屏功能不需要在手机端展示出来(pc多播放为RTMP,手机端播放为HLS),因此只注意到了引用videojs来进行rtmp的播放.由于不同项目需求不同,对h ...
- 【开源技术分享】无需流媒体服务,让浏览器直接播放rtsp/rtmp的神器:EasyMedia
不同于市面上其他需要各种转发到流媒体服务的中间件来说,EasyMedia不需要依赖任何nginx-rtmp,srs,zlmediakit等等第三方流媒体服务,只需要你有rtsp或者rtmp等等协议的视 ...
随机推荐
- 【Mybatis】动态SQL
目录 动态SQL if语句 动态SQL if+where语句 动态SQL if+set语句 动态SQL choose(when,otherwise)语句 动态SQL trim语句 动态SQL SQL片 ...
- 活动回顾:Flutter实时音视频应用场景实践
11月7日,即构和上海GDG技术社区联合举办了实时音视频技术云上技术分享专场,来自即构科技和Bilibili的资深技术专家进行了深度分享.大会吸引了500+开发人员交流.观看,并在活动过程中与分享嘉宾 ...
- (内附示例源码)如何通过electron构建桌面跨平台音视频应用
近年来,视频直播.直播带货.在线教育.在线医疗等音视频领域的相关行业都非常热门,成为大众瞩目的焦点. 在不久的将来,音视频技术渗透于各行各业,无处不在.从IoT网络到个人用户的移动设备,音视频技术以不 ...
- 如何根据oops函数偏移快速定位源码?
如何根据函数偏移快速定位源码? 在内核栈的输出中,你一定注意到每一个函数的输出格式都是函数名+偏移量,而这儿的偏移就是调用下一个函数的位置.那么,能不能根据函数名+偏移量直接定位源码的位置呢? 答案是 ...
- PhotoShop AI 爱国版保姆级安装和使用
上篇Photoshop AI 令人惊叹的生成式填充介绍了 PhotoShop AI 的新特性功能,有人以为我收了 Adobe 公司的钱帮它们做推广~~~.别不信,事实上确有其事,某平台审核直接把它删掉 ...
- SpringBoot项目:net.sf.jsqlparser.parser.ParseException: Encountered unexpected token:XXXXX
原文地址 写在前面 最近开发过程中,在where条件中使用IF函数,在MySQL数据库中,使用Navicat运行没有问题,但是运行项目的时候,死活过不去,一直报错,后来一番折腾找到了解决方案,所以,以 ...
- 运维自动化工具--Ansible
运维自动化工具Ansible 1. ansible安装 rocky安装 需要先安装 enel源 # yum install -y epel-release 然后再安装ansible # yum ins ...
- Linux 日志收集器:syslog,syslog-ng,rsyslog
一 参考:https://www.cnblogs.com/zhaoyong631/p/14441090.html 基本上,它们都是相同,它们都允许在中央存储库中记录来自不同类型系统的数据. 但是它们是 ...
- 使用文件批量find
有时候需要找一批文件传到本地,文件名都不一样.可以先把文件名写到文件里面,一个文件名为一行. 比如: file1.wav file2.wav file3.wav 在命令行执行: for i in `c ...
- 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找
为什么使用缓存 在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象.通过将经常使用的数据存储在缓存中,可以减少对数据库的频繁访问,从而提高系统的响应速度和性能.缓存可以将数据保 ...