本文為您介紹如何建立iOS播放器執行個體並提供設定音量、設定拖拽播放、監聽播放狀態、設定迴圈播放、設定倍速播放、切換音軌等基礎播放功能的使用樣本。
建立播放器
本節介紹如何用最簡單的方式讓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。
iOS播放器SDK支援4種點播播放方式,包括:UrlSource播放、VidAuth播放(ApsaraVideo for VOD使用者推薦使用)、VidSts播放、加密播放。
iOS播放器SDK支援2種直播播放方式,UrlSource播放和加密播放。
說明UrlSource是直接通過URL播放,VidSts,VidAuth是通過Vid進行播放。
接入地區Region的設定,請參見點播地區標識。
點播視訊播放
點播UrlSource播放
使用UrlSource播放方式播放點播視訊,需要將播放器的source屬性設定為播放地址。
阿里雲ApsaraVideo for VOD服務中的播放地址:可以調用GetPlayInfo介面擷取。建議您整合點播服務端SDK來擷取音視頻播放地址,免去自簽名的麻煩。調用介面擷取音視頻播放地址的樣本請參見開發人員門戶。
本地視頻地址:請確保有存取權限,可以通過系統API擷取到可訪問的本地視頻檔案完整路徑,例如:
/sdcard/xxx/xxx/xxx.mp4
或content://xxx/xxx/xx.mp4
。
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // 必選參數,播放地址,可以是第三方點播地址,或阿里雲點播服務中的播放地址,也可以是本地視頻地址。 [self.player setUrlSource:urlSource];
點播VidAuth播放(推薦)
使用VidAuth播放方式播放點播視訊,需要將播放器的vid屬性設定為音視頻ID,將playauth屬性設定為音視頻播放憑證。
音視頻ID:可以在音視頻上傳完成後通過控制台(路徑:媒資庫>音/視頻)或服務端介面(SearchMedia)擷取。
音視頻播放憑證:可以調用GetVideoPlayAuth介面擷取。建議您整合點播服務端SDK來擷取音視頻播放憑證,免去自簽名的麻煩。調用介面擷取音視頻播放憑證的樣本請參見開發人員門戶。
推薦ApsaraVideo for VOD使用者採用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有優勢,對比詳情請參見憑證方式與STS方式對比。
AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"Vid資訊"; // 必選參數,視頻ID(VideoId)。 authSource.playAuth = @"<yourPlayAuth>"; // 必選參數,播放憑證,需要調用點播服務的GetVideoPlayAuth介面產生。 authSource.region = @"接入地區"; // 5.5.5.0及之後版本播放器SDK,本參數已棄用,無需設定region,播放器會自動解析region;5.5.5.0之前版本播放器SDK,本參數必選,點播服務的接入地區,預設為cn-shanghai。 // authSource.authTimeout = 3600; // 播放地址的有效時間長度,單位:秒。該時間長度會覆蓋在ApsaraVideo for VOD控制台設定的URL鑒權的有效時間長度。如果不傳,則取預設值3600。如需設定此參數,請確保該時間大於視頻的實際時間長度,防止播放地址在播放完成前到期。 [self.player setAuthSource:authSource];
點播VidSts播放
使用點播VidSts播放方式播放點播視訊是指用STS臨時憑證而非點播音視頻播放憑證播放。STS安全性權杖和STS臨時AK對(AccessKeyId和AccessKeySecret)需要提前擷取,擷取方式請參見使用STS臨時授權方案上傳視頻。
AVPVidStsSource *source = [[AVPVidStsSource alloc] init]; source.vid = @"Vid資訊"; // 必選參數,視頻ID(VideoId)。 source.region = @"接入地區"; // 必選參數,點播服務的接入地區,預設為cn-shanghai。 source.securityToken = @"<yourSecurityToken>"; // 必選參數,STS安全性權杖,需要調用STS服務的AssumeRole介面產生。 source.accessKeySecret = @"<yourAccessKeySecret>"; // 必選參數,STS臨時AK對的存取金鑰,需要調用STS服務的AssumeRole介面產生。 source.accessKeyId = @"<yourAccessKeyId>"; // 必選參數,STS臨時AK對的存取金鑰ID,需要調用STS服務的AssumeRole介面產生。 // source.authTimeout = 3600; // 播放地址的有效時間長度,單位:秒。該時間長度會覆蓋在ApsaraVideo for VOD控制台設定的URL鑒權的有效時間長度。如果不傳,則取預設值3600。如需設定此參數,請確保該時間大於視頻的實際時間長度,防止播放地址在播放完成前到期。 // 設定播放源 [self.player setStsSource:source]
點播加密播放
點播視訊支援HLS標準加密、阿里雲私人加密和DRM加密。加密播放請參見如何播放加密視頻。
直播視頻播放
直播UrlSource播放
使用URL播放方式播放直播視頻,需要將播放器的source屬性設定為直播拉流地址。播放地址可以是第三方直播地址或阿里雲直播服務中的拉流地址。
阿里雲直播拉流地址可以通過直播控制台的地址產生器產生。詳情請參見直播地址產生器。
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // 必選參數,播放地址,可以是第三方直播地址,或阿里雲直播服務中的拉流地址。 [self.player setUrlSource:urlSource];
直播DRM加密播放
直播DRM加密播放請參見播放DRM加密視頻-Web端。
設定顯示View。
如果播放源有畫面,那麼需要設定顯示的view到播放器中,用來顯示畫面。樣本如下:
self.player.playerView = self.avpPlayerView.playerView;// 使用者顯示的view
可選:開啟自動播放,預設為關閉狀態。
self.player.autoPlay = YES;
準備播放。
調用
[self.player prepare]
開始讀取並解析資料。[self.player prepare];
開始播放。
如果未開啟自動播放,需要在
AVPEventPrepareDone
回調發生之後,擇機調用start
開始播放視頻。如果開啟了自動播放,則不需要調用
start
,資料解析完成後將開始自動播放視頻。
重要自動播放的時候將不會回調
AVPEventPrepareDone
回調,而會回調AVPEventAutoPlayStart
回調。[self.player start];
控制播放
iOS播放器SDK支援開始、暫停、從指定時間點播放等主流操作。
開始播放
開始播放視頻,由start
介面實現。樣本如下:
[self.player start];
從指定時間開始播放
跳轉到某個時刻進行播放,由seekToTime
介面實現。適用於使用者拖拽進度條,或續播等需要從指定時間點開始播放的情境。樣本如下:
// position為指定的時間。單位:毫秒。seekMode可設定為精準模式和非精準模式。
// 精準seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// 非精準seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];
暫停播放
暫停播放視頻,由pause
介面實現。樣本如下:
[self.player pause];
停止播放
停止播放視頻,由stop
介面實現。樣本如下:
[self.player stop];
設定顯示模式
iOS播放器SDK支援填充、旋轉、鏡像等顯示設定。
填充
支援設定寬高比適應、寬高比填充和展開填充這3種畫面填充模式,由scalingMode
介面實現。樣本如下:
// 設定寬高比適應(將按照視頻寬高比等比縮小到view內部,不會有畫面變形)
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// 設定寬高比填充(將按照視頻寬高比等比放大,充滿view,不會有畫面變形)
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// 設定展開填充(如果視頻寬高比例與view比例不一致,會導致畫面變形)
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
設定填充模式對畫中畫不生效。
旋轉
指畫面按指定角度旋轉,由rotateMode
介面實現。樣本如下:
// 設定畫面順時針旋轉0度
self.player.rotateMode = AVP_ROTATE_0;
// 設定畫面順時針旋轉90度
self.player.rotateMode = AVP_ROTATE_90;
// 設定畫面順時針旋轉180度
self.player.rotateMode = AVP_ROTATE_180;
// 設定畫面順時針旋轉270度
self.player.rotateMode = AVP_ROTATE_270;
鏡像
支援水平鏡像、垂直鏡像和無鏡像,由mirrorMode
介面實現。樣本如下:
// 設定無鏡像
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// 設定水平鏡像
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// 設定垂直鏡像
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;
擷取播放資訊
iOS播放器SDK支援擷取當前的播放進度、播放時間長度和緩衝進度資訊。
擷取當前播放進度
指擷取當前的播放時刻,需要在onCurrentPositionUpdate回調中擷取position。樣本如下:
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position為當前播放進度,單位為毫秒
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}
擷取播放時間長度
指擷取視頻總時間長度。需要在視頻載入完成以後才可以擷取到,比如在 onPrepared 回調之後再擷取。單位:毫秒。樣本如下:
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone: {
if (self.player.duration >= 0) {
NSString *duration = self.player.duration;
}
}
break;
default:
break;
}
}
擷取緩衝進度
指擷取視頻當前的緩衝進度,需要在onBufferedPositionUpdate回調中擷取position。樣本如下:
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
NSString *bufferPosition = position;
}
擷取即時渲染幀率、音視頻碼率、網路下行碼率
樣本如下:
// 擷取當前渲染的幀率,資料類型為Float。
[self.playergetOption:AVP_OPTION_RENDER_FPS]
// 擷取當前播放的視頻碼率,資料類型為Float,單位為bps。
[self.playergetOption:AVP_OPTION_VIDEO_BITRATE]
// 擷取當前播放的音頻碼率,資料類型為Float,單位為bps。
[self.playergetOption:AVP_OPTION_AUDIO_BITRATE]
// 擷取當前的網路下行碼率,資料類型為Float,單位為bps。
[self.playergetOption:AVP_OPTION_DOWNLOAD_BITRATE]
監聽播放狀態
指監聽播放器的狀態,onPlayerStatusChanged回調參數為當前播放器狀態。樣本如下:
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
switch (newStatus) {
case AVPStatusIdle:{
// 空轉,閑時,靜態
}
break;
case AVPStatusInitialzed:{
// 初始化完成
}
break;
case AVPStatusPrepared:{
// 準備完成
}
break;
case AVPStatusStarted:{
// 現正播放
}
break;
case AVPStatusPaused:{
// 播放暫停
}
break;
case AVPStatusStopped:{
// 播放停止
}
break;
case AVPStatusCompletion:{
// 播放完成
}
break;
case AVPStatusError:{
// 播放錯誤
}
break;
default:
break;
}
}
設定音量
設定音量包括音量大小和靜音設定。
音量大小
指調節音量大小,支援0~2倍,當音量大於1時,可能出現噪音,不推薦使用。由volume
介面實現。設定後還可擷取音量資訊。樣本如下:
// volume的值為0~2之間的實數。
self.player.volume = 1.0f;
// 擷取音量資訊。
self.player.volume
靜音設定
指將播放中的視頻設定為靜音狀態,由muted
介面實現。樣本如下:
self.player.muted = YES;
倍速播放
iOS播放器SDK提供了倍速播放視頻的功能,通過設定rate
方法,能夠以0.5倍~5倍速去播放視頻。同時保持變聲不變調。樣本如下:
// 設定倍速播放:支援0.5~5倍速的播放,通常按0.5的倍數來設定,例如0.5倍、1倍、1.5倍等
self.player.rate = 1.0f;
多清晰度設定
直播UrlSource播放方式
支援阿里雲ApsaraVideo for Live的播放地址或經直播轉碼後(現支援通用轉碼和自訂轉碼)的轉碼流地址,直播轉碼詳情請參見轉碼管理;地址擷取方式請參見產生推流地址和播放地址。
支援ARTC協議和FLV協議的直播流的不同清晰度切換。
推流的gop size需要設定為2s,網域名稱需要配置為時間戳記隨源。
切換到不符合上述要求的流地址時,會切換失敗。
切換清晰度
通過switchStream
方法切換清晰度,傳遞對應新清晰度的URL即可。
[self.player switchStream:newUrl];
清晰度切換通知
清晰度切換成功與失敗回調。
//切換成功回調
- (void)onStreamSwitchedSuccess:(AliPlayer*)player URL:(NSString*)URL;
//切換失敗回調
- (void)onStreamSwitchedFail:(AliPlayer*)player URL:(NSString*)URL errorModel:(AVPErrorModel *)errorModel;
點播Vid播放方式(VidAuth或VidSts)
如果使用Vid方式(VidAuth或VidSts)播放,無需額外設定。iOS播放器SDK會從點播服務擷取清晰度列表。iOS播放器SDK支援擷取和切換清晰度,UrlSource方式暫不支援此設定。
擷取清晰度
當視頻載入完成後,可以擷取視頻的清晰度。可以使用onTrackReady監聽回調返回info資訊,擷取清晰度trackBitrate。
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
for (int i=0; i<info.count; i++) {
AVPTrackInfo* track = [info objectAtIndex:i];
switch (track.trackType) {
case AVPTRACK_TYPE_VIDEO: {
int trackBitrate = track.trackBitrate;
}
break;
}
}
}
切換清晰度
切換清晰度通過selectTrack
方法,傳遞對應TrackInfo的index即可。
[self.playerselectTrack:index];
清晰度切換通知
清晰度切換完成回調onTrackChanged。
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
// 切換完成
}
快切模式
開啟快切模式後,手動調用selectTrack
時,都會快速得到響應。
config.selectTrackBufferMode = 1;
[self.player setConfig:config];
迴圈播放
iOS播放器SDK提供了迴圈播放視頻的功能。調用loop
開啟迴圈播放,播放完成後,將會自動從頭開始播放視頻。樣本如下:
self.player.loop = YES;
同時迴圈開始的回調將會使用AVPEventLoopingStart
中通知。樣本如下:
- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventLoopingStart:
break;
}
}
切換音軌
iOS播放器SDK提供了切換音軌的功能,適用於使用者觀看多語言配音的視頻時可以自主進行配音語言切換等情境。
使用說明
目前僅支援非列表播放流(例如MP4流)、單碼率混合HLS流、單碼率非混合HLS流的音頻流之間的切換以及多碼率混合HLS流的子流切換。各類型視頻流說明如下:
視頻流類型 | 視頻流尾碼 | 碼率數量 | 子m3u8數量 | 子流類型 | 切換說明 |
非列表播放流(例如MP4流) | .mp4 | 1 | - | 一條播放流匯聚了一路視頻流、可能多路音頻流和多路字幕流。 | 支援多路音頻流之間的切換。 |
單碼率混合HLS流 | .m3u8 | 1 | 1 | 一條播放流匯聚了一路視頻流、可能多路音頻流和多路字幕流。 | 支援多路音頻流之間的切換。 |
單碼率非混合HLS流 | .m3u8 | 1 | n | m3u8,每條子流只能是視頻流、音頻流或字幕流中的一種。 | 支援多路音頻流之間的切換。 |
多碼率混合HLS流 | .m3u8 | n | n | m3u8,每條子流匯聚了一路視頻流、可能多路音頻流和多路字幕流,不同子流之間碼率不同。 | 目前僅支援子流之間的切換,不支援子流的多路音頻流之間的切換。 |
使用樣本
設定回調。
// onSubTrackReady回調,通常發生在prepare回調之前。 - (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { // 通過getSubMediaInfo主動擷取對應的MediaInfo資訊,需要在收到onSubTrackReady回調後才可以調用,否則為空白。 AVPMediaInfo* subMediaInfo = [player getSubMediaInfo]; //遍曆 for (int i=0; i<subMediaInfo.tracks.count; i++) { AVPTrackInfo* track = [mediaInfo.tracks objectAtIndex:i]; //擷取到對應的track } }
切換音軌。
[self.player selectTrack:myTrack.trackIndex accurate:YES]
擷取SDK日誌
在播放器SDK運行過程中會產生詳細的日誌資訊,包括網路請求的狀態、系統調用的結果、許可權申請情況等各種運行事件。開發人員可以通過查看這些日誌進行代碼調試或排查問題,提高開發效率。
方式一:通過開發工具的控制台擷取播放器SDK日誌
此方式適用於在您本地可以複現問題並抓取日誌的情境。
開啟日誌並設定記錄層級。
// 開啟日誌開關 [AliPlayer setEnableLog:YES]; // 設定記錄層級,預設為LOG_LEVEL_INFO,如需排查問題,請設定為LOG_LEVEL_TRACE [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
收集日誌。
方法一:控制台查看日誌
複現問題後,可在您開發工具(例如XCode)的控制台擷取日誌。
方法二:自訂路徑將日誌輸出到檔案
開啟日誌後,在建立播放器執行個體之前,在沙箱路徑下自訂設定記錄檔的產生路徑。
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; // logFilePath為樣本路徑,可以自己在沙箱路徑下建立自訂檔案,比如xxxx.log檔案。 NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];
將日誌資訊注入到自訂檔案中。
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout); freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
複現問題後,可在您自訂設定的路徑下擷取產生的
.log
記錄檔。
方式二:通過LogCallback監聽播放器SDK的輸出日誌
此方式適用於問題發生在您的使用者側,在您本地無法複現問題並抓取日誌的情境。可以通過LogCallback監聽播放器SDK的輸出日誌,並自動輸出到您App的日誌通道中。
開啟日誌並設定記錄層級。
// 開啟日誌 [AliPlayer setEnableLog:YES]; // 設定記錄層級,預設為LOG_LEVEL_INFO,如需排查問題,請設定為LOG_LEVEL_TRACE [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) { NSLog(@"strLog:%@", strLog); }];
收集日誌。
複現問題後,日誌將通過您App的日誌通道自動輸出到您App的記錄檔。