全部產品
Search
文件中心

ApsaraVideo VOD:進階功能

更新時間:Jul 13, 2024

本文提供Windows播放器SDK進階功能的使用樣本。

進階播放

外掛字幕

Windows播放器SDK支援添加和切換外掛字幕,現僅支援SRT格式。樣本如下:

  1. 建立顯示字幕的控制項。
    根據不同的字幕格式建立不同的View。
    mSubtitleLabelPtr = new QLabel(QString(""), this);
    mSubtitleLabelPtr->setParent(this);
  2. 設定字幕相關監聽。
    //外掛字幕被添加
    void AlivcLivePlayerMainDlg::onSubtitleExtAdded(AliPlayer *player, int64_t trackIndex, const char *URL)
    {
        emit SgnAddExtSubtitle((qint64) trackIndex);
    }
    //字幕顯示回調
    void AlivcLivePlayerMainDlg::onSubtitleShow(AliPlayer *player, int64_t trackIndex, int64_t subtitleId, const char *subtitle)
    {
        emit SgnUpdateSubtitle(QString::fromStdString(subtitle), true);
    }
    //字幕隱藏回調
    void AlivcLivePlayerMainDlg::onSubtitleHide(AliPlayer *player, int64_t trackIndex, int64_t subtitleId)
    {
        emit SgnUpdateSubtitle(QString(""), false);
    }
  3. 添加字幕。
    mPlayerPtr->addExtSubtitle("url");
  4. 切換字幕。
    mPlayerPtr->selectExtSubtitle(trackIndex, true);

純音頻播放

通過禁用視頻播放,達到純音頻播放的效果。在prepare之前配置PlayerConfig。
AVPConfig *config = mPlayerPtr->getConfig();
config->mDisableVideo = true;
mPlayerPtr->setConfig(config);

網路自適應切換視訊清晰度

Windows播放器SDK支援多碼率自適應HLS、DASH視頻流。在prepare成功之後,通過getMediaInfo可以擷取到各個碼流的資訊,即TrackInfo。樣本如下:
AVPMediaInfo info = mPlayerPtr->getMediaInfo();
for (int i = 0; i < info.trackCount; i++) {
     AVPTrackInfo *track = info.tracks[i];
}
說明 HLS、DASH視頻流需要經過多碼率視頻轉碼模板組打包處理,可以在點播控制台的組態管理 > ApsaraVideo for Media Processing配置 > 轉碼模板組中配置生產對應的視頻流,詳細操作請參見視頻或字幕打包模板設定
在播放過程中,可以通過調用播放器的selectTrack方法切換播放的碼流,取值為SELECT_AVPTRACK_TYPE_VIDEO_AUTO時,為多碼率自適應。樣本如下:
//多碼率切換
mPlayerPtr->selectTrack(trackIndex);
//切換為自適應碼率
mPlayerPtr->selectTrack(SELECT_AVPTRACK_TYPE_VIDEO_AUTO);
切換的結果會在onTrackChanged監聽之後會回調。樣本如下:
void AlivcLivePlayerMainDlg::onTrackChanged(AliPlayer *player, AVPTrackInfo *info)
{
    if (info->trackType == AVPTRACK_TYPE_VIDEO) {
        // video changed
    }
    // etc
}

截圖

Windows播放器SDK提供了對當前視頻截圖的功能,由snapShot介面實現。截取的是原始的argb32格式的資料,回調介面為onSnapshotImageBuffer。樣本如下:
//截取當前播放的畫面
mPlayerPtr->snapshot();
//截圖回調
void AlivcLivePlayerMainDlg::onSnapshotImageBuffer(AliPlayer *player, int width, int height, unsigned char *pARGBBuffer)
{
    QString savePath = "save path";
    QImage snapshot(pARGBBuffer, width, height, QImage::Format_ARGB32);
    snapshot.save(savePath);
}
重要 截圖不包含介面。

試看

Windows播放器SDK通過配合點播服務配置,可以實現試看功能,VidAuth播放(推薦)和VidSts播放方式支援試看功能。如何配置和使用試看功能,請參見試看視頻

配置試看功能之後,通過VidPlayerConfigGenerator介面的setPreviewTime方法設定播放器的試看時間長度。當設定試看的時間長度,通過播放器SDK播放視頻時,服務端將不會返回完整的視頻內容,而是返回試看時間段的內容。以VidSts播放方式為例,樣本如下:
VidPlayerConfigGenerator playConfigGen;
playConfigGen.setPreviewTime(10);
AVPVidStsSource vidSource;
vidSource.initWithVid(視頻vid,
                        "accessKeyId",
                        "accessKeySecret",
                        "安全token",
                        "接入地區",
                        playConfigGen.generatePlayerConfig());
