基礎(chǔ)功能
本文提供iOS播放器基礎(chǔ)功能的使用示例,更多功能使用說明請參見進階功能、API說明。
創(chuàng)建播放器
本節(jié)介紹如何用最簡單的方式讓iOS端播放器SDK播放視頻,按照播放方式的不同可以分為手動播放和自動播放。
5.4.7.1及之后版本的iOS端播放器SDK,在配置License后,需要在播放器實例初始化前主動調(diào)用初始化證書服務(wù)。代碼示例如下:
[AliPrivateService initLicenseService];
創(chuàng)建播放器。
創(chuàng)建AliPlayer播放器。
說明播放器提供的播放質(zhì)量監(jiān)控(可查看播放器整體播放質(zhì)量相關(guān)數(shù)據(jù))、單點追查(可定位到具體的用戶或設(shè)備,分析其播放行為,快速定位播放異常等問題)及視頻播放統(tǒng)計功能都依賴埋點日志上報功能而實現(xiàn)。
在創(chuàng)建播放器時,根據(jù)
setTraceId
參數(shù)的設(shè)置不同,其后續(xù)可實現(xiàn)的功能不同,具體如下:setTraceId
參數(shù)不傳(默認(rèn)):埋點日志上報功能開啟,后續(xù)可以使用播放質(zhì)量監(jiān)控和視頻播放統(tǒng)計功能,無法使用單點追查功能。setTraceId
參數(shù)傳入traceid:traceid的值由您自行定義,需為您的用戶或用戶設(shè)備的唯一標(biāo)識符,例如傳入您業(yè)務(wù)的userid或者IMEI、IDFA等您業(yè)務(wù)用戶的設(shè)備ID。傳入traceid后,埋點日志上報功能開啟,后續(xù)可以使用播放質(zhì)量監(jiān)控、單點追查和視頻播放統(tǒng)計功能。setTraceId
參數(shù)設(shè)置為DisableAnalytics
:關(guān)閉埋點日志上報,后續(xù)無法使用播放質(zhì)量監(jiān)控、單點追查和視頻播放統(tǒng)計功能。
// 創(chuàng)建播放器 self.player = [[AliPlayer alloc] init]; // 建議傳入traceId [play setTraceID:@"xxxxxx"];
設(shè)置監(jiān)聽器。
播放器支持設(shè)置多個監(jiān)聽器。
prepare
必須設(shè)置,因為手動播放需要在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 錯誤代理回調(diào) @param player 播放器player指針 @param errorModel 播放器錯誤描述,參考AliVcPlayerErrorModel */ - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel { // 提示錯誤,及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時,建議在準(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 { // 更新進度條 } /** @brief 視頻緩存位置回調(diào) @param player 播放器player指針 @param position 視頻當(dāng)前緩存位置 */ - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position { // 更新緩沖進度 } /** @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 { // 獲取字幕進行顯示 } /** @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種點播播放方式,包括:UrlSource播放、VidAuth播放(視頻點播用戶推薦使用)、VidSts播放、加密播放。
iOS播放器SDK支持2種直播播放方式,UrlSource播放和加密播放。
說明UrlSource是直接通過URL播放,VidSts,VidAuth是通過Vid進行播放。
接入地域Region的設(shè)置,請參見點播地域標(biāo)識。
點播視頻播放
點播UrlSource播放
使用UrlSource播放方式播放點播視頻,需要將播放器的source屬性設(shè)置為播放地址。
阿里云視頻點播服務(wù)中的播放地址:可以調(diào)用GetPlayInfo接口獲取。建議您集成點播服務(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ù),播放地址,可以是第三方點播地址,或阿里云點播服務(wù)中的播放地址,也可以是本地視頻地址。 [self.player setUrlSource:urlSource];
點播VidAuth播放(推薦)
使用VidAuth播放方式播放點播視頻,需要將播放器的vid屬性設(shè)置為音視頻ID,將playauth屬性設(shè)置為音視頻播放憑證。
音視頻ID:可以在音視頻上傳完成后通過控制臺(路徑:媒資庫>音/視頻)或服務(wù)端接口(SearchMedia)獲取。
音視頻播放憑證:可以調(diào)用GetVideoPlayAuth接口獲取。建議您集成點播服務(wù)端SDK來獲取音視頻播放憑證,免去自簽名的麻煩。調(diào)用接口獲取音視頻播放憑證的示例請參見開發(fā)者門戶。
推薦視頻點播用戶采用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有優(yōu)勢,對比詳情請參見憑證方式與STS方式對比。
AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"Vid信息"; // 必選參數(shù),視頻ID(VideoId)。 authSource.playAuth = @"<yourPlayAuth>"; // 必選參數(shù),播放憑證,需要調(diào)用點播服務(wù)的GetVideoPlayAuth接口生成。 authSource.region = @"接入地域"; // 5.5.5.0及之后版本播放器SDK,本參數(shù)已棄用,無需設(shè)置region,播放器會自動解析region;5.5.5.0之前版本播放器SDK,本參數(shù)必選,點播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 // authSource.authTimeout = 3600; // 播放地址的有效時長,單位:秒。該時長會覆蓋在視頻點播控制臺設(shè)置的URL鑒權(quán)的有效時長。如果不傳,則取默認(rèn)值3600。如需設(shè)置此參數(shù),請確保該時間大于視頻的實際時長,防止播放地址在播放完成前過期。 [self.player setAuthSource:authSource];
點播VidSts播放
使用點播VidSts播放方式播放點播視頻是指用STS臨時憑證而非點播音視頻播放憑證播放。STS安全令牌和STS臨時AK對(AccessKeyId和AccessKeySecret)需要提前獲取,獲取方式請參見使用STS臨時授權(quán)方案上傳視頻。
AVPVidStsSource *source = [[AVPVidStsSource alloc] init]; source.vid = @"Vid信息"; // 必選參數(shù),視頻ID(VideoId)。 source.region = @"接入地域"; // 必選參數(shù),點播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 source.securityToken = @"<yourSecurityToken>"; // 必選參數(shù),STS安全令牌,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 source.accessKeySecret = @"<yourAccessKeySecret>"; // 必選參數(shù),STS臨時AK對的訪問密鑰,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 source.accessKeyId = @"<yourAccessKeyId>"; // 必選參數(shù),STS臨時AK對的訪問密鑰ID,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 // source.authTimeout = 3600; // 播放地址的有效時長,單位:秒。該時長會覆蓋在視頻點播控制臺設(shè)置的URL鑒權(quán)的有效時長。如果不傳,則取默認(rèn)值3600。如需設(shè)置此參數(shù),請確保該時間大于視頻的實際時長,防止播放地址在播放完成前過期。 // 設(shè)置播放源 [self.player setStsSource:source]
點播加密播放
點播視頻支持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ā)生之后,擇機調(diào)用start
開始播放視頻。如果開啟了自動播放,則不需要調(diào)用
start
,數(shù)據(jù)解析完成后將開始自動播放視頻。
重要自動播放的時候?qū)⒉粫卣{(diào)
AVPEventPrepareDone
回調(diào),而會回調(diào)AVPEventAutoPlayStart
回調(diào)。[self.player start];
控制播放
iOS端播放器SDK支持開始、暫停、從指定時間點播放等主流操作。
開始播放
開始播放視頻,由start
接口實現(xiàn)。示例如下:
[self.player start];
從指定時間開始播放
跳轉(zhuǎn)到某個時刻進行播放,由seekToTime
接口實現(xiàn)。適用于用戶拖拽進度條,或續(xù)播等需要從指定時間點開始播放的場景。示例如下:
// position為指定的時間。單位:毫秒。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];
暫停播放
暫停播放視頻,由pause
接口實現(xiàn)。示例如下:
[self.player pause];
停止播放
停止播放視頻,由stop
接口實現(xiàn)。示例如下:
[self.player stop];
設(shè)置顯示模式
iOS端播放器SDK支持填充、旋轉(zhuǎn)、鏡像等顯示設(shè)置。
填充
支持設(shè)置寬高比適應(yīng)、寬高比填充和拉伸填充這3種畫面填充模式,由scalingMode
接口實現(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;
旋轉(zhuǎn)
指畫面按指定角度旋轉(zhuǎn),由rotateMode
接口實現(xiàn)。示例如下:
//設(shè)置畫面順時針旋轉(zhuǎn)0度
self.player.rotateMode = AVP_ROTATE_0;
//設(shè)置畫面順時針旋轉(zhuǎn)90度
self.player.rotateMode = AVP_ROTATE_90;
//設(shè)置畫面順時針旋轉(zhuǎn)180度
self.player.rotateMode = AVP_ROTATE_180;
//設(shè)置畫面順時針旋轉(zhuǎn)270度
self.player.rotateMode = AVP_ROTATE_270;
鏡像
支持水平鏡像、垂直鏡像和無鏡像,由mirrorMode
接口實現(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)前的播放進度、播放時長和緩沖進度信息。
獲取當(dāng)前播放進度
指獲取當(dāng)前的播放時刻,需要在onCurrentPositionUpdate回調(diào)中獲取position。示例如下:
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
//position為當(dāng)前播放進度,單位為毫秒
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}
獲取播放時長
指獲取視頻總時長。需要在視頻加載完成以后才可以獲取到,比如在 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;
}
}
獲取緩沖進度
指獲取視頻當(dāng)前的緩沖進度,需要在onBufferedPositionUpdate回調(diào)中獲取position。示例如下:
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
NSString *bufferPosition = position;
}
獲取實時渲染幀率、音視頻碼率、網(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),閑時,靜態(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:{
//播放錯誤
}
break;
default:
break;
}
}
設(shè)置音量
設(shè)置音量包括音量調(diào)節(jié)和靜音設(shè)置。
音量調(diào)節(jié)
指調(diào)節(jié)音量大小,支持0~2倍,當(dāng)音量大于1時,可能出現(xiàn)噪音,不推薦使用。由volume
接口實現(xiàn)。設(shè)置后還可獲取音量信息。示例如下:
//volume的值為0~2之間的實數(shù)。
self.player.volume = 1.0f;
//獲取音量信息。
self.player.volume
靜音設(shè)置
指將播放中的視頻設(shè)置為靜音狀態(tài),由muted
接口實現(xiàn)。示例如下:
self.player.muted = YES;
倍速播放
iOS端播放器SDK提供了倍速播放視頻的功能,通過設(shè)置rate
方法,能夠以0.5倍~5倍速去播放視頻。同時保持變聲不變調(diào)。示例如下:
//設(shè)置倍速播放:支持0.5~5倍速的播放,通常按0.5的倍數(shù)來設(shè)置,例如0.5倍、1倍、1.5倍等
self.player.rate = 1.0f;
多清晰度設(shè)置
如果使用VID方式(VidAuth及VidSts)播放,無需額外設(shè)置。iOS端播放器SDK會從點播服務(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 {
// 切換完成
}
循環(huán)播放
iOS端播放器SDK提供了循環(huán)播放視頻的功能。調(diào)用loop
開啟循環(huán)播放,播放完成后,將會自動從頭開始播放視頻。示例如下:
self.player.loop = YES;
同時循環(huán)開始的回調(diào)將會使用AVPEventLoopingStart
中通知。示例如下:
- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventLoopingStart:
break;
}
}