全部產品
Search
文件中心

ApsaraVideo VOD:自訂配置

更新時間:Sep 10, 2026

自訂配置 (Custom Config) 是 AliPlayerKit 的擴充配置機制。AliPlayerKit 已內建最佳實務配置,大多數情境無需額外設定即可獲得優質體驗。當需要的播放器能力未通過 AliPlayerKit 介面直接提供時,可通過自訂配置機制直接調用底層 AliPlayer SDK 的 API 來實現。

概念介紹

什麼是自訂配置?

AliPlayerKit 在底層 AliPlayer SDK 之上提供了高層封裝,已內建最佳實務配置。但底層 SDK 提供了更豐富的能力(如自訂緩衝策略、Referer 防盜鏈、HTTP Header 注入等),這些能力並非都通過 AliPlayerKit 直接透出。

自訂配置機制提供了兩個回調入口,讓開發人員在關鍵時機擷取底層對象並直接調用原生 API:

層級

介面

調用時機

典型情境

全域配置

+setOnGlobalInitBlock:

+setup 內部初始化完成後(僅一次)

全域記錄層級、HTTP/2 多工等全域行為

執行個體配置

onPlayerConfigBlock

每次 configure: 時 prepare 前

緩衝策略、Referer、HTTP Header 等執行個體行為

三層配置體系

AliPlayerKit 的完整配置體系包含三個層級:

┌─────────────────────────────────────────────────────────┐
│              1. 全域配置 (OnGlobalInitBlock)              │
│         應用啟動時執行一次,影響所有播放器執行個體                │
├─────────────────────────────────────────────────────────┤
│              2. 模型配置 (AliPlayerModel)                 │
│         每次 configure: 時通過屬性設定播放參數               │
├─────────────────────────────────────────────────────────┤
│           3. 執行個體配置 (onPlayerConfigBlock)               │
│       每次 configure: 時在 prepare 前回調底層播放器          │
└─────────────────────────────────────────────────────────┘

全域配置(Global Config)

適用情境

  • 設定全域 Option(如全域記錄層級)

  • 啟用 HTTP/2 多工

  • 配置全域 DNS 解析策略

  • 其他需要在所有播放器執行個體建立前生效的全域行為

機制說明

  • 通過 +[AliPlayerKit setOnGlobalInitBlock:] 註冊回調 Block

  • 回調在 +setup 完成內部初始化後觸發,僅執行一次

  • 執行後 Block 被置 nil,後續不再觸發

  • 此時底層 SDK 已就緒,可安全調用全域 API

使用方式

在 application:didFinishLaunchingWithOptions: 中,調用 +setup 之前註冊回調:

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 1. 註冊全域自訂配置回調(必須在 setup 之前調用)
    [AliPlayerKit setOnGlobalInitBlock:^{
        // 樣本:啟用 HTTP/2 多工
        [AliPlayerFactory setOption:ALLOW_H2_MULTIPLEX value:1];

        // 樣本:設定全域記錄層級
        // [AliPlayerFactory setLogLevel:AF_LOG_LEVEL_INFO];
    }];

    // 2. 初始化(內部完成初始化後觸發上面註冊的回調)
    [AliPlayerKit setup];

    return YES;
}

配置時序

application:didFinishLaunchingWithOptions:
    │
    ├── [AliPlayerKit setOnGlobalInitBlock:block]   ← 註冊回調
    │
    └── [AliPlayerKit setup]
            │
            ├── [GlobalManager setup]    ← 底層 SDK 初始化
            │
            ├── sInitialized = YES
            │
            └── block()                  ← 觸發全域配置回調(僅一次)

注意事項

要點

說明

調用順序

setOnGlobalInitBlock: 必須在 +setup 之前調用

執行次數

全域配置僅執行一次,+setup 內部使用 dispatch_once 保護

傳 nil 清除

傳入 nil 可取消登入的回調

等冪性

+setup 多次調用只執行一次,第二次調用不會再觸發回調

執行個體配置(Player Config)

適用情境

  • 自訂緩衝策略(maxBufferDuration、highBufferDuration 等)

  • 設定 Referer 防盜鏈

  • 配置 HTTP Header

  • 設定執行個體級 Option

  • 其他 AliPlayerKit 未直接透出的播放器介面

機制說明

  • 通過 AliPlayerModel.onPlayerConfigBlock 設定回調 Block

  • 每次調用 [controller configure:model] 時觸發

  • 回調在 setDataSource: 之後、prepare 之前執行

  • 回調參數為遵循 MediaPlayer 協議的底層播放器執行個體

使用方式

在構建 AliPlayerModel 時設定 onPlayerConfigBlock:

VideoSource *source = [VideoSource urlSourceWithUrl:@"https://example.com/video.mp4"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];

