全部產品
Search
文件中心

ApsaraVideo VOD:基礎功能

更新時間:Nov 21, 2025

本文為您介紹如何建立iOS播放器執行個體並提供設定音量、設定拖拽播放、監聽播放狀態、設定迴圈播放、設定倍速播放、切換音軌等基礎播放功能的使用樣本。

重要

如需運行體驗 Demo,請下載後參考跑通Demo編譯運行。

設定播放源(DataSource)

  • iOS播放器SDK支援4種點播播放方式,包括:VidAuth播放(ApsaraVideo for VOD使用者推薦使用)、VidSts播放、UrlSource播放、加密播放。

  • iOS播放器SDK支援2種直播播放方式,UrlSource播放和加密播放。

點播視訊播放

點播VidAuth播放(推薦)

使用VidAuth播放方式播放點播視訊,需要將播放器的vid屬性設定為音視頻ID,將playauth屬性設定為音視頻播放憑證。

  • 音視頻ID:可以在音視頻上傳完成後通過控制台(路徑:媒資庫>音/視頻)或服務端介面(SearchMedia)擷取。

  • 音視頻播放憑證:可以調用GetVideoPlayAuth介面擷取。建議您整合點播服務端SDK來擷取音視頻播放憑證,免去自簽名的麻煩。調用介面擷取音視頻播放憑證的樣本請參見開發人員門戶

推薦ApsaraVideo for VOD使用者採用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有優勢,對比詳情請參見憑證方式與STS方式對比

若您在VOD控制台開啟HLS標準加密參數透傳,預設的參數名為MtsHIsUriToken,詳情見HLS標準加密參數透傳,那麼請按照下述代碼,將MtsHIsUriToken值設入點播源中。

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。如需設定此參數,請確保該時間大於視頻的實際時間長度,防止播放地址在播放完成前到期。

//若您在VOD控制台開啟了HLS標準加密參數透傳,且預設的參數 名為MtsHlsUriToken,那麼需要設定config,並將其傳入vid中,參考下述
//若您未在VOD控制台開啟了HLS標準加密參數透傳,那麼則不需要整合下述代碼
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];

[self.player setAuthSource:authSource];

點播VidSts播放

使用點播VidSts播放方式播放點播視訊是指用STS臨時憑證而非點播音視頻播放憑證播放。STS安全性權杖和STS臨時AK對(AccessKeyId和AccessKeySecret)需要提前擷取,擷取方式請參見擷取STS Token

若您在VOD控制台開啟HLS標準加密參數透傳,預設的參數名為MtsHIsUriToken,詳情見HLS標準加密參數透傳,那麼請按照下述代碼,將MtsHIsUriToken值設入點播源中。

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。如需設定此參數,請確保該時間大於視頻的實際時間長度,防止播放地址在播放完成前到期。
//若您在VOD控制台開啟了HLS標準加密參數透傳,且預設的參數名為MtsHlsUriToken,那麼需要設定config,並將其傳入vid中,參考下述
//若您未在VOD控制台開啟了HLS標準加密參數透傳,那麼則不需要整合下述代碼
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// 設定播放源
[self.player setStsSource:source]

點播UrlSource播放

使用UrlSource播放方式播放點播視訊,需要將播放器的source屬性設定為播放地址。

  • 阿里雲ApsaraVideo for VOD服務中的播放地址:可以調用GetPlayInfo介面擷取。建議您整合點播服務端SDK來擷取音視頻播放地址,免去自簽名的麻煩。調用介面擷取音視頻播放地址的樣本請參見開發人員門戶

  • 本地視頻地址:請確保有存取權限,可以通過系統API擷取到可訪問的本地視頻檔案完整路徑,例如:/sdcard/xxx/xxx/xxx.mp4content://xxx/xxx/xx.mp4

AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // 必選參數,播放地址,可以是第三方點播地址,或阿里雲點播服務中的播放地址,也可以是本地視頻地址。
[self.player setUrlSource:urlSource]; 

點播加密播放

點播視訊支援HLS標準加密、阿里雲私人加密和DRM加密。加密播放請參見iOS播放加密視頻

直播視頻播放

詳情請參見標準直播播放

說明
  • UrlSource是直接通過URL播放,VidSts,VidAuth是通過Vid進行播放。

  • 接入地區Region的設定,請參見點播地區標識

控制播放

iOS播放器SDK支援開始、暫停、從指定時間點播放等主流操作。

準備播放

準備播放視頻,由prepare介面實現。樣本如下:

