全部产品
云市场
云游戏

功能使用

更新时间:2020-08-05 20:10:06

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

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

功能具体介绍如下:

一. 播放功能

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

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

1.创建播放器

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

如果有配置安全下载功能(即经过阿里云加密转码过后的),那么还需要设置一个加密校验信息,传入encryptedApp.dat文件的内容,参考安全文件获取

  1. InitPrivateService(fileContentBuffer, fileLength);

2.设置播放器Listener

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

  1. mPlayerPtr->setListener(new AVPListenerImpl);

3.创建DataSource,准备播放

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

  1. AVPVidStsSource vidSource;
  2. vidSource.initWithVid(视频vid,
  3. "accessKeyId",
  4. "accessKeySecret",
  5. "安全token",
  6. "接入区域",
  7. nullptr);
  8. mPlayerPtr->setSource(vidSource);
  9. mPlayerPtr->prepare();

4.设置显示的view

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

5. 播放控制

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

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

6.切换码率

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

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

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

  1. int trackIndex = trackInfo->trackIndex;
  2. mPlayerPtr->selectTrack(trackIndex);

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

7.自动播放

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

  1. mPlayerPtr->setAutoPlay(true);

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

  1. void onPlayerEvent(AliPlayer *player, AVPEventType eventType)
  2. {
  3. if (eventType == AVPEventPrepareDone) {
  4. //准备完成
  5. }
  6. else if (eventType == AVPEventAutoPlayStart) {
  7. //自动起播完成
  8. }
  9. }

8.循环播放

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

  1. mPlayerPtr->setLoop(true);

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

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

  1. //设置画面的镜像模式:水平镜像,垂直镜像,无镜像。
  2. mPlayerPtr->setMirrorMode(AVP_MIRRORMODE_HORIZONTAL);
  3. //设置画面旋转模式:旋转0度,90度,180度,270度
  4. mPlayerPtr->setRotateMode(AVP_ROTATE_0);
  5. //设置画面缩放模式:宽高比填充,宽高比适应,拉伸填充
  6. 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~2.0。

  1. mPlayerPtr->setMute(true);
  2. mPlayerPtr->setVolume(1.0f);

11.倍数播放

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

  1. mPlayerPtr->setRate(1.5);

12.硬解开关

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

  1. mPlayerPtr->enableHardwareDecoder(true);

13.设置Referer

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

  1. //先获取配置
  2. AVPConfig *pConfig = mPlayerPtr->getConfig();
  3. //设置referer
  4. pConfig->referer = referer;
  5. ....//其他设置
  6. //设置配置给播放器
  7. mPlayerPtr->setConfig(pConfig);

14.设置UserAgent

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

  1. //先获取配置
  2. AVPConfig *pConfig = mPlayerPtr->getConfig();
  3. //设置userAgent
  4. pConfig->userAgent = userAgent;
  5. ....//其他设置
  6. //设置配置给播放器
  7. mPlayerPtr->setConfig(pConfig);

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

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

  1. //先获取配置
  2. AVPConfig *pConfig = mPlayerPtr->getConfig();
  3. //设置网络超时时间,单位ms
  4. pConfig->networkTimeout = 5000;
  5. //设置超时重试次数。每次重试间隔为networkTimeout。networkRetryCount=0则表示不重试,重试策略app决定,默认值为2
  6. pConfig->networkRetryCount = 2;
  7. ....//其他设置
  8. //设置配置给播放器
  9. 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提供了设置缓存和延迟的控制接口。

  1. //先获取配置
  2. AVPConfig *pConfig = mPlayerPtr->getConfig();
  3. //最大延迟。注意:直播有效。当延时比较大时,播放器sdk内部会追帧等,保证播放器的延时在这个范围内。
  4. pConfig->maxDelayTime = 5000;
  5. // 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。
  6. pConfig->maxBufferDuration = 50000;
  7. //高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。
  8. pConfig->highBufferDuration = 3000;
  9. // 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。
  10. pConfig->startBufferDuration = 500;
  11. //其他设置
  12. //设置配置给播放器
  13. mPlayerPtr->setConfig(pConfig);

注意:三个缓冲区时长的大小关系必须为:startBufferDuration<=highBufferDuration<=maxBufferDuration。

17.支持HTTP Header设置

播放器通过AVPConfig参数,可以给播放器中的请求加上http的header参数。代码如下:

  1. //先获取配置
  2. AVPConfig *pConfig = mPlayerPtr->getConfig();
  3. //设置header
  4. pConfig->headerCount = 1;
  5. pConfig->httpHeaders = new char *[pConfig->headerCount];
  6. //比如使用httpdns时,需要设置Host。
  7. pConfig->httpHeaders[0] = strdup("Host:xxx.com");
  8. ....//其他设置
  9. //设置配置给播放器
  10. mPlayerPtr->setConfig(pConfig);

18.截图功能

播放器SDK提供了对当前视频截图的功能 snapshot。截取的是原始的argb32格式的数据,回调接口为onSnapshotImageBuffer。 注意:截图是不包含界面的。

  1. //截取当前播放的画面
  2. mPlayerPtr->snapshot();
  3. //截图回调
  4. void AlivcLivePlayerMainDlg::onSnapshotImageBuffer(AliPlayer *player, int width, int height, unsigned char *pARGBBuffer)
  5. {
  6. QString savePath = "save path";
  7. QImage snapshot(pARGBBuffer, width, height, QImage::Format_ARGB32);
  8. snapshot.save(savePath);
  9. }

19.边播边缓存

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

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

  1. AVPCacheConfig mCacheConfig;
  2. //开启缓存功能
  3. mCacheConfig.enable = true;
  4. //能够缓存的单个文件最大时长。超过此长度则不缓存
  5. mCacheConfig.maxDuration = 100;
  6. //缓存目录的最大大小。超过此大小,将会删除最旧的缓存文件
  7. mCacheConfig.maxSizeMB = 200;
  8. //缓存目录的位置,需替换成app期望的路径
  9. mCacheConfig.path = strdup("please use your cache path here");
  10. //设置缓存配置给到播放器
  11. 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为例:

  1. VidPlayerConfigGenerator playConfigGen;
  2. playConfigGen.setPreviewTime(10);
  3. AVPVidStsSource vidSource;
  4. vidSource.initWithVid(视频vid,
  5. "accessKeyId",
  6. "accessKeySecret",
  7. "安全token",
  8. "接入区域",
  9. playConfigGen.generatePlayerConfig());
  10. mPlayerPtr->setSource(vidSource);

二.视频下载功能

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

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

1.创建并设置下载器

创建下载器。代码如下:

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

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

  1. InitPrivateService(fileContentBuffer, fileLength);

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

2.准备下载源

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

  1. AVPVidStsSource vidSource;
  2. vidSource.initWithVid(视频vid,
  3. "accessKeyId",
  4. "accessKeySecret",
  5. "安全token",
  6. "接入区域",
  7. nullptr);
  8. mMediaDownloader->prepareWithVid(&vidSource);

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

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

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

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

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

  1. mMediaDownloader->updateWithVid(&vidSource);
  2. mMediaDownloader->start();

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

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

  1. delete mMediaDownloader;
  2. mMediaDownloader = nullptr;