本文提供Windows播放器SDK進階功能的使用樣本。
進階播放
外掛字幕
Windows播放器SDK支援添加和切換外掛字幕,現僅支援SRT格式。樣本如下:
- 建立顯示字幕的控制項。根據不同的字幕格式建立不同的View。
mSubtitleLabelPtr = new QLabel(QString(""), this); mSubtitleLabelPtr->setParent(this);
- 設定字幕相關監聽。
//外掛字幕被添加 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); }
- 添加字幕。
mPlayerPtr->addExtSubtitle("url");
- 切換字幕。
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視頻流需要經過多碼率視頻轉碼模板組打包處理,可以在點播控制台的視頻或字幕打包模板設定。
中配置生產對應的視頻流,詳細操作請參見在播放過程中,可以通過調用播放器的
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_SUCCESS
和EVENT_PLAYER_CACHE_ERROR
。
視頻下載
Windows播放器SDK提供了點播服務視頻的下載功能,允許使用者通過阿里雲播放器將視頻緩衝至本地觀看。同時,提供了普通下載和安全下載兩種下載方式。
- 普通下載
下載後的視頻資料未經過阿里雲加密,使用者可以用第三方播放器播放。
- 安全下載
下載後的視頻資料經過阿里雲加密。第三方播放器無法播放,僅支援使用阿里雲的播放器進行播放。
使用說明
- 僅VidSts和VidAuth方式可使用視訊下載功能。
- 使用播放器的視頻下載功能,需要在點播控制台開啟並配置下載模式,詳細操作請參見下載設定。
- 視頻下載支援斷點續傳。
操作步驟
- 可選:配置安全下載的加密校正檔案。僅安全下載需要配置,普通下載無需配置。說明 請確保配置的加密校正檔案與App資訊一致,否則會導致視頻下載失敗。
如果設定為安全下載方式,則需要將在點播控制台產生的密鑰檔案配置到播放器SDK中,用於視頻下載和播放的解密驗證,密鑰檔案的產生請參見安全下載。
配置一次即可,樣本如下:InitPrivateService(fileContentBuffer, fileLength);
- 建立並設定下載器。樣本如下:
mMediaDownloader = AliMediaDownloader::CreateMediaDownloader(); mMediaDownloader->setListener(new AVDListenerImpl); mMediaDownloader->setSaveDirectory("saveDir");
- 準備下載源。通過
prepare
方法準備下載源,僅支援VidAuth(推薦)和VidSts方式的下載源。以VidSts方式的下載源為例,樣本如下:AVPVidStsSource vidSource; vidSource.initWithVid("視頻vid", "accessKeyId", "accessKeySecret", "安全token", "接入地區", nullptr); mMediaDownloader->prepareWithVid(&vidSource);
- 準備成功後,選擇下載項。準備成功後,會回調
onPrepared
方法。返回的TrackInfo中會包含各視頻流的清晰度等資訊,請選擇一個Track進行下載,樣本如下:void YourClass::onPrepared(AliMediaDownloader *downloader, AVPMediaInfo *mediaInfo) { AVPTrackInfo *track = mediaInfo->tracks[0]; mMediaDownloader->selectTrack(track->trackIndex); }
- 更新下載源並開始下載。為了防止VidSts和VidAuth到期,建議更新下載源的資訊後開始下載。樣本如下:
mMediaDownloader->updateWithVid(&vidSource); mMediaDownloader->start();
- 下載成功或失敗後,釋放下載器。下載成功後,釋放下載器。樣本如下:
delete mMediaDownloader; mMediaDownloader = nullptr;