[self.player prepare];

開始播放

開始播放視頻,由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];

以指定位置起播,適用於使用者從指定時間點開始播放的情境。需在每次prepare前調用一次該介面生效,樣本如下:

// 設定下次播放器prepare時的起播時間(毫秒),僅對緊接著的一次prepare生效。
// 調用prepare後,該值會被內部自動清零;若再次prepare前未重新調用此方法,則按普通方式起播。
// seekMode可指定為精準或非精準模式
[self.player setStartTime:time seekMode:seekMode];

暫停播放

暫停播放視頻,由pause介面實現。樣本如下:

[self.player pause];

恢複播放

恢複播放視頻,由start介面實現。樣本如下:

[self.player start];

停止播放

停止播放視頻,由stop介面實現。樣本如下:

[self.player stop];

銷毀播放器

銷毀播放器執行個體,有同步和非同步兩種銷毀方式,樣本如下:

//同步銷毀,內部會自動調用stop介面
[self.player destroy];
//非同步銷毀,內部會自動調用stop介面
[self.player destroyAsync];
說明

調用同步銷毀介面需等待播放器資源完全釋放後才返回。如果您對介面的響應速度有較高要求,建議使用非同步銷毀介面,並注意以下幾點:

  1. 避免在非同步銷毀過程中對播放器對象執行任何其他動作。

  2. 無需在調用非同步銷毀之前手動停止播放器,因為該過程內部已經包含了非同步化的停止流程。

播放器狀態監聽

iOS播放器SDK支援設定播放器監聽和監聽播放狀態。

設定播放器監聽

播放器支援設定多個監聽器。

  • onPlayerEventonError較為重要,建議您設定。

@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*)player eventType:(AVPEventType)eventType{
    switch(eventType){
        case AVPEventPrepareDone:{
            // 準備完成
        }
            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 {
    // 切換碼率結果通知
}

監聽播放狀態

指監聽播放器的狀態,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;
    }
}

設定顯示模式

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;
  }
}

擷取實際播放時間長度

指即時擷取實際播放時間長度,擷取到的時間長度不包含播放過程中的暫停、卡頓等時間。樣本如下:

 NSString *duration = [player getPlayedDuration];

擷取緩衝進度

指擷取視頻當前的緩衝進度,需要在onBufferedPositionUpdate回調中擷取position。樣本如下:

- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    NSString *bufferPosition = position;
}

擷取即時渲染幀率、音視頻碼率、網路下行碼率

樣本如下:

// 擷取當前渲染的幀率,資料類型為Float。
[self.player getOption:AVP_OPTION_RENDER_FPS]
// 擷取當前播放的視頻碼率,資料類型為Float,單位為bps。
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// 擷取當前播放的音頻碼率,資料類型為Float,單位為bps。
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// 擷取當前的網路下行碼率,資料類型為Float,單位為bps。
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]

設定音量

設定音量包括音量大小和靜音設定。

音量大小

指調節音量大小,支援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;

多清晰度設定

說明

詳細程式碼範例可參考API-Example多碼率/解析度切換(MultiResolution)模組,該工程是基於Objective-C的阿里雲播放器SDK iOS樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。

直播UrlSource播放方式

詳情請參見標準直播播放

點播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.player selectTrack:index];

清晰度切換通知

清晰度切換完成回調onTrackChanged。

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
 // 切換完成
}

快切模式

開啟快切模式後,手動調用selectTrack時,都會快速得到響應。

AVPConfig *config = [self.player getConfig];
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,每條子流匯聚了一路視頻流、可能多路音頻流和多路字幕流,不同子流之間碼率不同。

目前僅支援子流之間的切換,不支援子流的多路音頻流之間的切換。

使用樣本

  1. 設定回調。

      // 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
        }
    }
  2. 切換音軌。

    [self.player selectTrack:myTrack.trackIndex accurate:YES]

縮圖使用

說明

詳細程式碼範例可參考API-Example影片縮圖預覽(Thumbnail)模組,該工程是基於Objective-C的阿里雲播放器SDK iOS樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。

在播放器SDK中使用縮圖前,請確保已為視頻配置縮圖,即視頻已產生雪碧截圖(在ApsaraVideo for VOD控制台建立類型為雪碧圖的截圖模板,通過工作流程將視頻用該雪碧圖的截圖模板處理後,產生雪碧圖資料),詳細內容請參見視頻截圖。播放器SDK中使用縮圖的範例程式碼如下:

