AliyunPlayer  v5.2.0
Aliyun Player API Reference Manual for Windows Platforms
AliyunPlayer Documentation

功能概述

阿里云SDK提供了以下几大功能:

  • 单个视频播放功能
  • 下载视频功能
  • 缓存功能

功能具体介绍如下:

一. 播放功能

播放功能的基本流程如下:

创建播放器->设置事件监听->创建播放源->准备播放器->准备成功后开始播放->播放控制->释放播放器。

1.创建播放器

using namespace alivc_player;
AliPlayer* mPlayerPtr = AliPlayer::CreatePlayer();

如果有配置安全下载功能(即经过阿里云加密转码过后的),那么还需要设置一个加密校验信息,传入encryptedApp.dat文件的内容,安全文件获取参考https://help.aliyun.com/document_detail/57920.html?spm=a2c4g.11186623.2.14.3fb16c08ApE9sj ,Windows使用的APP唯一标识是app数字签名证书的序列号 app数字签名证书的序列号

InitPrivateService(fileContentBuffer, fileLength);

2.设置播放器Listener

播放器提供了各种事件回调,比如:onPlayerEvent,onError等事件。使用时需要一个类继承IAVPListener,并实现里面的纯虚函数。

mPlayerPtr->setListener(new AVPListenerImpl);

3.创建DataSource,准备播放

播放器支持4种播放源:AVPVidStsSource,AVPVidAuthSource,AVPVidMpsSource,AVPUrlSource。其中AVPUrlSource是直接通过url进行播放,其余的三种是通过vid进行播放:点播用户推荐使用AVPVidAuthSource;AVPVidMpsSource仅限MPS用户使用。 以VidSts举例,使用方式如下:

AVPVidStsSource vidSource;
vidSource.initWithVid(视频vid,
"accessKeyId",
"accessKeySecret",
"安全token",
"接入区域",
nullptr);
mPlayerPtr->setSource(vidSource);
mPlayerPtr->prepare();
  • MPS视频播放的流程与概念,参考https://help.aliyun.com/document_detail/53522.html
  • 通过播放凭证VidAuth播放的流程,参考https://help.aliyun.com/document_detail/57294.html
  • 接入区域Region的设置,参考https://help.aliyun.com/document_detail/98194.html

4.设置显示的view

mPlayerPtr->setView((void *)显示区域的HWND);

5. 播放控制

在prepare成功之后(onPlayerEvent回调中收到eventType等于AVPEventPrepareDone的事件),用户可以开始播放及进行播放控制。 用户自行创建播放器的播放控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止、暂停、拖动(seek),其中Seek功能仅对点播有效,直播使用暂停功能时会使画面停留在当前画面,使用恢复后会开始播放当前画面。使用示例如下:

// 开始播放。
mPlayerPtr->start();
//暂停播放
mPlayerPtr->pause();
//停止播放
mPlayerPtr->stop();
// 跳转到。mode分为精确seek和非精确seek。非精确seek会跳转到向前最近的关键帧处。精确seek会精确到seek的时间,但比非精确seek慢一些。
mPlayerPtr->seekToTime(int64_t time_in_ms, mode);
// 重置
mPlayerPtr->reset();
//销毁播放器
mPlayerPtr->destroy();

6.切换码率

播放器SDK支持HLS多码率地址播放。在prepare成功之后,通过getMediaInfo可以获取到各个码流的信息,即TrackInfo。

AVPMediaInfo mediaInfo = mPlayerPtr->getMediaInfo();
for (int i = 0; i < mediaInfo.trackCount; i++) {
AVPTrackInfo *trackInfo = mediaInfo.tracks[i];
}

在播放过程中,可以通过调用播放器的selectTrack方法切换播放的码流。

int trackIndex = trackInfo->trackIndex;
mPlayerPtr->selectTrack(trackIndex);

切换的结果会在IAVPListener::onTrackChanged回调:

7.自动播放

播放器SDK支持自动播放视频的设置。在prepare之前设置autoPlay。

mPlayerPtr->setAutoPlay(true);

设置自动播放之后,prepare成功之后,将会自动播放视频。但是注意:自动播放的时候将不会回调IAVPListener::onPlayerEvent中AVPEventPrepareDone回调,而会回调AVPEventAutoPlayStart回调。

