h5直播开发之旅总结
前言
关于直播,有很多相关技术文章,这里不多说。 作为前端,我们比较关心我们所需要的。
直播的大致流程:
APP端调用摄像头 -》 拍摄视频 -》 实时上传视频 -》 服务器端获取视频并解码 -》 存储成一小段一小段视频 -》 服务器端进行推流 -》 H5或者app端通过一个url拉取视频流进行播放
实际的直播和用户播放的直播会有10秒左右或者更高的延迟,这一点对于后面开发比较重要,一定要注意这个点。
H5实现直播主要是和video标签打交道,虽然只需要拿到m3u8格式的url,通过video播放,看起来好像就是播放视频一样,但实际我们需要处理一些不可控的情况,这是非常麻烦的。 比如说,直播方网络不好,直播方关闭了摄像头,这些情况都会导致推流断掉,在文章后面,我们详细说这一块。
直播还有一个比较重要的功能,那就是评论,这里我们需要websocket来实现,其实不只是消息,还有需要通过websocket进行一些状态通知。
因为这里是移动端的项目,所以不支持PC端。如果要兼容PC的话,需要用flash来播放直播流。
直播开发之旅
① 状态控制:
目前我们先考虑直播的三种状态: 直播前,直播中,结束。
针对每个状态我们肯定会有不同的显示,这三种状态可以是三个页面,相互切换,或者一个页面,控制页面相关隐藏和显示。 可是我们怎么知道,当前主播已经切换成某种状态了呢? 通过轮询吗? 当然不是,轮询肯定是可以实现的。 不过我们用websocket,因为我们已经提前准备了websocket,所以我们可以通过服务端的推送websocket广播,当获取到的直播状态和当前状态不同,便进行相应切换。
但是有时候可能因为暂时的网络原因或者其他原因,websocket的广播消息,我们并没有获取到。 所以可以让websocket间隔性的广播直播状态。
② 评论消息监听:
我们也通过websocket拉取评论消息,这里主要的问题在服务端压力上,有可能用户评论量很大的时候,服务器压力过大,出现断连的情况。 也可能是用户网络断开,造成的断连。 一方面后端通过他们的优化来提高承载力,一方面前端和后端进行配合优化。 我们每次连接websocket服务器的时候,前端会通过接口,拿到当前承载量最小的服务器地址进行连接。 websocket如果断连了的话,是不会获得任何消息的,所以保证功能可以使用,我们还会针对websocket进行心跳检测(检查是否断开连接)。
③ 心跳 重连
因为websocket可能会存在断开连接的情况,而这时候是不会触发任何事件的,所以我们不知道它是否断开了。 那么我们设置一种消息类型,由前端发送给服务端,服务端如果返回了数据,就说明连接正常。 如果连接断开了,我们再次去请求后端接口,拿到当前承载量最小的服务器地址,进行重连。 设置一个间隔时间比如10秒,最后一次获取到服务器的消息后,如果10秒内没再收到消息,就进行一次检查,如果10秒内收到了,便重置这个时间。 之前的博客写过比较详细的心跳检测:《初探和实现websocket心跳重连》
④ video
关于video,总结起来我们要解决的那些问题,或者有些不能解决的问题,归根到底是一个问题:兼容。 兼容问题又可以分为两种:标签事件的兼容问题和浏览器表现的兼容问题。
先说video的事件兼容问题,之前测试过这一块,总之比较稳定和兼容性好点的事件如下图片圈出来的:
对,你没看错,目前对我来说好像就timeupdate比较靠谱,总之确实兼容性很差,这样会导致对video的可控性变得很低。
接着是浏览器的表现兼容问题,比如: 在微信和QQ的内置浏览器里,播放视频会自动全屏,video标签也是永远浮在页面最上层,你根本控制不了。 浮在最上层不只是X5浏览器,还有些手机只带的浏览器。 视频源出现问题的表现,播放按钮的问题,都有不同。 这些都是脱离我们代码本身,浏览器的设置,所以从代码层面上我们是没法解决的。 之前出现这些问题的时候,当然我也会看下相关直播的公司的页面,看他们是怎么解决的。 比如在微信这个流量大口他们有没有实现看起来实现不了的功能。 实际结果是,这些厂家应该是微信有合作,进行了相关定制的。 而我们本不是专门做直播的,所以没必要投入这种成本。
定制合作这个只是猜测,还不能百分百肯定,如果有谁知道,感谢告知一声!
⑤ 评论展示
本来我们想实现如下图的样式:
但是由于上面提到的问题,video浮在页面最上层,dom无法浮在video的上层。 那么我们的评论就无法展示在上图的位置,所以无奈只有放到video下方去。 根据我们的业务需求不同,目前只有这样,能勉强接受。
⑥ video推流监听
在文章最开始我们提到,推流会有一些不可控的情况,主播关闭摄像头,推送断流等,客户端断网。 这个时候在H5端的表现就是卡住,肯定会卡住。 一旦卡住之后,就算推流又重新开始了,video依然会卡在那里,不会有任何重新播放的样子。 如果推流重新开始,用户自己点击控制条的暂停,再点击播放,又可以正常播放了。 可我们不可能让用户一直点,因为你也不知道推流什么时候重新开始,或者什么时候不再是断网状态。 通过点击控制条的暂停,再点击播放便可以播放的规律,我们可以自己检查当前的状态,再用JS控制video暂停,再播放。
var video = document.getElementById('video');
video.pause();
video.play();
如何检查当前是卡住的状态呢?这里就用到我开始说的比较可靠的timeupdate事件。一旦用户是播放状态,监听timeupdate,通过对比currentTime轮询着来检查当前是否卡住。
var checkTime = null;
var checkLastTime = null;
var check = setInterval(function(){
if(checkTime != null){
if(video.paused){
//如果是暂停状态
}
if(checkTime == checkLastTime || (checkTime== 0 && checkLastTime==0)){
if(!video.paused){//如果是暂停状态,就忽略
showTip('主播离开一会儿'); //提示一下用户
video.pause();
video.src = video.src;//重置src,否则ios不会再次播放
video.play();
} }
}
checkLastTime = checkTime;
}, 10000); video.addEventListener('timeupdate', function(e){
//每次play()都会触发一次timeupdate,所以需要加个条件判断
if(checkTime != checkLastTime) hideShowTip();//隐藏上面 主播 离开的提示
checkTime = e.target.currentTime;
});
但是这样仍然会有一些问题,比如当前检测到视频卡住了,JS控制重新播放,而当前还是没有获取到推流的话。 浏览器会先loading获取视频,最后会失败显示下图的信息。 我们的检查会轮询执行,所以下面的情况会一直循环,直到视频正常播放。
这样确实有点影响体验,但是目前无解。
如果用户不是全屏播放,页面下方会有提示用户等待。
如果是全屏那么就看不到提示,不过用户这个时候可能会关闭全屏,返回到页面上,这样仍然可以看到提示。
结语:
以上就是我所遇到的h5直播开发里,比较核心的地方。 开发过程中有很多地方,需要用一些比较特别的方法去处理或者妥协, 这一点对于下游的我们也是无可奈何,解决问题的过程中,还是很有乐趣的。
h5直播开发之旅总结的更多相关文章
- 基于node.js 的 websocket的移动端H5直播开发
这一篇介绍一下基于node.js 的 websocket的移动端H5直播开发, 下载文章底部的源码,我是用vscode打开, 首先在第一个终端运行 npm run http-server 这个指令是运 ...
- h5直播
直播开发之旅 ① 状态控制: 目前我们先考虑直播的三种状态: 直播前,直播中,结束. 针对每个状态我们肯定会有不同的显示,这三种状态可以是三个页面,相互切换,或者一个页面,控制页面相关隐藏和显示. 可 ...
- 前端开发:H5直播起航
前言 前不久抽空对目前比较火的视频直播,做了下研究与探索,了解其整体实现流程,以及探讨移动端HTML5直播可行性方案. 发现目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端 ...
- 用vue开发一个app(4,一个久等了的文章)H5直播平台登录注册(1)
我上一篇关于vue的文章和这一篇时间隔了有点久了.最近终于写完了. 因为我一直想写个有点实绩的东西,而不是随便写一个教程一样东西.结合最近在项目中学到的经验和我的一点创意. 首先介绍下这是个什么! H ...
- 大熊君{{bb}}移动开发之旅(第一季)
一,开篇概述 Hi,大家好!大熊君又和大家见面了,从这篇文章开始我要和大家聊聊移动开发的话题,这部分文章共8季,分别从不同角度来讲解什么是移动开发?移动开发涉及到什么方面的技术点以及移动开发中的常见问 ...
- H5直播避坑指南
本文来自"小时光茶社(Tech Teahouse)"公众号 作者简介: 文赫,2015年加入腾讯,作为前端开发工程师参与过手Q游戏公会,游戏中心,企鹅电竞等项目,具有丰富的移动端开 ...
- wap html5播放器和直播开发小结
此文已由作者吴家联授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 去年年中的时候,借着产品改版的机会,将之前的h5播放器好好整理重构了一番.之前的h5播放器较为简陋,有几个大 ...
- 一种微信直播H5直播与存储回放的HLS摄像机方案
接上篇 在上一篇博客<一种流量成本节省60%以上的手机直播微信直播H5直播幼儿园直播方案>中,我们一共介绍了两种省钱的HLS直播途径: 方案一:编码器或者内网推流直接对接云存储的场景 如果 ...
- EasyNVR H5直播流媒体解决方案前端构建之:如何播放自动适配RTMP/HLS直播播放
之前在进行EasyNVR多屏开发的时候,由于多屏功能不需要在手机端展示出来(pc多播放为RTMP,手机端播放为HLS),因此只注意到了引用videojs来进行rtmp的播放.由于不同项目需求不同,对h ...
随机推荐
- Python之路【第二篇】python基础 之基本数据类型
运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算: name = "yehaoran " # in 判断ye是否在name里面 在的话返回ok ...
- Android 网络状态检测
package com.example.administrator.yunstore.net; import android.app.AlertDialog; import android.conte ...
- sqlmap用户手册 | WooYun知识库
sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息. 原文:http://drops.wooyun.org/tips/143 ============ ...
- C及C++中typedef的简单使用指南
又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也看了不少关于typedef用法的博客.于是 ...
- 使用DataList实现数据分页的技术
今天做网站的时候,用到了分页技术,我把使用方法记录下来,以便日后查阅以及帮助新手朋友们. DataList控件可以按照列表的形式显示数据表中的多行记录,但是被显示的多行记录没有分页功能,使用起来不太方 ...
- 浅谈Js闭包现象
一.1.我们探究这个问题的时候如果按照正常的思维顺序,需要知道闭包是什么它是什么意思,但是这样做会让我们很困惑,了解这个问题我们需要知道它的来源,就是我们为什么要使用闭包,先不管它是什么意思! ...
- wamp环境 安装memcache 扩展
这两天在研究tp的memcached缓存 总是遇到坑 在网上找了很多教程看终于弄出来了现在拿出来分享 首先安装memcached下载memcache压缩包 使用cmd以管理员命令去安装 E:\wamp ...
- Mac上开启Web服务
$ sudo apachectl start$ httpd -v /Library/WebServer/Documents
- 小知识 安卓线程和ui
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 《代码的未来》读书笔记:内存管理与GC那点事儿
一.内存是有限的 近年来,我们的电脑内存都有好几个GB,也许你的电脑是4G,他的电脑是8G,公司服务器内存是32G或者64G.但是,无论内存容量有多大,总归不是无限的.实际上,随着内存容量的增加,软件 ...