日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基礎(chǔ)功能

更新時(shí)間:

本文為您介紹如何創(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];
  1. 創(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"];
  2. 設(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開始播放。

    • onPlayerEventonError較為重要,建議您設(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é)果通知
    }
  3. 創(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.mp4content://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端

  4. 設(shè)置顯示View。

    如果播放源有畫面,那么需要設(shè)置顯示的view到播放器中,用來顯示畫面。示例如下:

    self.player.playerView = self.avpPlayerView.playerView;// 用戶顯示的view
  5. 可選:開啟自動播放,默認(rèn)為關(guān)閉狀態(tài)。

    self.player.autoPlay = YES;
  6. 準(zhǔn)備播放。

    調(diào)用[self.player prepare]開始讀取并解析數(shù)據(jù)。

    [self.player prepare];
  7. 開始播放。

    • 如果未開啟自動播放,需要在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):

  1. 避免在異步銷毀過程中對播放器對象執(zhí)行任何其他操作。

  2. 無需在調(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,每條子流匯聚了一路視頻流、可能多路音頻流和多路字幕流,不同子流之間碼率不同。

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

使用示例

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

    [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)問題并抓取日志的場景。

  1. 打開日志并設(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];
  2. 設(shè)置幀級別日志。

    //設(shè)置幀級別日志打印
    //選項(xiàng)value 0代表關(guān)閉	1代表打開
    [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
    說明

    設(shè)置幀級別日志功能主要在排查故障場景下使用。

  3. 收集日志。

    1. 方法一:控制臺查看日志

      復(fù)現(xiàn)問題后,可在您開發(fā)工具(例如XCode)的控制臺獲取日志。

    2. 方法二:自定義路徑將日志輸出到文件

      1. 打開日志后,在創(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"];
      2. 將日志信息注入到自定義文件中。

        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
      3. 復(fù)現(xiàn)問題后,可在您自定義設(shè)置的路徑下獲取生成的.log日志文件。

方式二:通過LogCallback監(jiān)聽播放器SDK的輸出日志

此方式適用于問題發(fā)生在您的用戶側(cè),在您本地?zé)o法復(fù)現(xiàn)問題并抓取日志的場景。可以通過LogCallback監(jiān)聽播放器SDK的輸出日志,并自動輸出到您App的日志通道中。

  1. 打開日志并設(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);
    }];
  2. 收集日志。

    復(fù)現(xiàn)問題后,日志將通過您App的日志通道自動輸出到您App的日志文件。