mPlayerPtr->setSource(vidSource);

設定Referer

Windows播放器SDK支援設定Referer,配合控制台的黑白名單Referer,可以控制存取權限,由AVPConfig方法佈建要求Referer。樣本如下:
//先擷取配置
AVPConfig *pConfig = mPlayerPtr->getConfig();
//設定referer
pConfig->referer = referer;
....//其他設定
//給播放器設定配置
mPlayerPtr->setConfig(pConfig);

設定UserAgent

Windows播放器SDK提供了AVPConfig用來佈建要求UA。設定之後,播放器請求的過程中將會帶上UA資訊。樣本如下:
//先擷取配置
AVPConfig *pConfig = mPlayerPtr->getConfig();
//設定userAgent
pConfig->userAgent = userAgent;
....//其他設定
//設定配置給播放器
mPlayerPtr->setConfig(pConfig);

配置網路重試時間和次數

Windows播放器SDK支援設定網路逾時的時間和重試次數,由AVPConfig介面實現。樣本如下:
//先擷取配置
AVPConfig *pConfig = mPlayerPtr->getConfig();
//設定網路逾時時間,單位ms
pConfig->networkTimeout = 5000;
//設定逾時重試次數。每次稍候再試為networkTimeout。networkRetryCount=0則表示不重試,重試策略App決定,預設值為2
pConfig->networkRetryCount = 2;
....//其他設定
//給播放器設定配置
mPlayerPtr->setConfig(pConfig);
說明
  • 如果設定了networkRetryCount,若此時發生網路問題,導致出現loading後,那麼將會重試networkRetryCount次,每次的間隔時間為networkTimeout。
  • 如果重試次數超過上限值之後,還是loading的狀態,那麼就會回調onError事件,此時AVPErrorModel.code為ERROR_LOADING_TIMEOUT。
  • 如果networkRetryCount設定為0,當網路重試逾時的時候,播放器就會回調onPlayerEvent,參數eventWithString為EVENT_PLAYER_NETWORK_RETRY。此時可以調用播放器的reload方法進行重新載入網路,或者進行其他的處理。

配置緩衝和延遲控制

對於播放器來說,緩衝的控制非常重要。合理的配置可以有效加快起播速度並減少卡頓。Windows播放器SDK通過AVPConfig提供了設定緩衝和延遲的控制介面。樣本如下:
//先擷取配置
AVPConfig *pConfig = mPlayerPtr->getConfig();
//最大延遲。注意:僅直播有效。當延時比較大時,播放器SDK內部會追幀等,保證播放器的延時在這個範圍內。
pConfig->maxDelayTime = 5000;
//最大緩衝區時間長度。單位ms。播放器每次最多載入所設定時間長度的緩衝資料。
pConfig->maxBufferDuration = 50000;
//高緩衝時間長度。單位ms。當網路不好導致載入資料時,如果載入的緩衝時間長度到達這個值,結束載入狀態。
pConfig->highBufferDuration = 3000;
// 起播緩衝區時間長度。單位ms。時間設定越短,起播越快。也可能會導致播放之後很快就會進入載入狀態。
pConfig->startBufferDuration = 500;
//其他設定
//給播放器設定配置
mPlayerPtr->setConfig(pConfig);
重要 三個緩衝區時間長度的大小關係必須為:startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration。

設定HTTP Header

播放器通過AVPConfig參數,可以給播放器中的請求加上HTTP的header參數。樣本如下:
//先擷取配置
AVPConfig *pConfig = mPlayerPtr->getConfig();
//設定header
pConfig->headerCount = 1;
pConfig->httpHeaders = new char *[pConfig->headerCount];
//比如使用httpdns時,需要設定Host。
pConfig->httpHeaders[0] = strdup("Host:example.com");
....//其他設定
//設定配置給播放器
mPlayerPtr->setConfig(pConfig);

效能

本機快取