void onPlayerEvent(AliPlayer *player, AVPEventType eventType)
{
if (eventType == AVPEventPrepareDone) {
//准备完成
}
else if (eventType == AVPEventAutoPlayStart) {
//自动起播完成
}
}

8.循环播放

播放器SDK提供了循环播放视频的功能。设置loop开启循环播放, 播放完成后,将会自动从头开始播放视频。同时循环开始的回调将会在AVPEventLoopingStart中通知

mPlayerPtr->setLoop(true);

9.画面旋转、填充、镜像操作

播放器SDK提供过了多种设置,可以对画面进行精确的控制。包括设置画面旋转模式,设置画面缩放模式,设置镜像模式。

//设置画面的镜像模式:水平镜像,垂直镜像,无镜像。
mPlayerPtr->setMirrorMode(AVP_MIRRORMODE_HORIZONTAL);
//设置画面旋转模式:旋转0度,90度,180度,270度
mPlayerPtr->setRotateMode(AVP_ROTATE_0);
//设置画面缩放模式:宽高比填充,宽高比适应,拉伸填充
mPlayerPtr->setScalingMode(AVP_SCALINGMODE_SCALEASPECTFILL);

画面的旋转模式包括:

说明
AVP_ROTATE_0 顺时针旋转0度
AVP_ROTATE_90 顺时针旋转90度
AVP_ROTATE_180 顺时针旋转180度
AVP_ROTATE_270 顺时针旋转270度

画面的缩放模式包括:

说明
AVP_SCALINGMODE_SCALEASPECTFIT 宽高比适应(将按照视频宽高比等比缩小到view内部,不会有画面变形)
AVP_SCALINGMODE_SCALEASPECTFILL 宽高比填充(将按照视频宽高比等比放大,充满view,不会有画面变形)
AVP_SCALINGMODE_SCALETOFILL 拉伸填充(如果视频宽高比例与view比例不一致,会导致画面变形)

镜像模式包括:

说明
AVP_MIRRORMODE_NONE 无镜像
AVP_MIRRORMODE_HORIZONTAL 水平镜像
AVP_MIRRORMODE_VERTICAL 垂直镜像

10.静音、音量控制

播放器SDK 提供了对视频的音量控制功能。设置mute播放器静音,设置volume控制音量大小,范围是0~1。

mPlayerPtr->setMute(true);
mPlayerPtr->setVolume(1.0f);

11.倍数播放

播放器SDK 提供了倍数播放视频的功能,通过设置rate方法, 能够以0.5倍~2倍数去播放视频。同时保持变声不变调。

mPlayerPtr->setRate(1.5);

12.硬解开关

播放器SDK 提供了264,265的硬解码能力,同时提供了enableHardwareDecoder提供开关。默认开,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。

mPlayerPtr->enableHardwareDecoder(true);

13.设置Referer

播放器SDK提供了AVPConfig 用来设置请求referer。配合控制台的黑白名单referer,可以控制访问权限。播放器SDK的设置如下

//先获取配置
AVPConfig *pConfig = mPlayerPtr->getConfig();
//设置referer
pConfig->referer = referer;
....//其他设置
//设置配置给播放器
mPlayerPtr->setConfig(pConfig);

14.设置UserAgent

播放器SDK提供了AVPConfig 用来设置请求UA。设置之后,播放器请求的过程中将会带上UA信息。播放器SDK的设置如下:

//先获取配置
AVPConfig *pConfig = mPlayerPtr->getConfig();
//设置userAgent
pConfig->userAgent = userAgent;
....//其他设置
//设置配置给播放器
mPlayerPtr->setConfig(pConfig);

15.配置网络重试时间和次数

通过AVPConfig,用户可以设置播放器SDK的网络超时的时间和重试次数。播放器SDK的设置如下:

//先获取配置
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方法进行重新加载网络,或者进行其他的处理。

16.配置缓存和延迟控制

对于播放器来说,缓存的控制非常重要。合理的配置,可以有效的加快起播速度,减少卡顿。播放器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。

17.支持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:xxx.com");
....//其他设置
//设置配置给播放器
mPlayerPtr->setConfig(pConfig);

18.截图功能

播放器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);
}

19.边播边缓存

播放器SDK提供了边播边缓存的功能,能够让用户重复播放视频时,达到省流量的目的。只需在prepare之前给播放器配置 AVPCacheConfig 即可实现此功能。

