本文介绍使用iOS推流SDK可能出现的异常情况、特殊情况,及其处理办法。

当您收到AlivcLivePusherErrorDelegate时

  • 当出现onSystemError系统级错误时,您需要退出直播。
  • 当出现onSDKError错误(SDK错误)时,有两种处理方式,选择其一即可:销毁当前直播并重新创建,或调用restartPush或restartPushAsync重启AlivcLivePusher。
  • 您需要特别处理App没有麦克风权限和没有摄像头权限的回调,App没有麦克风权限错误码为268455940,App没有摄像头权限错误码为268455939。

当您收到AlivcLivePusherNetworkDelegate时

  • 网速慢时,回调onNetworkPoor,当您收到此回调说明当前网络对于推流的支撑度不足,此时推流仍在继续、没有中断。网络恢复时,回调onNetworkRecovery,您可以在此处理自己的业务逻辑,比如UI提醒用户。
  • 网络出现相关错误时,回调onConnectFail、onReconnectError或onSendDataTimeout。有两种处理方式,您只需选择其一:销毁当前推流并重新创建,或调用reconnectAsync进行重连,建议您重连之前先进行网络检测和推流地址检测。
  • SDK内部每次自动重连或者开发者主动调用reconnectAsync重连接口的情况下,会回调onReconnectStart重连开始。每次重连都会对RTMP进行重连链接。

    RTMP链接建立成功之后会回调onReconnectSuccess,此时只是链接建立成功,并不意味着可以推流数据成功。如果链接成功之后,由于网络等原因导致推流数据发送失败,SDK会继续重连。

  • 推流地址鉴权即将过期会回调onPushURLAuthenticationOverdue。如果您的推流开启了推流鉴权功能(推流URL中带有auth_key),我们会对推流URL做出校验。在推流URL过期前约1min,您会收到此回调,实现该回调后,您需要回传一个新的推流URL,以此保证不会因为推流地址过期而导致推流中断。示例代码如下:
    - (NSString *)onPushURLAuthenticationOverdue:(AlivcLivePusher *)pusher {
    return @"新的推流地址 rtmp://";
    }

当您收到AlivcLivePusherBGMDelegate背景音乐错误回调时

  • 背景音乐开启失败时会回调onOpenFailed,检查背景音乐开始播放接口所传入的音乐路径与该音乐文件是否正确,可调用startBGMAsync重新播放。
  • 背景音乐播放超时会回调onDownloadTimeout,多出现于播放网络URL的背景音乐,提示主播检查当前网络状态,可调用startBGMAsync重新播放。

当网络中断时

  • 短时间断网和网络切换:即短时间的网络波动或者网络切换。一般情况下,中途断网时长在AlivcLivePushConfig设置的重连超时时长和次数范围之内,SDK会进行自动重连,重连成功之后将继续推流。若您使用阿里云播放器,建议播放器收到超时通知AliVcMediaPlayerPlaybackDidFinishNotification之后,短暂延时5s后再做重连操作。
  • 长时间断网:断网时长超出AlivcLivePushConfig设置的重连超时时长和次数范围时,SDK自动重连失败,此时会回调onReconnectError:error:,等到网络恢复之后调用reconnectAsync接口进行重连。同时播放器也要配合做重连操作。
    • 建议您在SDK外部做网络监测。
    • 主播端和播放端在客户端无法进行直接通信,需要配合服务端使用。比如主播端断网,服务端会收到CDN的推流中断回调,此时可以推送给播放端,主播推流中断,播放端再做出相应处理。恢复推流同理。
    • 阿里云播放器重连需要先停止播放再开始播放。调用接口顺序stop>prepare>play。
      [self.mediaPlayer stop];
      AliVcMovieErrorCode err = [self.mediaPlayer prepareToPlay:[NSURL URLWithString:@"播放地址"]];
      if(err != ALIVC_SUCCESS) {
        NSLog(@"play failed,error code is %d",(int)err);
        return;
      }
      [self.mediaPlayer play];
      说明 关于播放器请参见阿里云播放器SDK使用说明

退后台和接听电话

SDK内部已经做好退后台相关处理,无需您做操作。退入后台SDK默认继续推流音频,视频保留在最后一帧。您需要在App的Capablities中打开Background Mode选项,选中Audio,AirPlay and Picture in Picture。保证App退后台可以正常采集音频。如图:退后台和接听电话
如果退后台时不需要保持音频推流,即退入后台停止推流,返回前台继续推流。您可以根据下面两种方式实现。
  • 退后台设置为静音模式,调用setMute接口(建议方式)。
  • 退后台停止推流,调用stopPush接口,回到前台继续推流,调用startPushWithURL或者startPushWithURLAsync接口。
    说明 在此方式下,退后台必须监听UIApplicationWillResignActiveNotification和UIApplicationDidBecomeActiveNotification,其他方式存在风险。
    - (void)addNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self                                             
        selector:@selector(applicationWillResignActive:)                                             
        name:UIApplicationWillResignActiveNotification
        object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(applicationDidBecomeActive:)
        name:UIApplicationDidBecomeActiveNotification                                      
        object:nil]; 
    }
     - (void)applicationWillResignActive:(NSNotification *)notification {
    [self.livePusher stopPush];
    }
     - (void)applicationDidBecomeActive:(NSNotification *)notification {
    [self.livePusher startPushWithURLAsync:pushURL];
    }

播放外部音效

如果您需要在推流页播放音效音乐等,由于SDK暂时与AudioServicesPlaySystemSound有冲突,建议您使用AVAudioPlayer,并且在播放后需要更新设置AVAudioSession、AVAudioPlayer播放音效示例代码:
- (void)setupAudioPlayer {
   NSString *filePath = [[NSBundle
mainBundle] pathForResource:@"sound" ofType:@"wav"];
   NSURL *fileUrl = [NSURL URLWithString:filePath];
  self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:nil];
  self.player.volume = 1.0;
  [self.player prepareToPlay];
}
  - (void)playAudio {
    self.player.volume = 1.0;
    [self.player play];
    // 配置AVAudioSession
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setMode:AVAudioSessionModeVideoChat error:nil];
    [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionAllowBluetooth
| AVAudioSessionCategoryOptionMixWithOthers error:nil];
    [session setActive:YES error:nil];
}

推流过程中改变view的大小

请遍历您在调用startPreview或者startPreviewAsync接口时赋值的UIView。更改预览view的所有subView的frame。例如:
[self.livePusher startPreviewAsync:self.previewView];
for (UIView *subView in [self.previewView subviews]) {
  // ...
}

iPhoneX适配

一般场景下,预览view的frame设置为全屏可以正常预览,由于iPhoneX屏幕比例的特殊性,所以iPhoneX下预览view设置为全屏大小会有画面拉伸的现象。建议iPhoneX不要使用全屏大小的view来预览。

码率设置

SDK内部有动态变化码率策略,您可以在AlivcLivePushConfig中修改码率预设值。根据产品需求对于视频分辨率、视频流畅度、视频清晰度的要求不同,对应设置的码率范围也不同,具体参考如下:
  • 视频清晰度:推流码率越高,则视频清晰度越高,所以推流分辨率越大,所需要设置的码率也就越大,以保证视频清晰度。
  • 视频流畅度:推流码率越高,所需要的网络带宽越大,所以在较差的网络环境下,设置较高的码率有可能影响视频流畅度。

编译报错

当您收到Building for iOS, but the linked and embedded framework XXX.framework' was built for iOS + iOS Simulator编译报错时,请参见如下操作:
  1. 单击Xcode菜单。
  2. 选择File > Workspace Settings进入对话框设置。
  3. 选择将build System更改为Legacy build system即可。

当编译缺少Queen的依赖库时

手动集成的情况下,出现Queen缺少依赖库的情况时,可以参见Queen_SDK_iOS文档添加对应的依赖库。