// 設定執行個體級自訂配置回調
model.onPlayerConfigBlock = ^(id<MediaPlayer> player) {
    // 樣本 1:自訂緩衝策略
    AVPConfig *config = [player getConfig];
    config.maxBufferDuration = 50000;       // 最大緩衝時間長度 50s
    config.highBufferDuration = 3000;       // 高水位緩衝 3s
    config.startBufferDuration = 500;       // 起播緩衝 500ms
    [player setConfig:config];

    // 樣本 2:設定 Referer 防盜鏈
    AVPConfig *refConfig = [player getConfig];
    refConfig.referer = @"https://your-domain.com";
    [player setConfig:refConfig];

    // 樣本 3:設定執行個體級 Option
    // [player setOption:key value:value];
};

// 配置並播放
[controller configure:model];

配置時序

[controller configure:model]
    │
    ├── lifecycleStrategy.acquire()             ← 擷取播放器執行個體
    │
    ├── [mediaPlayer setDataSource:model]       ← 配置視頻源
    │
    ├── model.onPlayerConfigBlock(mediaPlayer)  ← 觸發執行個體配置回調
    │
    ├── [strategyManager start/reset]           ← 策略系統啟動
    │
    └── [mediaPlayer prepare]                   ← 開始準備播放

注意事項

要點

說明

觸發頻率

每次調用 configure: 都會觸發,適合動態配置情境

執行時機

在 setDataSource: 之後、prepare 之前,是自訂配置的最佳時機

回調參數

id<MediaPlayer> 執行個體,可調用底層 SDK 的所有介面

可選配置

onPlayerConfigBlock 可不設定,不影響正常播放

避免非同步

回調是同步執行的,不應在回調中執行耗時或非同步作業

內建配置項

AliPlayerKit 全域配置

通過 AliPlayerKit 類方法直接設定的內建配置項:

配置項

方法

說明

初始化

+setup

初始化 SDK,dispatch_once 保證等冪

初始化狀態

+isInitialized

查詢 SDK 是否已完成初始化

全域配置回調

+setOnGlobalInitBlock:

註冊全域初始化後的自訂配置回調

偵錯模式

+setDebugModeEnabled: / +isDebugModeEnabled

開啟/關閉偵錯模式(預設 NO)

日誌面板

+setLogPanelEnabled: / +isLogPanelEnabled

是否在播放器視圖中顯示日誌面板(預設 NO)

記錄層級

+setLogLevel: / +logLevel

SDK 日誌輸出層級(預設 LogLevelInfo)

控制台日誌

+enableConsoleLog: / +isConsoleLogEnabled

是否輸出日誌到控制台(預設 YES)

播放器工廠

+setPlayerFactory: / +playerFactory

自訂播放器建立工廠,傳 nil 恢複預設

預先載入器

+setPreloader: / +preloader

自訂預先載入器,傳 nil 恢複預設

清除緩衝

+clearCaches

清除播放器本地媒體緩衝(需在 setup 之後調用)

語言設定

+setLanguageCode:

手動指定語言代碼(zh-Hans / en)

自訂翻譯

+setLocaleProvider:

注入自訂本地化 Provider

跟隨系統語言

+resetLocaleToSystemLanguage

恢複跟隨系統慣用語言

當前語言

+currentLanguageCode

擷取當前生效的語言代碼

版本資訊

+getPlayerKitVersion / +getSdkVersion

擷取 AliPlayerKit / 底層 SDK 版本號碼

AliPlayerModel 執行個體配置

通過 AliPlayerModel 屬性設定的執行個體級配置項:

屬性

類型

預設值

說明

videoSource

VideoSource *

—

必填,播放視頻資料來源(readonly,通過 initWithVideoSource: 設定)

sceneType

SceneType

SceneTypeVOD

播放情境,影響插槽 UI 和手勢行為

coverUrl

NSString *

nil

視頻封面圖 URL

videoTitle

NSString *

nil

顯示在 TopBar 的標題

autoPlay

BOOL

YES

配置完成後是否自動開始播放

traceId

NSString *

nil

播放品質監控標識(業務方的唯一標識)

startTime

NSInteger

0

播放起始位置(毫秒),負數自動修正為 0

hardwareDecode

BOOL

YES

是否啟用硬體解碼

allowScreenSleep

BOOL

NO

播放時是否允許螢幕休眠

disableScreenshot

BOOL

NO

iOS 特有,禁止截屏/錄屏

onPlayerConfigBlock

void (^)(id<MediaPlayer>)

nil

執行個體級自訂配置回調

AliPlayerController 運行時配置

通過 AliPlayerController 方法在運行時動態調整的配置:

方法 / 屬性

類型

說明

-setRate:

float

播放速度(1.0 正常,0.5 半速,2.0 倍速)

-setLoop:

BOOL

是否迴圈播放

-setMuted:

BOOL

是否靜音

-setMirrorMode:

MirrorMode

鏡像模式(None / Horizontal / Vertical)

-setScaleMode:

ScaleMode

縮放模式(FitXY / FitCenter / CenterCrop)

-setRotateMode:

RotateMode

旋轉角度(0 / 90 / 180 / 270 度)

-setControlsVisible:

BOOL