如果播放了加密视频,还需要一个加密校验文件的配置。参看 1.创建播放器

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的缓存文件,将需要网络请求信息之后才能确定使用哪个缓存文件。

边播边缓存也不是所有的视频都会缓存,有些情况是 不会缓存的 。这里详细介绍一下:

  1. 对于直接播放URL的方式,即AVPUrlSource。如果是HLS(即m3u8)地址,将不会缓存。如果是其他支持的格式,则根据缓存配置进行缓存。
  2. 对于VID的方式播放,将会根据缓存配置进行缓存。
  3. 播放器读取完全部的数据则视为缓存成功。如果在此之前,调用stop,或者出错onError,则缓存将会失败。
  4. cache内的seek的操作不会影响缓存结果。cache外的seek会导致缓存失败。
  5. 如果加密文件与app信息不一致,将会缓存失败。
  6. cache的结果回调,会通过 onPlayerEvent 回调,EVENT_PLAYER_CACHE_SUCCESS,EVENT_PLAYER_CACHE_ERROR

20. 试看功能

试看功能是指:当设置试看的时长,通过播放器SDK播放视频时,服务端将不会返回完整的视频内容,而是返回试看时间段的内容。
播放器SDK 通过配合点播服务配置,可以实现试看功能,支持VidSts和VidAuth两种方式。如何配置和使用试看功能参考 点播试看最佳实践 。配置试看功能之后,通过SDK的 VidPlayerConfigGenerator 的 setPreviewTime 方法设置播放器的试看时长。以AVPVidStsSource为例:

VidPlayerConfigGenerator playConfigGen;
playConfigGen.setPreviewTime(10);
AVPVidStsSource vidSource;
vidSource.initWithVid(视频vid,
"accessKeyId",
"accessKeySecret",
"安全token",
"接入区域",
playConfigGen.generatePlayerConfig());
mPlayerPtr->setSource(vidSource);

二.视频下载功能

阿里云SDK提供了点播服务视频的下载功能,能够通过VidSts和VidAuth下载点播服务上的视频。同时,下载的方式提供了 安全下载普通下载 的模式(在控制台设置)。
普通下载 含义是:即使点播服务已经加密过了,下载后的视频数据也不是经过阿里云加密的。也就是说,**用户可以用第三方播放器播放**。
安全下载 含义是:即使点播服务没有加密视频,下载后的视频数据也是经过阿里云加密的。也就是说,**用户用第三方播放器是播放不了的。只能使用阿里云的播放器去播放**

视频下载的基本流程如下:
创建并设置下载器->设置事件监听->准备下载源->准备成功后选择下载项->更新下载源并开始下载->下载成功/失败后,释放下载器。

1.创建并设置下载器

创建下载器。代码如下:

mMediaDownloader = AliMediaDownloader::CreateMediaDownloader();
mMediaDownloader->setListener(new AVDListenerImpl);
mMediaDownloader->setSaveDirectory("saveDir");

下载SDK支持私有加密的下载。为了保证安全性,还需要设置一个加密校验信息,传入encryptedApp.dat文件的内容

InitPrivateService(fileContentBuffer, fileLength);

下载时如果是安全下载,那么不一致的话,会导致下载失败。

2.准备下载源

通过preapre方法准备下载源。下载源支持AVPVidStsSource和AVPVidAuthSource两种。以AVPVidStsSource举例:

AVPVidStsSource vidSource;
vidSource.initWithVid(视频vid,
"accessKeyId",
"accessKeySecret",
"安全token",
"接入区域",
nullptr);
mMediaDownloader->prepareWithVid(&vidSource);

3.准备成功后选择下载项

准备成功后,会回调onPrepared方法。选择某个Track进行下载:

void YourClass::onPrepared(AliMediaDownloader *downloader, AVPMediaInfo *mediaInfo) {
AVPTrackInfo *track = mediaInfo->tracks[0];
mMediaDownloader->selectTrack(track->trackIndex);
}

4.更新下载源并开始下载

经过上面几步之后,就可以开始下载了(为了防止VidSts和VidAuth过期,最好更新一下下载源的信息):

mMediaDownloader->updateWithVid(&vidSource);
mMediaDownloader->start();

5.下载成功/失败后,释放下载器

下载成功后,释放下载器。

delete mMediaDownloader;
mMediaDownloader = nullptr;