/**
 當前Track是否有縮圖,如果沒有,不展示縮圖。
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 建立自訂顯示縮圖的視圖。
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
 @brief:擷取track資訊回調。
 @param player:播放器player指標。
 @param info:track流資訊數組,可參考AVPTrackInfo。
 */
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    AVPMediaInfo* mediaInfo = [player getMediaInfo];
    if ((nil != mediaInfo.thumbnails) && (0 < [mediaInfo.thumbnails count])) {
        [self.player setThumbnailUrl:[mediaInfo.thumbnails objectAtIndex:0].URL];
        self.trackHasThumbnai = YES;
    }else {
        self.trackHasThumbnai = NO;
    }
}

/**
 進度條改變進度回調。
 @param playerView playerView
 @param value:進度值。
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief:擷取縮圖成功回調。
 @param positionMs:指定的縮圖位置。
 @param fromPos:此縮圖的開始位置。
 @param toPos:此縮圖的結束位置。
 @param image:縮圖略映像指標,對於mac是NSImage,iOS平台是UIImage指標。
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief:擷取縮圖失敗回調。
 @param positionMs:指定的縮圖位置。
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

請注意:如果使用者使用的是URL方式的播放,使用上述代碼並不能直接顯示縮圖,因為onTrackReady並不支援URL播放的MediaInfo回調,建議使用者直接指定縮圖URL。

/**
 當前Track是否有縮圖,如果沒有,不展示縮圖。
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 建立自訂顯示縮圖的視圖
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
  onPrepare
 */
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
  if(newStatus == AVPStatusPrepared){
       [self.player setThumbnailUrl:[URL];// 具體的縮圖url 請根據控制台api產生
       self.trackHasThumbnai = YES;
  }
}
/**
 進度條改變進度回調。
 @param playerView playerView
 @param value:進度值。
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief:擷取縮圖成功回調。
 @param positionMs:指定的縮圖位置。
 @param fromPos:此縮圖的開始位置。
 @param toPos:此縮圖的結束位置。
 @param image:縮圖略映像指標,對於mac是NSImage,iOS平台是UIImage指標。
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief:擷取縮圖失敗回調。
 @param positionMs:指定的縮圖位置。
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

擷取SDK日誌

在播放器SDK運行過程中會產生詳細的日誌資訊,包括網路請求的狀態、系統調用的結果、許可權申請情況等各種運行事件。開發人員可以通過查看這些日誌進行代碼調試或排查問題,提高開發效率。

方式一:通過開發工具的控制台擷取播放器SDK日誌

此方式適用於在您本地可以複現問題並抓取日誌的情境。

  1. 開啟日誌並設定記錄層級。

    // 開啟日誌開關
    [AliPlayer setEnableLog:YES];
    // 設定記錄層級,預設為LOG_LEVEL_INFO,如需排查問題,請設定為LOG_LEVEL_TRACE
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
  2. 設定幀層級日誌。

    //設定幀層級日誌列印
    //選項value 0代表關閉	1代表開啟
    [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
    說明

    設定幀層級日誌功能主要在排查故障情境下使用。

  3. 收集日誌。

    1. 方法一:控制台查看日誌

      複現問題後,可在您開發工具(例如XCode)的控制台擷取日誌。

    2. 方法二:自訂路徑將日誌輸出到檔案

      1. 開啟日誌後,在建立播放器執行個體之前,在沙箱路徑下自訂設定記錄檔的產生路徑。

        NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        // logFilePath為樣本路徑,可以自己在沙箱路徑下建立自訂檔案,比如xxxx.log檔案。
        NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];
      2. 將日誌資訊注入到自訂檔案中。

        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
      3. 複現問題後,可在您自訂設定的路徑下擷取產生的.log記錄檔。

方式二:通過LogCallback監聽播放器SDK的輸出日誌

此方式適用於問題發生在您的使用者側,在您本地無法複現問題並抓取日誌的情境。可以通過LogCallback監聽播放器SDK的輸出日誌,並自動輸出到您App的日誌通道中。

  1. 開啟日誌並設定記錄層級。

    // 開啟日誌
    [AliPlayer setEnableLog:YES];
    // 設定記錄層級,預設為LOG_LEVEL_INFO,如需排查問題,請設定為LOG_LEVEL_TRACE
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) {
     NSLog(@"strLog:%@", strLog);
    }];
  2. 收集日誌。

    複現問題後,日誌將通過您App的日誌通道自動輸出到您App的記錄檔。