HLS错误处理

简介: hls.js是一个JavaScript库,可实现HTTP Live Streaming客户端。 它依靠HTML5视频和MediaSource扩展进行播放。

HLS错误类型

Hls所有错误都通过唯一的单个事件发出信号。

每个错误按以下方式分类:

  • Hls.ErrorTypes.NETWORK_ERROR 对于网络相关的错误
  • Hls.ErrorTypes.MEDIA_ERROR 媒体/视频相关错误
  • Hls.ErrorTypes.OTHER_ERROR 对于所有其他错误

侦听错误示例代码:

hls.on(Hls.Events.ERROR, function (event, data) {
varerrorType=data.type;
varerrorDetails=data.details;
varerrorFatal=data.fatal;
switch (data.details) {
caseHls.ErrorDetails.FRAG_LOAD_ERROR:
// ....break;
default:
break;
}
});


致命错误恢复

hls.js 提供了通过以下 2 种方法尝试恢复致命网络和媒体错误:

  • hls.startLoad()用以恢复网络错误。
  • hls.recoverMediaError()用以恢复媒体错误。

错误恢复示例代码:

varhls=null;
functionfnCameraPlayer(id){  
varvideo=document.getElementById(id);
varvideoSrc=video.getAttribute('rtmpPath');
if (video.canPlayType('application/vnd.apple.mpegurl') ||video.canPlayType('application/x-mpegURL')) {
video.src=videoSrc;
video.addEventListener('loadedmetadata', function() {
video.play();
    });
  } elseif (Hls.isSupported()) {
hls=newHls();
hls.loadSource(videoSrc);
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED, function(event, data) {
video.play();
    });
hls.on(Hls.Events.ERROR, function (event, data) {
if (data.fatal) {  
switch(data.type) {
caseHls.ErrorTypes.NETWORK_ERROR: 
if (data.details===Hls.ErrorDetails.MANIFEST_LOAD_ERROR||data.details===Hls.ErrorDetails.MANIFEST_LOAD_TIMEOUT||data.details===Hls.ErrorDetails.MANIFEST_PARSING_ERROR) {
hls.loadSource(videoSrc)
          }
else {
hls.startLoad()
          }
break;
caseHls.ErrorTypes.MEDIA_ERROR:    
hls.recoverMediaError();
break;
default:
hls.destroy();
break;
        }
      }      
    });
  }
}


hls.swapAudioCodec()

如果调用后仍然引发媒体错误hls.recoverMediaError(),调用此方法可能有助于   解决音频解码器不匹配的问题。

工作流程应该是:

关于第一媒体错误:调用hls.recoverMediaError()

如果在第一个媒体错误之后快速引发另一个媒体错误:首先调用hls.swapAudioCodec(),然后调用hls.recoverMediaError()


参考地址:hls的使用方式

https://github.com/video-dev/hls.js/blob/master/docs/API.md#final-step-destroying-switching-between-streams

 

相关文章
|
编解码 JavaScript iOS开发
如何生成HLS协议的M3U8文件
什么是HLS协议:   HLS(Http Live Streaming)是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。
4076 0
|
20天前
|
流计算
HLS协议解析
HLS协议解析
75 1
|
9月前
|
编解码 图形学 Android开发
如何实现RTMP或RTSP播放端回调YUV/RGB数据?
今天某乎收到个问题推荐,如何实现RTSP回调YUV数据,用于二次处理? 正好前些年我们做RTSP和RTMP直播播放的时候,实现过相关的需求,本文就以Android为例,大概说说具体实现吧。
|
9月前
|
编解码 开发工具 Android开发
RTSP播放器或RTMP播放器常用的事件回调设计
很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用的event id,总的来说,有以下几个部分组成:
|
9月前
|
Linux 图形学 Android开发
Unity3D下如何实现跨平台低延迟的RTMP、RTSP播放
好多开发者,希望我们能探讨下Unity平台RTMP或RTSP直播流数据播放和录制相关的模块,实际上,这块流程我们已经聊过多次,无非就是通过原生的RTMP或者RTSP模块,先从协议层拉取到数据,并解包解码,回调YUV或RGB数据,然后,在Unity创建响应的shader,获取图像数据填充纹理即可,说起来流程很简单,但是每个环节,如果做到极致体验,都非常难。简单来说,多一次拷贝,都会增大性能瓶颈或延迟。
|
9月前
|
编解码 网络协议 开发工具
轻量级RTSP服务模块和RTSP推流模块适用场景区别
好多开发者一直搞不清轻量级RTSP服务SDK和RTSP推流SDK的区别(Github下载地址),以下是相关区别:
|
9月前
|
编解码 开发工具 Android开发
Flutter下实现低延迟的跨平台RTSP/RTMP播放
为什么要用Flutter? Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。
324 0
|
9月前
|
数据处理 开发工具 Android开发
Android平台RTMP/RTSP播放器开发系列之解码和绘制
本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github)。
|
11月前
|
容器
flv拉流在项目中如何使用(二)
这里主要是我们不能使用video容器自带的暂停和播放按钮了,我们要隐藏原来的自己实现暂停和播放。暂停和播放说白了就是断流和重新拉流
108 1
|
11月前
|
移动开发 前端开发 网络协议
flv拉流在项目中如何使用(一)
最近做的项目里面用到通过前端flv.js拉流播放直播视频(实时视频);这里给大家介绍一下流程,首先是前端发送请求后端给返回一个直播流指定地址,然后前端把这个地址通过flv处理放到video容器中进行播放;
316 0