通過閱讀本文,您可以了解iOS端阿里云播放器SDK實現超低延時直播的方法。
前提條件
環境中已安裝CocoaPods。
SDK集成
使用pod方式添加阿里云播放器SDK的依賴文件。
打開終端窗口。
進入項目所在路徑,創建Podfile文件。
pod init
編輯Podfile文件,添加最新版本的依賴。
安裝SDK。執行之后,會生成*.xcworkspace文件,表示SDK集成完畢。
pod install
阿里云播放器SDK接口使用
調用阿里云播放器SDK接口實現超低延時直播功能。更多阿里云播放器SDK功能,請參見進階功能和API說明。
以下為示例代碼。詳細代碼請參見開源項目。
基于阿里云播放器實現RTS拉流時,不能調用pause暫停直播流。您可以先調用stop停止播放,再調用prepare重新播放。
不支持seek(拖動)。
創建播放器
這部分介紹如何用最簡單的方式讓iOS播放器SDK播放視頻,按照播放方式的不同可以分為手動播放和自動播放。
創建播放器。
創建AliPlayer播放器。
說明播放器提供的播放質量監控(可查看播放器整體播放質量相關數據)、單點追查(可定位到具體的用戶或設備,分析其播放行為,快速定位播放異常等問題)及視頻播放統計功能都依賴埋點日志上報功能而實現。
在創建播放器時,根據
setTraceId
參數的設置不同,其后續可實現的功能不同,具體如下:setTraceId
參數不傳(默認):埋點日志上報功能開啟,后續可以使用播放質量監控和視頻播放統計功能,無法使用單點追查功能。setTraceId
參數傳入traceid:traceid的值由您自行定義,需為您的用戶或用戶設備的唯一標識符,例如傳入您業務的userid或者IMEI、IDFA等您業務用戶的設備ID。傳入traceid后,埋點日志上報功能開啟,后續可以使用播放質量監控、單點追查和視頻播放統計功能。setTraceId
參數設置為DisableAnalytics
:關閉埋點日志上報,后續無法使用播放質量監控、單點追查和視頻播放統計功能。
// 創建播放器 self.player = [[AliPlayer alloc] init]; // 建議傳入traceId [play setTraceID:@"xxxxxx"];
設置監聽器。
播放器支持設置多個監聽器。
prepare
必須設置,因為手動播放需要在prepare
回調中調用start
開始播放。onPlayerEvent
、onError
較為重要,建議您設置。
@interface SimplePlayerViewController ()<AVPDelegate> @end - (void)viewDidLoad { self.player = [[AliPlayer alloc] init]; self.player.playerView = self.avpPlayerView.playerView; self.player.delegate = self; //... } /** @brief 錯誤代理回調 @param player 播放器player指針 @param errorModel 播放器錯誤描述,參考AliVcPlayerErrorModel */ - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel { // 提示錯誤,及stop播放 } /** @brief 播放器事件回調 @param player 播放器player指針 @param eventType 播放器事件類型,@see AVPEventType */ -(void)onPlayerEvent:(AliPlayer*)playereventType:(AVPEventType)eventType{ switch(eventType){ caseAVPEventPrepareDone:{ // 準備完成 // 在player設置autoPlay為NO時,建議在準備完成回調中手動調用start。 [self.playerstart]; } break; case AVPEventAutoPlayStart: // 自動播放開始事件 break; case AVPEventFirstRenderedStart: // 首幀顯示 break; case AVPEventCompletion: // 播放完成 break; case AVPEventLoadingStart: // 緩沖開始 break; case AVPEventLoadingEnd: // 緩沖完成 break; case AVPEventSeekEnd: // 跳轉完成 break; case AVPEventLoopingStart: // 循環播放開始 break; default: break; } } /** @brief 視頻當前播放位置回調 @param player 播放器player指針 @param position 視頻當前播放位置 */ - (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position { // 更新進度條 } /** @brief 視頻緩存位置回調 @param player 播放器player指針 @param position 視頻當前緩存位置 */ - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position { // 更新緩沖進度 } /** @brief 獲取track信息回調 @param player 播放器player指針 @param info track流信息數組參考AVPTrackInfo */ - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { // 獲取多碼率信息 } /** @brief 字幕顯示回調 @param player 播放器player指針 @param index 字幕顯示的索引號 @param subtitle 字幕顯示的字符串 */ - (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle { // 獲取字幕進行顯示 } /** @brief 字幕隱藏回調 @param player 播放器player指針 @param index 字幕顯示的索引號 */ - (void)onSubtitleHide:(AliPlayer*)player index:(int)index { // 隱藏字幕 } /** @brief 獲取截圖回調 @param player 播放器player指針 @param image 圖像 */ - (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image { // 預覽,保存截圖 } /** @brief track切換完成回調 @param player 播放器player指針 @param info 切換后的信息參考AVPTrackInfo */ - (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info { // 切換碼率結果通知 }
創建DataSource。
播放器支持4種播放源:VidSts、VidAuth、VidMps和UrlSource。其中UrlSource是直接URL播放,需要將URL設置為
artc://
協議,才可以使用RTS服務。AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:"artc://<播流地址>"]; [self.player setUrlSource:urlSource];
設置顯示View。
如果播放源有畫面,那么需要設置顯示的view到播放器中,用來顯示畫面。示例如下:
self.player.playerView = self.avpPlayerView.playerView;// 用戶顯示的view
播放參數配置
配置播放參數,提升超低延時直播效果。
說明6.3.0版本以及之后的播放器SDK均支持自動低延時最佳配置,當播放url為“artc://”開頭,且客戶沒有手工修改過
AVPConfig
的MaxDelayTime
、HighBufferDuration
、StartBufferDuration
值時,SDK會自動分別使用1000、10、10值進行實際的播放。若想自定義控制,請參考如下示例:
//1. 獲取并修改配置 AVPConfig *config = self.aliPlayer.getConfig; if ([playUrl hasPrefix:@"artc://"]) { //最大延時為1秒 [config setMaxDelayTime:1000]; //起播緩存時長 [config setStartBufferDuration:10]; //卡頓恢復緩存時長 [config setHighBufferDuration:10]; } else { //config使用默認配置或自定義為其他配置 } //2. 應用配置 [_aliPlayer setConfig:config];
可選:開啟自動播放,默認為關閉狀態。
self.player.autoPlay = YES;
準備播放
調用
[self.player prepare]
開始讀取并解析數據。[self.player prepare];
開始播放
如果未開啟自動播放,需要在
AVPEventPrepareDone
回調發生之后,擇機調用start
開始播放視頻。如果開啟了自動播放,則不需要調用
start
,數據解析完成后將開始自動播放視頻。
重要自動播放的時候將不會回調
AVPEventPrepareDone
回調,而會回調AVPEventAutoPlayStart
回調。[self.player start];
控制播放
iOS播放器SDK支持開始、暫停、從指定時間點播放等主流操作。
開始播放
開始播放視頻,由start
接口實現。示例如下:
[self.player start];
停止播放
停止播放視頻,由stop
接口實現。示例如下:
[self.player stop];
銷毀播放器
銷毀播放器實例,有同步和異步兩種銷毀方式,示例如下:
//同步銷毀,內部會自動調用stop接口
[self.player destroy];
//異步銷毀,內部會自動調用stop接口
[self.player destroyAsync];
調用同步銷毀接口需等待播放器資源完全釋放后才返回。如果您對界面的響應速度有較高要求,建議使用異步銷毀接口,并注意以下幾點:
避免在異步銷毀過程中對播放器對象執行任何其他操作。
無需在調用異步銷毀之前手動停止播放器,因為該過程內部已經包含了異步化的停止流程。
輔助功能
日志開關
// 開啟日志 [AliPlayer setEnableLog:YES]; [AliPlayer setLogCallbackInfo:LOG_LEVEL_TRACE callbackBlock:nil]; // 關閉日志 [AliPlayer setEnableLog:NO]; [AliPlayer setLogCallbackInfo:LOG_LEVEL_NONE callbackBlock:nil];
直播降級
RTS自動降級
在使用超低延時直播RTS地址播放的場景下,當不設置RTS降級地址且RTS拉流失敗時,會自動降級到RTS對應的默認FLV地址進行播放。示例如下:
// 1表示開啟,0表示關閉。默認開啟 [AliPlayerGlobalSettings setOption:ALLOW_PRE_RENDER valueInt:1];
RTS自定義降級
在使用超低延時直播RTS地址播放的場景下,通過設置RTS的降級地址(如HLS地址或FLV地址),當RTS拉流失敗時,會自動降級到該地址播放。
//設置降級源downgradeUrl AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:downgradeUrl]; //可選,配置config其他項 AVPConfig *config = [self.player getConfig]; //設置降級URL [self.player enableDowngrade:urlSource config:config];
獲取TraceID
每一次低延時播放都會有一個traceId,可用于問題排查,可以通過播放器事件回調拿到traceid
//監聽播放器 onPlayerEvent 回調,并解析 DemuxerTraceID 消息 - (void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description { switch (eventWithString) { case EVENT_PLAYER_DEMUXER_TRACE_ID: { NSString *traceId = description; } break; default: break; } }