Windows播放器SDK提供了本機快取(邊播邊緩衝)的功能,能夠讓使用者重複播放視頻時,達到省流量的目的。只需在prepare之前給播放器配置AVPCacheConfig即可實現此功能。樣本如下:
AVPCacheConfig mCacheConfig;
//開啟緩衝功能
mCacheConfig.enable = true;
//能夠緩衝的單個檔案最大時間長度。超過此長度則不緩衝
mCacheConfig.maxDuration = 100;
//緩衝目錄的最大大小。超過此大小,將會刪除最舊的快取檔案
mCacheConfig.maxSizeMB = 200;
//緩衝目錄的位置,需替換成APP期望的路徑
mCacheConfig.path = strdup("please use your cache path here");
//設定緩衝配置給到播放器
mPlayerPtr->setCacheConfig(&mCacheConfig);
緩衝成功之後,以下情況將會利用快取檔案(必須已經設定了setCacheConfig):
  • 如果設定了迴圈播放,那麼第二次播放的時候,將會自動播放緩衝的檔案。
  • 緩衝成功後,重新建立播放器,播放同樣的資源,也會自動使用快取檔案。
    重要 VID的快取檔案是通過vid等資訊定位的,所以VID的快取檔案將需要網路請求資訊之後才能確定使用哪個快取檔案。
邊播邊緩衝的使用有限制條件,具體如下:
  • 對於UrlSource播放方式。如果是HLS(即M3U8)地址,將不會緩衝。如果是其他支援的格式,則根據緩衝配置進行緩衝。
  • 對於VidAuth、VidSts播放方式,將會根據緩衝配置進行緩衝。
  • 播放器讀取完全部的資料則視為緩衝成功。如果在此之前,調用stop,或者出錯onError,則緩衝將會失敗。
  • cache內的seek的操作不會影響緩衝結果。cache外的seek會導致緩衝失敗。
  • 如果安全檔案與App資訊不一致,將會導致緩衝失敗。
  • cache的結果回調,會通過onPlayerEvent回調,包括EVENT_PLAYER_CACHE_SUCCESSEVENT_PLAYER_CACHE_ERROR

視頻下載

Windows播放器SDK提供了點播服務視頻的下載功能,允許使用者通過阿里雲播放器將視頻緩衝至本地觀看。同時,提供了普通下載和安全下載兩種下載方式。
  • 普通下載

    下載後的視頻資料未經過阿里雲加密,使用者可以用第三方播放器播放。

  • 安全下載

    下載後的視頻資料經過阿里雲加密。第三方播放器無法播放,僅支援使用阿里雲的播放器進行播放。

使用說明

  • 僅VidSts和VidAuth方式可使用視訊下載功能。
  • 使用播放器的視頻下載功能,需要在點播控制台開啟並配置下載模式,詳細操作請參見下載設定
  • 視頻下載支援斷點續傳。

操作步驟

  1. 可選:配置安全下載的加密校正檔案。僅安全下載需要配置,普通下載無需配置。
    說明 請確保配置的加密校正檔案與App資訊一致,否則會導致視頻下載失敗。

    如果設定為安全下載方式,則需要將在點播控制台產生的密鑰檔案配置到播放器SDK中,用於視頻下載和播放的解密驗證,密鑰檔案的產生請參見安全下載

    配置一次即可,樣本如下:
    InitPrivateService(fileContentBuffer, fileLength);
  2. 建立並設定下載器。
    樣本如下:
    mMediaDownloader = AliMediaDownloader::CreateMediaDownloader();
    mMediaDownloader->setListener(new AVDListenerImpl);
    mMediaDownloader->setSaveDirectory("saveDir");
  3. 準備下載源。
    通過prepare方法準備下載源,僅支援VidAuth(推薦)和VidSts方式的下載源。以VidSts方式的下載源為例,樣本如下:
    AVPVidStsSource vidSource;
    vidSource.initWithVid("視頻vid",
                          "accessKeyId",
                          "accessKeySecret",
                          "安全token",
                          "接入地區",
                          nullptr);
    mMediaDownloader->prepareWithVid(&vidSource);
  4. 準備成功後,選擇下載項。
    準備成功後,會回調onPrepared方法。返回的TrackInfo中會包含各視頻流的清晰度等資訊,請選擇一個Track進行下載,樣本如下:
    void YourClass::onPrepared(AliMediaDownloader *downloader, AVPMediaInfo *mediaInfo) {
        AVPTrackInfo *track = mediaInfo->tracks[0];
        mMediaDownloader->selectTrack(track->trackIndex);
    }
  5. 更新下載源並開始下載。
    為了防止VidSts和VidAuth到期,建議更新下載源的資訊後開始下載。樣本如下:
    mMediaDownloader->updateWithVid(&vidSource);
    mMediaDownloader->start();
  6. 下載成功或失敗後,釋放下載器。
    下載成功後,釋放下載器。樣本如下:
    delete mMediaDownloader;
    mMediaDownloader = nullptr;

相關文檔

介面說明