顯示/隱藏控制欄

controlsVisibilityLocked

BOOL

控制欄可見度鎖定(YES 時 setControlsVisible:NO 被忽略)

-setFullscreen:

BOOL

進入/退出全屏(預設帶動畫)

-setFullscreen:animated:

BOOL, BOOL

進入/退出全屏(可控制動畫)

-selectTrack:

TrackQuality *

切換清晰度

-snapshot

—

截取當前視頻畫面

-toggle

—

切換播放/暫停狀態

-replay

—

從頭重新播放

-stop

—

停止播放

autoLifecycleManagement

BOOL

自動管理前後台暫停/恢複(預設 YES)

配置優先順序

優先順序規則

當同一配置項在不同層級都有設定時,按以下優先順序生效:

執行個體配置(onPlayerConfigBlock) > AliPlayerModel 屬性 > 全域配置 > SDK 預設值

配置生效範圍

層級

生效範圍

生命週期

全域配置

所有播放器執行個體

應用級(僅執行一次)

Model 屬性

單個播放器執行個體

單次 configure: 調用

執行個體配置回調

單個播放器執行個體

每次 configure: 時觸發

Controller 方法

單個播放器執行個體

運行時動態生效

完整配置樣本

綜合樣本

// ===== 全域配置(AppDelegate 中,僅一次)=====
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 全域自訂配置
    [AliPlayerKit setOnGlobalInitBlock:^{
        // 啟用 HTTP/2 多工
        [AliPlayerFactory setOption:ALLOW_H2_MULTIPLEX value:1];
    }];

    // 初始化
    [AliPlayerKit setup];

    // 全域內建配置(需在 setup 之後調用)
    [AliPlayerKit setLogLevel:LogLevelWarn];
    [AliPlayerKit enableConsoleLog:YES];

    return YES;
}

// ===== 執行個體配置(播放頁中,每次播放)=====
- (void)startPlayback {
    VideoSource *source = [VideoSource urlSourceWithUrl:videoUrl];
    AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];

    // Model 屬性配置
    model.sceneType = SceneTypeVOD;
    model.videoTitle = @"精彩視頻";
    model.coverUrl = coverImageUrl;
    model.autoPlay = YES;
    model.hardwareDecode = YES;
    model.startTime = resumePosition; // 斷點續播

    // 執行個體級自訂配置(底層 SDK)
    model.onPlayerConfigBlock = ^(id<MediaPlayer> player) {
        AVPConfig *config = [player getConfig];
        config.maxBufferDuration = 50000;
        config.highBufferDuration = 3000;
        config.startBufferDuration = 500;
        config.referer = @"https://your-domain.com";
        [player setConfig:config];
    };

    [_controller configure:model];
}
說明

setLogLevel: 和 enableConsoleLog: 等日誌配置需在 setup 之後調用,因為它們操作的是 LogHub 單例執行個體。

API 速查

全域配置 API

方法

說明

+[AliPlayerKit setOnGlobalInitBlock:]

註冊全域配置回調,傳 nil 取消

+[AliPlayerKit setup]

觸發初始化,執行回調

執行個體配置 API

類

屬性

說明

AliPlayerModel

onPlayerConfigBlock

執行個體級配置回調(void (^)(id<MediaPlayer>))

相關檔案

檔案

說明

PlayerKit/Source/AliPlayerKit.h

全域配置 API(OnGlobalInitBlock typedef)

PlayerKit/Source/AliPlayerModel.h

執行個體配置入口(onPlayerConfigBlock)

PlayerKit/Source/AliPlayerController.h

運行時配置方法

PlayerKit/Source/Player/MediaPlayer.h

底層播放器協議(回調參數類型)

完整API請參見API參考。

常見問題

全域配置和執行個體配置的執行順序是什嗎?

全域配置在應用啟動時(+setup 內)執行一次;執行個體配置在每次 configure: 時的 prepare 前執行。兩者互不干擾。

如果不設定自訂配置會怎樣?

AliPlayerKit 已內建最佳實務配置,不設定任何自訂配置即可正常使用,適合大多數情境。

執行個體配置回調中可以做非同步作業嗎?

不建議。回調是同步執行的,完成後才會繼續執行 prepare。如果在回調中執行耗時操作,會阻塞播放器的啟動流程。

可以在執行個體配置中修改視頻源嗎?

不建議。視頻源在回調前已通過 setDataSource: 設定完成,在回調中修改可能導致不可預期的行為。執行個體配置回調應僅用於設定播放參數(如緩衝策略、Referer 等)。

setOnGlobalInitBlock: 在 +setup 之後調用會怎樣?

不會生效。+setup 使用 dispatch_once 保證只執行一次,如果 Block 在 +setup 之後設定,將永遠不會被觸發。

日誌配置應該在 setup 之前還是之後?

setLogLevel: 和 enableConsoleLog: 需在 +setup 之後調用,因為它們直接操作 LogHub 單例。而 setOnGlobalInitBlock: 必須在 +setup 之前設定。