-
Notifications
You must be signed in to change notification settings - Fork 145
timeout
mayudong1 edited this page Aug 12, 2016
·
14 revisions
- (void)setTimeout:(int)prepareTimeout readTimeout:(int)readTimeout
参数说明
- prepareTimeout,建立链接超时时间,默认值是10秒
- readTimeout,拉流超时时间,默认值是30秒
具体错误码请见:KSYMPErrorCode
KSYMPErrorCode | Value | 含义 |
---|---|---|
KSYMPErrorCodeFileIOError | -1004 | 读写数据异常 |
KSYMPErrorCodeInvalidData | -10011 | 无效媒体数据 |
不同的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错误码
当直播流已经开播,过程中也可能出现长时间拉取不到流的情况。一般这时候有几种原因:
- 主播网络切换,正在断流重连;
- 主播关闭了房间,没有音视频数据推流;
- 源站数据异常,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返回码。