基礎(chǔ)功能
本文為您介紹如何創(chuàng)建iOS播放器實(shí)例并提供設(shè)置音量、設(shè)置拖拽播放、監(jiān)聽播放狀態(tài)、設(shè)置循環(huán)播放、設(shè)置倍速播放、切換音軌等基礎(chǔ)播放功能的使用示例。
創(chuàng)建播放器
本節(jié)介紹如何用最簡單的方式讓iOS播放器SDK播放視頻,按照播放方式的不同可以分為手動播放和自動播放。
5.4.7.1及之后版本的iOS播放器SDK,在配置License后,需要在播放器實(shí)例初始化前主動調(diào)用初始化證書服務(wù)。代碼示例如下:
[AliPrivateService initLicenseService];
創(chuàng)建播放器。
創(chuàng)建AliPlayer播放器。
說明播放器提供的播放質(zhì)量監(jiān)控(可查看播放器整體播放質(zhì)量相關(guān)數(shù)據(jù))、單點(diǎn)追查(可定位到具體的用戶或設(shè)備,分析其播放行為,快速定位播放異常等問題)及視頻播放統(tǒng)計(jì)功能都依賴埋點(diǎn)日志上報(bào)功能而實(shí)現(xiàn)。
在創(chuàng)建播放器時(shí),根據(jù)
setTraceId
參數(shù)的設(shè)置不同,其后續(xù)可實(shí)現(xiàn)的功能不同,具體如下:setTraceId
參數(shù)不傳(默認(rèn)):埋點(diǎn)日志上報(bào)功能開啟,后續(xù)可以使用播放質(zhì)量監(jiān)控和視頻播放統(tǒng)計(jì)功能,無法使用單點(diǎn)追查功能。setTraceId
參數(shù)傳入traceid:traceid的值由您自行定義,需為您的用戶或用戶設(shè)備的唯一標(biāo)識符,例如傳入您業(yè)務(wù)的userid或者IMEI、IDFA等您業(yè)務(wù)用戶的設(shè)備ID。傳入traceid后,埋點(diǎn)日志上報(bào)功能開啟,后續(xù)可以使用播放質(zhì)量監(jiān)控、單點(diǎn)追查和視頻播放統(tǒng)計(jì)功能。setTraceId
參數(shù)設(shè)置為DisableAnalytics
:關(guān)閉埋點(diǎn)日志上報(bào),后續(xù)無法使用播放質(zhì)量監(jiān)控、單點(diǎn)追查和視頻播放統(tǒng)計(jì)功能。
// 創(chuàng)建播放器 self.player = [[AliPlayer alloc] init]; // 建議傳入traceId [play setTraceID:@"xxxxxx"];
設(shè)置監(jiān)聽器。
播放器支持設(shè)置多個(gè)監(jiān)聽器。
prepare
必須設(shè)置,因?yàn)槭謩硬シ判枰?span data-tag="ph" id="codeph-lo3-icz-dni" class="ph">prepare
回調(diào)中調(diào)用start
開始播放。onPlayerEvent
、onError
較為重要,建議您設(shè)置。
@interface SimplePlayerViewController ()<AVPDelegate> @end - (void)viewDidLoad { self.player = [[AliPlayer alloc] init]; self.player.playerView = self.avpPlayerView.playerView; self.player.delegate = self; //... } /** @brief 錯(cuò)誤代理回調(diào) @param player 播放器player指針 @param errorModel 播放器錯(cuò)誤描述,參考AliVcPlayerErrorModel */ - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel { // 提示錯(cuò)誤,及stop播放 } /** @brief 播放器事件回調(diào) @param player 播放器player指針 @param eventType 播放器事件類型,@see AVPEventType */ -(void)onPlayerEvent:(AliPlayer*)playereventType:(AVPEventType)eventType{ switch(eventType){ caseAVPEventPrepareDone:{ // 準(zhǔn)備完成 // 在player設(shè)置autoPlay為NO時(shí),建議在準(zhǔn)備完成回調(diào)中手動調(diào)用start。 [self.playerstart]; } break; case AVPEventAutoPlayStart: // 自動播放開始事件 break; case AVPEventFirstRenderedStart: // 首幀顯示 break; case AVPEventCompletion: // 播放完成 break; case AVPEventLoadingStart: // 緩沖開始 break; case AVPEventLoadingEnd: // 緩沖完成 break; case AVPEventSeekEnd: // 跳轉(zhuǎn)完成 break; case AVPEventLoopingStart: // 循環(huán)播放開始 break; default: break; } } /** @brief 視頻當(dāng)前播放位置回調(diào) @param player 播放器player指針 @param position 視頻當(dāng)前播放位置 */ - (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position { // 更新進(jìn)度條 } /** @brief 視頻緩存位置回調(diào) @param player 播放器player指針 @param position 視頻當(dāng)前緩存位置 */ - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position { // 更新緩沖進(jìn)度 } /** @brief 獲取track信息回調(diào) @param player 播放器player指針 @param info track流信息數(shù)組參考AVPTrackInfo */ - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { // 獲取多碼率信息 } /** @brief 字幕顯示回調(diào) @param player 播放器player指針 @param index 字幕顯示的索引號 @param subtitle 字幕顯示的字符串 */ - (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle { // 獲取字幕進(jìn)行顯示 } /** @brief 字幕隱藏回調(diào) @param player 播放器player指針 @param index 字幕顯示的索引號 */ - (void)onSubtitleHide:(AliPlayer*)player index:(int)index { // 隱藏字幕 } /** @brief 獲取截圖回調(diào) @param player 播放器player指針 @param image 圖像 */ - (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image { // 預(yù)覽,保存截圖 } /** @brief track切換完成回調(diào) @param player 播放器player指針 @param info 切換后的信息參考AVPTrackInfo */ - (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info { // 切換碼率結(jié)果通知 }
創(chuàng)建DataSource。
iOS播放器SDK支持4種點(diǎn)播播放方式,包括:UrlSource播放、VidAuth播放(視頻點(diǎn)播用戶推薦使用)、VidSts播放、加密播放。
iOS播放器SDK支持2種直播播放方式,UrlSource播放和加密播放。
說明UrlSource是直接通過URL播放,VidSts,VidAuth是通過Vid進(jìn)行播放。
接入地域Region的設(shè)置,請參見點(diǎn)播地域標(biāo)識。
點(diǎn)播視頻播放
點(diǎn)播UrlSource播放
使用UrlSource播放方式播放點(diǎn)播視頻,需要將播放器的source屬性設(shè)置為播放地址。
阿里云視頻點(diǎn)播服務(wù)中的播放地址:可以調(diào)用GetPlayInfo接口獲取。建議您集成點(diǎn)播服務(wù)端SDK來獲取音視頻播放地址,免去自簽名的麻煩。調(diào)用接口獲取音視頻播放地址的示例請參見開發(fā)者門戶。
本地視頻地址:請確保有訪問權(quán)限,可以通過系統(tǒng)API獲取到可訪問的本地視頻文件完整路徑,例如:
/sdcard/xxx/xxx/xxx.mp4
或content://xxx/xxx/xx.mp4
。
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // 必選參數(shù),播放地址,可以是第三方點(diǎn)播地址,或阿里云點(diǎn)播服務(wù)中的播放地址,也可以是本地視頻地址。 [self.player setUrlSource:urlSource];
點(diǎn)播VidAuth播放(推薦)
使用VidAuth播放方式播放點(diǎn)播視頻,需要將播放器的vid屬性設(shè)置為音視頻ID,將playauth屬性設(shè)置為音視頻播放憑證。
音視頻ID:可以在音視頻上傳完成后通過控制臺(路徑:媒資庫>音/視頻)或服務(wù)端接口(SearchMedia)獲取。
音視頻播放憑證:可以調(diào)用GetVideoPlayAuth接口獲取。建議您集成點(diǎn)播服務(wù)端SDK來獲取音視頻播放憑證,免去自簽名的麻煩。調(diào)用接口獲取音視頻播放憑證的示例請參見開發(fā)者門戶。
推薦視頻點(diǎn)播用戶采用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有優(yōu)勢,對比詳情請參見憑證方式與STS方式對比。
AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"Vid信息"; // 必選參數(shù),視頻ID(VideoId)。 authSource.playAuth = @"<yourPlayAuth>"; // 必選參數(shù),播放憑證,需要調(diào)用點(diǎn)播服務(wù)的GetVideoPlayAuth接口生成。 authSource.region = @"接入地域"; // 5.5.5.0及之后版本播放器SDK,本參數(shù)已棄用,無需設(shè)置region,播放器會自動解析region;5.5.5.0之前版本播放器SDK,本參數(shù)必選,點(diǎn)播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 // authSource.authTimeout = 3600; // 播放地址的有效時(shí)長,單位:秒。該時(shí)長會覆蓋在視頻點(diǎn)播控制臺設(shè)置的URL鑒權(quán)的有效時(shí)長。如果不傳,則取默認(rèn)值3600。如需設(shè)置此參數(shù),請確保該時(shí)間大于視頻的實(shí)際時(shí)長,防止播放地址在播放完成前過期。 [self.player setAuthSource:authSource];
點(diǎn)播VidSts播放
使用點(diǎn)播VidSts播放方式播放點(diǎn)播視頻是指用STS臨時(shí)憑證而非點(diǎn)播音視頻播放憑證播放。STS安全令牌和STS臨時(shí)AK對(AccessKeyId和AccessKeySecret)需要提前獲取,獲取方式請參見使用STS臨時(shí)授權(quán)方案上傳視頻。
AVPVidStsSource *source = [[AVPVidStsSource alloc] init]; source.vid = @"Vid信息"; // 必選參數(shù),視頻ID(VideoId)。 source.region = @"接入地域"; // 必選參數(shù),點(diǎn)播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 source.securityToken = @"<yourSecurityToken>"; // 必選參數(shù),STS安全令牌,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 source.accessKeySecret = @"<yourAccessKeySecret>"; // 必選參數(shù),STS臨時(shí)AK對的訪問密鑰,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 source.accessKeyId = @"<yourAccessKeyId>"; // 必選參數(shù),STS臨時(shí)AK對的訪問密鑰ID,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 // source.authTimeout = 3600; // 播放地址的有效時(shí)長,單位:秒。該時(shí)長會覆蓋在視頻點(diǎn)播控制臺設(shè)置的URL鑒權(quán)的有效時(shí)長。如果不傳,則取默認(rèn)值3600。如需設(shè)置此參數(shù),請確保該時(shí)間大于視頻的實(shí)際時(shí)長,防止播放地址在播放完成前過期。 // 設(shè)置播放源 [self.player setStsSource:source]
點(diǎn)播加密播放
點(diǎn)播視頻支持HLS標(biāo)準(zhǔn)加密、阿里云私有加密和DRM加密。加密播放請參見如何播放加密視頻。
直播視頻播放
直播UrlSource播放
使用URL播放方式播放直播視頻,需要將播放器的source屬性設(shè)置為直播拉流地址。播放地址可以是第三方直播地址或阿里云直播服務(wù)中的拉流地址。
阿里云直播拉流地址可以通過直播控制臺的地址生成器生成。詳情請參見直播地址生成器。
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // 必選參數(shù),播放地址,可以是第三方直播地址,或阿里云直播服務(wù)中的拉流地址。 [self.player setUrlSource:urlSource];
直播DRM加密播放
直播DRM加密播放請參見播放DRM加密視頻-Web端。
設(shè)置顯示View。
如果播放源有畫面,那么需要設(shè)置顯示的view到播放器中,用來顯示畫面。示例如下:
self.player.playerView = self.avpPlayerView.playerView;// 用戶顯示的view
可選:開啟自動播放,默認(rèn)為關(guān)閉狀態(tài)。
self.player.autoPlay = YES;
準(zhǔn)備播放。
調(diào)用
[self.player prepare]
開始讀取并解析數(shù)據(jù)。[self.player prepare];
開始播放。
如果未開啟自動播放,需要在
AVPEventPrepareDone
回調(diào)發(fā)生之后,擇機(jī)調(diào)用start
開始播放視頻。如果開啟了自動播放,則不需要調(diào)用
start
,數(shù)據(jù)解析完成后將開始自動播放視頻。
重要自動播放的時(shí)候?qū)⒉粫卣{(diào)
AVPEventPrepareDone
回調(diào),而會回調(diào)AVPEventAutoPlayStart
回調(diào)。[self.player start];
控制播放
iOS播放器SDK支持開始、暫停、從指定時(shí)間點(diǎn)播放等主流操作。
開始播放
開始播放視頻,由start
接口實(shí)現(xiàn)。示例如下:
[self.player start];
從指定時(shí)間開始播放
跳轉(zhuǎn)到某個(gè)時(shí)刻進(jìn)行播放,由seekToTime
接口實(shí)現(xiàn)。適用于用戶拖拽進(jìn)度條,或續(xù)播等需要從指定時(shí)間點(diǎn)開始播放的場景。示例如下:
// position為指定的時(shí)間。單位:毫秒。seekMode可設(shè)置為精準(zhǔn)模式和非精準(zhǔn)模式。
// 精準(zhǔn)seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// 非精準(zhǔn)seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];
以指定位置起播,僅生效一次,適用于用戶從指定時(shí)間點(diǎn)開始播放的場景。示例如下:
//以指定位置起播,每次prepare前調(diào)用,僅生效一次,time為指定的時(shí)間(毫秒),seekMode可設(shè)置為精準(zhǔn)模式和非精準(zhǔn)模式。
[self.player setStartTime:time seekMode:seekMode];
暫停播放
暫停播放視頻,由pause
接口實(shí)現(xiàn)。示例如下:
[self.player pause];
停止播放
停止播放視頻,由stop
接口實(shí)現(xiàn)。示例如下:
[self.player stop];
銷毀播放器
銷毀播放器實(shí)例,有同步和異步兩種銷毀方式,示例如下:
//同步銷毀,內(nèi)部會自動調(diào)用stop接口
[self.player destroy];
//異步銷毀,內(nèi)部會自動調(diào)用stop接口
[self.player destroyAsync];
調(diào)用同步銷毀接口需等待播放器資源完全釋放后才返回。如果您對界面的響應(yīng)速度有較高要求,建議使用異步銷毀接口,并注意以下幾點(diǎn):
避免在異步銷毀過程中對播放器對象執(zhí)行任何其他操作。
無需在調(diào)用異步銷毀之前手動停止播放器,因?yàn)樵撨^程內(nèi)部已經(jīng)包含了異步化的停止流程。
設(shè)置顯示模式
iOS播放器SDK支持填充、旋轉(zhuǎn)、鏡像等顯示設(shè)置。
填充
支持設(shè)置寬高比適應(yīng)、寬高比填充和拉伸填充這3種畫面填充模式,由scalingMode
接口實(shí)現(xiàn)。示例如下:
// 設(shè)置寬高比適應(yīng)(將按照視頻寬高比等比縮小到view內(nèi)部,不會有畫面變形)
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// 設(shè)置寬高比填充(將按照視頻寬高比等比放大,充滿view,不會有畫面變形)
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// 設(shè)置拉伸填充(如果視頻寬高比例與view比例不一致,會導(dǎo)致畫面變形)
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
設(shè)置填充模式對畫中畫不生效。
旋轉(zhuǎn)
指畫面按指定角度旋轉(zhuǎn),由rotateMode
接口實(shí)現(xiàn)。示例如下:
// 設(shè)置畫面順時(shí)針旋轉(zhuǎn)0度
self.player.rotateMode = AVP_ROTATE_0;
// 設(shè)置畫面順時(shí)針旋轉(zhuǎn)90度
self.player.rotateMode = AVP_ROTATE_90;
// 設(shè)置畫面順時(shí)針旋轉(zhuǎn)180度
self.player.rotateMode = AVP_ROTATE_180;
// 設(shè)置畫面順時(shí)針旋轉(zhuǎn)270度
self.player.rotateMode = AVP_ROTATE_270;
鏡像
支持水平鏡像、垂直鏡像和無鏡像,由mirrorMode
接口實(shí)現(xiàn)。示例如下:
// 設(shè)置無鏡像
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// 設(shè)置水平鏡像
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// 設(shè)置垂直鏡像
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;
獲取播放信息
iOS播放器SDK支持獲取當(dāng)前的播放進(jìn)度、播放時(shí)長和緩沖進(jìn)度信息。
獲取當(dāng)前播放進(jìn)度
指獲取當(dāng)前的播放時(shí)刻,需要在onCurrentPositionUpdate回調(diào)中獲取position。示例如下:
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position為當(dāng)前播放進(jìn)度,單位為毫秒
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}
獲取播放時(shí)長
指獲取視頻總時(shí)長。需要在視頻加載完成以后才可以獲取到,比如在 onPrepared 回調(diào)之后再獲取。單位:毫秒。示例如下:
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone: {
if (self.player.duration >= 0) {
NSString *duration = self.player.duration;
}
}
break;
default:
break;
}
}
獲取緩沖進(jìn)度
指獲取視頻當(dāng)前的緩沖進(jìn)度,需要在onBufferedPositionUpdate回調(diào)中獲取position。示例如下:
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
NSString *bufferPosition = position;
}
獲取實(shí)時(shí)渲染幀率、音視頻碼率、網(wǎng)絡(luò)下行碼率
示例如下:
// 獲取當(dāng)前渲染的幀率,數(shù)據(jù)類型為Float。
[self.playergetOption:AVP_OPTION_RENDER_FPS]
// 獲取當(dāng)前播放的視頻碼率,數(shù)據(jù)類型為Float,單位為bps。
[self.playergetOption:AVP_OPTION_VIDEO_BITRATE]
// 獲取當(dāng)前播放的音頻碼率,數(shù)據(jù)類型為Float,單位為bps。
[self.playergetOption:AVP_OPTION_AUDIO_BITRATE]
// 獲取當(dāng)前的網(wǎng)絡(luò)下行碼率,數(shù)據(jù)類型為Float,單位為bps。
[self.playergetOption:AVP_OPTION_DOWNLOAD_BITRATE]
監(jiān)聽播放狀態(tài)
指監(jiān)聽播放器的狀態(tài),onPlayerStatusChanged回調(diào)參數(shù)為當(dāng)前播放器狀態(tài)。示例如下:
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
switch (newStatus) {
case AVPStatusIdle:{
// 空轉(zhuǎn),閑時(shí),靜態(tài)
}
break;
case AVPStatusInitialzed:{
// 初始化完成
}
break;
case AVPStatusPrepared:{
// 準(zhǔn)備完成
}
break;
case AVPStatusStarted:{
// 正在播放
}
break;
case AVPStatusPaused:{
// 播放暫停
}
break;
case AVPStatusStopped:{
// 播放停止
}
break;
case AVPStatusCompletion:{
// 播放完成
}
break;
case AVPStatusError:{
// 播放錯(cuò)誤
}
break;
default:
break;
}
}
設(shè)置音量
設(shè)置音量包括音量調(diào)節(jié)和靜音設(shè)置。
音量調(diào)節(jié)
指調(diào)節(jié)音量大小,支持0~2倍,當(dāng)音量大于1時(shí),可能出現(xiàn)噪音,不推薦使用。由volume
接口實(shí)現(xiàn)。設(shè)置后還可獲取音量信息。示例如下:
// volume的值為0~2之間的實(shí)數(shù)。
self.player.volume = 1.0f;
// 獲取音量信息。
self.player.volume
靜音設(shè)置
指將播放中的視頻設(shè)置為靜音狀態(tài),由muted
接口實(shí)現(xiàn)。示例如下:
self.player.muted = YES;
倍速播放
iOS播放器SDK提供了倍速播放視頻的功能,通過設(shè)置rate
方法,能夠以0.5倍~5倍速去播放視頻。同時(shí)保持變聲不變調(diào)。示例如下:
// 設(shè)置倍速播放:支持0.5~5倍速的播放,通常按0.5的倍數(shù)來設(shè)置,例如0.5倍、1倍、1.5倍等
self.player.rate = 1.0f;
多清晰度設(shè)置
直播UrlSource播放方式
支持阿里云視頻直播的播放地址或經(jīng)直播轉(zhuǎn)碼后(現(xiàn)支持通用轉(zhuǎn)碼和自定義轉(zhuǎn)碼)的轉(zhuǎn)碼流地址,直播轉(zhuǎn)碼詳情請參見轉(zhuǎn)碼管理;地址獲取方式請參見生成推流地址和播放地址。
支持ARTC協(xié)議和FLV協(xié)議的直播流的不同清晰度切換。
推流的gop size需要設(shè)置為2s,域名需要配置為時(shí)間戳隨源。
切換到不符合上述要求的流地址時(shí),會切換失敗。
切換清晰度
通過switchStream
方法切換清晰度,傳遞對應(yīng)新清晰度的URL即可。
[self.player switchStream:newUrl];
清晰度切換通知
清晰度切換成功與失敗回調(diào)。
//切換成功回調(diào)
- (void)onStreamSwitchedSuccess:(AliPlayer*)player URL:(NSString*)URL;
//切換失敗回調(diào)
- (void)onStreamSwitchedFail:(AliPlayer*)player URL:(NSString*)URL errorModel:(AVPErrorModel *)errorModel;
點(diǎn)播Vid播放方式(VidAuth或VidSts)
如果使用Vid方式(VidAuth或VidSts)播放,無需額外設(shè)置。iOS播放器SDK會從點(diǎn)播服務(wù)獲取清晰度列表。iOS播放器SDK支持獲取和切換清晰度,UrlSource方式暫不支持此設(shè)置。
獲取清晰度
當(dāng)視頻加載完成后,可以獲取視頻的清晰度。可以使用onTrackReady監(jiān)聽回調(diào)返回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
方法,傳遞對應(yīng)TrackInfo的index即可。
[self.playerselectTrack:index];
清晰度切換通知
清晰度切換完成回調(diào)onTrackChanged。
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
// 切換完成
}
快切模式
開啟快切模式后,手動調(diào)用selectTrack
時(shí),都會快速得到響應(yīng)。
config.selectTrackBufferMode = 1;
[self.player setConfig:config];
循環(huán)播放
iOS播放器SDK提供了循環(huán)播放視頻的功能。調(diào)用loop
開啟循環(huán)播放,播放完成后,將會自動從頭開始播放視頻。示例如下:
self.player.loop = YES;
同時(shí)循環(huán)開始的回調(diào)將會使用AVPEventLoopingStart
中通知。示例如下:
- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventLoopingStart:
break;
}
}
切換音軌
iOS播放器SDK提供了切換音軌的功能,適用于用戶觀看多語言配音的視頻時(shí)可以自主進(jìn)行配音語言切換等場景。
使用說明
目前僅支持非列表播放流(例如MP4流)、單碼率混合HLS流、單碼率非混合HLS流的音頻流之間的切換以及多碼率混合HLS流的子流切換。各類型視頻流說明如下:
視頻流類型 | 視頻流后綴 | 碼率數(shù)量 | 子m3u8數(shù)量 | 子流類型 | 切換說明 |
非列表播放流(例如MP4流) | .mp4 | 1 | - | 一條播放流匯聚了一路視頻流、可能多路音頻流和多路字幕流。 | 支持多路音頻流之間的切換。 |
單碼率混合HLS流 | .m3u8 | 1 | 1 | 一條播放流匯聚了一路視頻流、可能多路音頻流和多路字幕流。 | 支持多路音頻流之間的切換。 |
單碼率非混合HLS流 | .m3u8 | 1 | n | m3u8,每條子流只能是視頻流、音頻流或字幕流中的一種。 | 支持多路音頻流之間的切換。 |
多碼率混合HLS流 | .m3u8 | n | n | m3u8,每條子流匯聚了一路視頻流、可能多路音頻流和多路字幕流,不同子流之間碼率不同。 | 目前僅支持子流之間的切換,不支持子流的多路音頻流之間的切換。 |
使用示例
設(shè)置回調(diào)。
// onSubTrackReady回調(diào),通常發(fā)生在prepare回調(diào)之前。 - (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { // 通過getSubMediaInfo主動獲取對應(yīng)的MediaInfo信息,需要在收到onSubTrackReady回調(diào)后才可以調(diào)用,否則為空。 AVPMediaInfo* subMediaInfo = [player getSubMediaInfo]; //遍歷 for (int i=0; i<subMediaInfo.tracks.count; i++) { AVPTrackInfo* track = [mediaInfo.tracks objectAtIndex:i]; //獲取到對應(yīng)的track } }
切換音軌。
[self.player selectTrack:myTrack.trackIndex accurate:YES]
獲取SDK日志
在播放器SDK運(yùn)行過程中會生成詳細(xì)的日志信息,包括網(wǎng)絡(luò)請求的狀態(tài)、系統(tǒng)調(diào)用的結(jié)果、權(quán)限申請情況等各種運(yùn)行事件。開發(fā)者可以通過查看這些日志進(jìn)行代碼調(diào)試或排查問題,提高開發(fā)效率。
方式一:通過開發(fā)工具的控制臺獲取播放器SDK日志
此方式適用于在您本地可以復(fù)現(xiàn)問題并抓取日志的場景。
打開日志并設(shè)置日志級別。
// 打開日志開關(guān) [AliPlayer setEnableLog:YES]; // 設(shè)置日志級別,默認(rèn)為LOG_LEVEL_INFO,如需排查問題,請?jiān)O(shè)置為LOG_LEVEL_TRACE [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
設(shè)置幀級別日志。
//設(shè)置幀級別日志打印 //選項(xiàng)value 0代表關(guān)閉 1代表打開 [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
說明設(shè)置幀級別日志功能主要在排查故障場景下使用。
收集日志。
方法一:控制臺查看日志
復(fù)現(xiàn)問題后,可在您開發(fā)工具(例如XCode)的控制臺獲取日志。
方法二:自定義路徑將日志輸出到文件
打開日志后,在創(chuàng)建播放器實(shí)例之前,在沙盒路徑下自定義設(shè)置日志文件的生成路徑。
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; // logFilePath為示例路徑,可以自己在沙盒路徑下創(chuàng)建自定義文件,比如xxxx.log文件。 NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];
將日志信息注入到自定義文件中。
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout); freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
復(fù)現(xiàn)問題后,可在您自定義設(shè)置的路徑下獲取生成的
.log
日志文件。
方式二:通過LogCallback監(jiān)聽播放器SDK的輸出日志
此方式適用于問題發(fā)生在您的用戶側(cè),在您本地?zé)o法復(fù)現(xiàn)問題并抓取日志的場景。可以通過LogCallback監(jiān)聽播放器SDK的輸出日志,并自動輸出到您App的日志通道中。
打開日志并設(shè)置日志級別。
// 打開日志 [AliPlayer setEnableLog:YES]; // 設(shè)置日志級別,默認(rèn)為LOG_LEVEL_INFO,如需排查問題,請?jiān)O(shè)置為LOG_LEVEL_TRACE [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) { NSLog(@"strLog:%@", strLog); }];
收集日志。
復(fù)現(xiàn)問題后,日志將通過您App的日志通道自動輸出到您App的日志文件。