Skip to content

timeout

mayudong1 edited this page Aug 12, 2016 · 14 revisions

超时

1. 使用说明

- (void)setTimeout:(int)prepareTimeout readTimeout:(int)readTimeout

参数说明

  • prepareTimeout,建立链接超时时间,默认值是10秒
  • readTimeout,拉流超时时间,默认值是30秒

2. 错误码

具体错误码请见:KSYMPErrorCode

KSYMPErrorCode Value 含义
KSYMPErrorCodeFileIOError -1004 读写数据异常
KSYMPErrorCodeInvalidData -10011 无效媒体数据

3. prepareTimeout

不同的CDN厂商处理拉流请求是不一样的,当从金山云CDN节点拉取直播流时,如果流名不存在,HTTP请求行为并不会返回404,而是200。并且需要耗时10秒左右。如果设置正确的prepareTimeout参数,可以尽快返回。

假设访问不存在的流名时,金山云CDN10秒后返回200 HTTP code。此时播放器finish时携带的errorCode

  • prepareTimeout小余10秒 当CDN未返回200 HTTP CODE时,已经命中播放器超时逻辑,此时返回KSYMPErrorCodeFileIOError错误码

  • prepareTimeout大于等于10秒 当CDN返回200 HTTP CODE后,播放器读取数据异常,此时返回KSYMPErrorCodeInvalidData错误码

4. readTimeout

当直播流已经开播,过程中也可能出现长时间拉取不到流的情况。一般这时候有几种原因:

  • 主播网络切换,正在断流重连;
  • 主播关闭了房间,没有音视频数据推流;
  • 源站数据异常,CDN回源拉取数据失败;
  • CDN节点内部异常,无法给播放器提供新数据;
  • 播放器所在网络异常,无法连接CDN;

当超过readTimeout阈值时,将命中读超时。命中读超时的具体现象:

  • 播放之前cache的残余音视频流;
  • 提供MPMoviePlayerPlaybackDidFinishNotification通知,错误码为KSYMPErrorCodeFileIOError

一些小经验:

主播网络切换时,主播端会进行断流重连,重新连上并推流取决于主播端的网络。为了兼容该场景,建议直播时设置较大的readTimeout阈值,比如20秒或者30秒。

特殊情况:
因为CDN会对长时间不活动的连接进行清除,而金山云CDN对长时间不活动的判定时间为30秒,所以如果readTimeout设置超过30秒时会有以下特殊情况:

  • 主播端停止或断流时间超过30秒;
    播放器会在30秒后产生MPMoviePlayerPlaybackDidFinishNotification通知,播放结束,参见结束原因
  • 播放器所在网络异常超过30秒,且小于设置的readTimeout超时时间,之后恢复;
    播放器会在网络恢复后播放一定量的残余数据,之后产生MPMoviePlayerPlaybackDidFinishNotification通知,播放结束,参见结束原因
  • 播放器所在网络异常时间超过readTimeout设置的超时时间;
    播放器会在到达设置的超时时间后产生MPMoviePlayerPlaybackDidFinishNotification通知,播放结束,参见结束原因
  • 播放器切换到后台,一定时间后重新切换到前台;
    如果APP拥有后台播放音频的权限,则不会对播放产生影响;
    如果APP没有后台权限,因为系统会在大约20秒左右后将APP的网络连接中断,此时与网络异常相似,在大约50秒后切到前台会播放一定数量的残余数据后产生MPMoviePlayerPlaybackDidFinishNotification通知;

备注

举例CDN版本为2016年8月5日版本,后续CDN会提供4xx/5xx返回码。

Clone this wiki locally