本文介绍使用Android推流SDK可能出现的异常情况、特殊情况,及其处理办法。
异常与错误处理
推流SDK主要包含以下回调:
回调类型 | 回调类名 |
推流回调 | AlivcLivePushInfoListener |
网络回调 | AlivcLivePushNetworkListener |
错误回调 | AlivcLivePushErrorListener |
背景音乐回调 | AlivcLivePushBGMListener |
推流回调
推流回调用于向App通知SDK相应状态,包括预览开始、渲染第一帧视频、发送第一帧音视频流、推流开始、推流停止等回调。
onPushStarted、onFirstFramePushed:表示SDK推流成功。
onPushStarted:表示连接服务端成功。
onFirstFramePushed:表示发送第一帧音视频流成功。
网络相关回调
网络相关回调用于向App通知SDK相应网络状态和链接状态,其中有一些回调是App必须要对接的。
基础模式:基础直播场景
onConnectFail:表示推流失败,建议检查推流地址是否非法、是否存在非法字符、鉴权是否有问题、是否超过最大推流并发限制、是否在禁推黑名单中等,确定推流地址合法且可用后再尝试推流。其中具体错误码有0x30020901 ~ 0x30020905, 0x30010900 ~ 0x30010901。
onConnectionLost:链接断开回调,链接断开后SDK内部会自动重连,回抛onReconnectStart,如果超过最大重连次数(config.connectRetryCount)后推流链接还是没有恢复,会回抛onReconnectError。
onNetworkPoor:网络慢回调,当收到此回调说明当前网络对于推流的支撑度不足,此时推流仍在继续、没有中断。您可以在此处理自己的业务逻辑,比如UI提醒用户。
onNetworkRecovery:网络恢复回调。
onReconnectError:重连失败回调,表示重连失败,建议检查当前网络,待网络恢复时,重新推流。
onSendDataTimeout:送数据超时回调,建议检查当前网络,待网络恢复时,结束推流后重新开始推流。
onPushURLAuthenticationOverdue:推流地址鉴权即将过期会回调,如果您的推流开启了推流鉴权功能(推流URL中带有auth_key),我们会对推流URL做出校验。在推流URL过期前约1min,您会收到此回调,实现该回调后,您需要回传一个新的推流URL,以此保证不会因为推流地址过期而导致推流中断。
互动模式:直播连麦场景
onConnectFail:表示推流失败,建议检查连麦推流地址中token是否非法、网络是否异常等。确定推流地址合法且网络正常可用后再尝试推流。
onConnectionStatusChange:连接状态改变的回调,在该回调中会返回连接的相关状态,例如网络连接断开、建立网络连接中、网络已连接、网络连接失败等。当回调AliLiveConnectionStatusFailed状态时,表示链接无法恢复,建议检查当前网络,待网络恢复后重新推流。建议在互动模式下接入该回调,以获取连接相关状态。
onPushURLTokenWillExpire:连麦推流地址中的token即将过期。在token过期前30秒,会触发该回调。收到该回调后,应该及时向业务服务器请求带有新token的连麦推流地址,并通过refreshPushURLToken接口将新的token传入SDK。
onPushURLTokenExpired:连麦推流URL的token已经过期。该回调触发代表token鉴权信息已过期,需要在结束推流后使用新的token的URL重新推流。
onPusherNetworkQualityChanged:当前用户上行网络质量回调,当上行网络质量发生变化时,会回调当前上行网络质量评级。
onConnectionLost:链接断开回调,不同于基础模式,在互动模式下,当触发onConnectionLost回调时,表示连接无法恢复。建议检查当前网络情况,并在网络恢复后重新进行推流。
错误回调
onSystemError:系统设备异常回调,需要销毁引擎重新尝试。
onSDKError:SDK错误回调,需要根据错误码做不同的处理:
如果错误码是805438211,表示设备性能差,编码和渲染帧率过低,需要给主播提示,并在app层停掉处理耗时长的业务逻辑(比如高级美颜、动画等)。
您需要特别处理App没有麦克风权限和没有摄像头权限的回调,App没有麦克风权限错误码为268455940,App没有摄像头权限错误码为268455939。
其他的暂时都只打日志,不做其他额外操作。
背景音乐回调
onOpenFailed:背景音乐开启失败,检查背景音乐开始播放接口所传入的音乐路径与该音乐文件是否正确,可调用startBGMAsync重新播放。
onDownloadTimeout:背景音乐播放超时,多出现于播放网络URL的背景音乐,提示主播检查当前网络状态,可调用startBGMAsync重新播放。
特殊场景处理
当网络中断时
短时间断网和网络切换:即短时间的网络波动或者网络切换。一般情况下,中途断网时长在AlivcLivePushConfig设置的重连超时时长和次数范围之内,SDK会进行自动重连,重连成功之后将继续推流。若您使用阿里云播放器,建议播放器收到超时通知之后短暂延时5s后再做重连操作。
长时间断网:断网时长超出AlivcLivePushConfig设置的重连超时时长和次数范围时,SDK自动重连失败,此时会回调onReconnectError,在等到网络恢复之后调用reconnectAsync接口进行重连。同时播放器也要配合做重连操作。
建议您在SDK外部做网络监测。
主播端和播放端在客户端无法进行直接通信,需要配合服务端使用。比如主播端断网,服务端会收到CDN的推流中断回调,此时可以推送给播放端,主播推流中断,播放端再做出相应处理。恢复推流同理。
阿里云播放器重连需要先停止播放再开始播放。调用接口顺序stop>prepareAndPlay。
mPlayer.stop(); mPlayer.prepareAndPlay(mUrl);
说明关于播放器请参见阿里云播放器SDK使用说明。
后台运行和锁屏
当App退至后台或锁屏时,您可调用AlivcLivePusher的pause()或resume()接口,暂停或恢复推流。
对于非系统的音视频通话,SDK会采集声音并推送出去,您可以根据业务需求在退后台或锁屏时调用静音接口mAlivcLivePusher.setMute(true或false)来决定后台时是否采集音频。
码率设置
SDK内部有动态变化码率策略,您可以在AlivcLivePushConfig中修改码率预设值。根据产品需求对于视频分辨率、视频流畅度、视频清晰度的要求不同,对应设置的码率范围也不同,具体参考如下:
视频清晰度:推流码率越高,则视频清晰度越高。所以推流分辨率越大,所需要设置的码率也就越大,以保证视频清晰度。
视频流畅度:推流码率越高,所需要的网络带宽越大。所以在较差的网络环境下,设置较高的码率有可能影响视频流畅度。
集成多个SDK冲突
问题:集成多个独立的Android SDK时,可能出现字节码重复的冲突错误,如下: