全部產品
Search
文件中心

ApsaraVideo Live:錯誤異常及特殊情境處理

更新時間:Jun 30, 2024

本文介紹使用iOS推流SDK可能出現的異常情況、特殊情況,及其處理辦法。

異常與錯誤處理

推流SDK主要包含以下回調:

回調類型

回調類名

推流回調

AlivcLivePusherInfoDelegate

網路回調

AlivcLivePusherNetworkDelegate

錯誤回調

AlivcLivePusherErrorDelegate

背景音樂回調

AlivcLivePusherBGMDelegate

外置美顏、濾鏡處理相關回調

AlivcLivePusherCustomFilterDelegate

推流回調

推流回調用於向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重新播放。

對接美顏SDK

通過AlivcLivePusherCustomFilterDelegate回調來對接三方的美顏SDK,實現基礎美顏和進階美顏的功能。AlivcLivePusherCustomFilterDelegate的主要作用是將SDK內部的紋理或CVPixelBuffer回調出來,供美顏SDK處理,並將處理後的紋理或CVPixelBuffer返回給SDK,從而實現美顏效果。

基礎模式:基礎直播情境

在基礎模式下,AlivcLivePushConfig中的livePushMode開關設定為AlivcLivePushBasicMode。SDK通過AlivcLivePusherCustomFilterDelegate回調的是紋理ID,而不回調CVPixelBuffer。其核心回調如下:

  • onCreate:OpenGL上下文建立回調,通常用於在該回調裡初始化美顏引擎。

  • onProcess:OpenGL紋理更新回調,該方法將回調SDK內部的原始紋理ID。在這個回調中,調用美顏處理方法,並將處理後的紋理ID返回。

  • onDestory:OpenGL上下文銷毀回調,通常用於在該回調裡銷毀美顏引擎。

互動模式:直播連麥情境

在互動模式下,AlivcLivePushConfig中的livePushMode開關設定為AlivcLivePushInteractiveMode,SDK通過AlivcLivePusherCustomFilterDelegate可以回調CVPixelBuffer資料,也可以回調紋理ID,預設是回調CVPixelBuffer資料。

  • CVPixelBuffer回調

    在互動模式下,SDK通過onProcessVideoSampleBuffer方法預設回調CVPixelBuffer資料。只需在該回調中將CVPixelBuffer資料送入美顏處理,然後將處理後的資料寫回SDK。同時,將該方法的傳回值設定為YES,即可實現美顏效果。若傳回值為NO,則資料不會寫回SDK,也就不會有美顏效果。在 CVPixelBuffer回調模式下,AlivcLivePusherCustomFilterDelegate中除了 onProcessVideoSampleBuffer方法,其他方法都不會被回調。

    範例程式碼

    - (BOOL)onProcessVideoSampleBuffer:(AlivcLivePusher *)pusher sampleBuffer:(AlivcLiveVideoDataSample *)sampleBuffer
    {
        BOOL result = NO;
        if (self.beautyOn)
        {
            result = [[AlivcBeautyController sharedInstance] processPixelBuffer:sampleBuffer.pixelBuffer withPushOrientation:self.pushConfig.orientation];
        }
        return result;
    }
  • 紋理回調

    在互動模式下,SDK預設會回調CVPixelBuffer資料。如果將AlivcLivePushConfig中的enableLocalVideoTexture變數開關設定為YES,則會回調紋理資料。在紋理資料回調模式下,SDK將會回調除了onProcessVideoSampleBuffer之外的其他方法。

    • onCreate:OpenGL上下文建立回調,通常用於在該回調裡初始化美顏引擎。

    • onProcess:OpenGL紋理更新回調,該方法將回調SDK內部的原始紋理ID。在這個回調中,調用美顏處理方法,並將處理後的紋理ID返回。

    • onDestory:OpenGL上下文銷毀回調,通常用於在該回調裡銷毀美顏引擎。

    AlivcLivePusherCustomDetectorDelegate回調用於一些美顏SDK需要使用buffer來處理Face Service演算法,而並非所有美顏操作都需要。只有特定的美顏SDK需要使用buffer來進行Face Service。在這種情況下,通過AlivcLivePusherCustomFilterDelegate回調紋理ID來進行美顏處理,而通過AlivcLivePusherCustomDetectorDelegate回調buffer來進行Face Service。若將CVPixelBuffer回調傳遞給美顏SDK,則無需處理此回調。

    如果美顏SDK需要使用buffer來處理Face Service演算法,應使用onDetectorProcess回呼函數進行處理,該回呼函數將返回buffer資料。在互動模式下,如果使用紋理回調且還需要buffer資料回調,需要開啟AlivcLivePushConfig中的enableLocalVideoRawBuffer開關,以便觸發onDetectorProcess的buffer資料回調。

特殊情境處理

當網路中斷時

  • 短時間斷網和網路切換:即短時間的網路波動或者網路切換。一般情況下,中途斷網時間長度在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的Capabilities中開啟Background Mode選項,選中Audio,AirPlay and Picture in Picture。保證App退後台可以正常採集音頻。如圖:退後台和電話中

如果退後台時不需要保持音頻推流,即退入後台停止推流且返回前台繼續推流,您可以在退後台時將推流引擎銷毀,在前台後重新建立推流引擎繼續推流。

說明

在此方式下,退後台必須監聽UIApplicationWillResignActiveNotification和UIApplicationDidBecomeActiveNotification,其他方式存在風險。

播放外部音效

如果您需要在推流頁播放音效音樂等,由於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文檔添加對應的依賴庫。

提交App Store審核失敗

RtsSDK提供全平台的庫,如需提交App Store,需將模擬器架構去除。您可使用lipo -remove去除x86_64架構即可。