全部产品
云市场

高级播放器

更新时间:2019-07-15 16:14:47

一、概念说明

1. 高级播放器:除了具备基础播放器的所有功能外,还提供播放视频的高级能力,如视频加密、安全下载、边播边下缓存、清晰度切换等功能,建议使用阿里视频云点播和直播业务的用户使用。

2. RAM和STS:RAM和STS是阿里云提供的权限管理系统。RAM主要的作用是控制账号系统的权限。通过使用RAM可以将在主账号的权限范围内创建子用户,给不同的子用户分配不同的权限从而达到授权管理的目的。STS是一个安全凭证(Token)的管理系统,用来授予临时的访问权限,这样就可以通过STS来完成对于临时用户的访问授权。详细参考STS介绍

3. 临时AccessKeyId、AccessKeySecret和SecurityToken:开启RAM授权,并通过STS授权系统提供的OpenAPI或SDK获取的AccessKeyId、AccessKeySecret和SecurityToken,用于播放和下载请求。详见:STS SDK参考

4. playAuth:视频播放的唯一凭证,每个播放凭证都绑定了用户的身份标识,不同用户的播放凭证不能互换,否则无法正常播放视频。另外,播放凭证是有时效性的(默认100秒)。具体参数获取方法查看文档获取播放凭证

5. 防盗链:通过判断request请求头的refer是否来源于本站的方式来决定视频是否能被播放。(在点播或CDN控制台设置referer)具体设置方法查看防盗链设置

6.安全下载:安全下载是指将视频文件通过私钥进行二次加密,下载后在SDK内部完成视频解密,保障离线视频仅能通过唯一应用(安全下载中设定的bundleID或keystore)进行安全播放的一种下载方式。(限点播和MPS用户使用)

二、使用流程

2.1 基本使用流程

高级播放器拥除了拥有普通播放器的基本功能外,还提供了很多点播和直播的业务功能(详见:产品介绍),配合点播服务和直播服务获取视频ID或播放地址,集成高级播放器SDK框架(需集成AliyunPlayer.aar和AliyunVodPlayer.aar),然后调用播放器的Vid+STS或URL播放接口即可播放视频或观看直播。高级版使用流程

2.2 STS的播放流程

流程:用户App获取STS凭证 -> 服务端下发STS凭证 -> 用户上传视频并获取vid -> 服务端获取STS凭证 -> 将STS凭证下发给客户端 -> 完成视频播放。sts

注意:AppServer为用户App的服务端,需要用户使用服务端API或SDK自行开发。

2.3 PlayAuth的播放流程

流程:用户App获取上传凭证 -> 服务端下发上传凭证 -> 用户上传视频并获取vid -> 服务端获取播放凭证 -> 将播放凭证下发给客户端 -> 完成视频播放。playAuth播放

注意:AppServer为用户App的服务端,需要用户使用服务端API或SDK自行开发。

2.4 安全下载流程

在点播控制台全局设置-下载设置里面设置为安全下载->填写应用的bundleID或keystore的SHA1->生成并下载加密私钥文件->在SDK内集成并调用setEncrptyFile/setSecretImagePath设置加密私钥文件路径,加密文件获取详见文档,流程图如下:安全下载

备注:用户使用安全下载后,必须从控制台下载秘钥文件并集成在SDK里面。这样下载的视频不论是否是加密流,在本地都会存储为加密视频。如果使用普通下载,则无论是否是加密流,在本地都会存储为非加密视频,可以用任意播放器观看。

三、视频教程

3.1 点播播放视频教程

点播使用vid+sts播放的用户可以参考以下点播接入指南及Demo演示,视频教程演示如下:

3.2 加密下载视频教程

视频点播中安全文件下载参考快速接入指南及Demo演示,视频演示如下:

四、SDK集成

4.1 系统支持

播放器SDK支持Android4.0以上。手机芯片要求armv7或arm64架构。

4.2 运行环境

推荐开发者使用 Android Studio 作为自己的开发工具,本开发文档也是基于 Android Studio开发环境下进行编写的。

4.3 如何导入

播放器SDK支持普通导入和Maven两种导入方式,选择一种即可。

4.3.1 普通导入

1.需要将如下aar拷贝到libs中

aar拷贝到libs中

2.gradle中增加aar的引用

gradle中增加aar的引用

4.3.2 Maven导入

敬请期待

五、SDK使用

5.1 播放器初始化

在需要使用播放器SDK的activity里面引入添加如下初始化方法:

  1. aliyunVodPlayer = new AliyunVodPlayer(activity);

5.2 设置播放器监听事件

在使用播放器的activity里面添加监听事件,具体代码如下:

  1. aliyunVodPlayer.setOnPreparedListener(new IAliyunVodPlayer.OnPreparedListener() {
  2. @Override
  3. public void onPrepared() {
  4. //准备完成触发
  5. }
  6. });
  7. aliyunVodPlayer.setOnFirstFrameStartListener(new IAliyunVodPlayer.OnFirstFrameStartListener() {
  8. @Override
  9. public void onFirstFrameStart() {
  10. //首帧显示触发
  11. }
  12. });
  13. aliyunVodPlayer.setOnErrorListener(new IAliyunVodPlayer.OnErrorListener() {
  14. @Override
  15. public void onError(int arg0, int arg1, String msg) {
  16. //出错时处理,查看接口文档中的错误码和错误消息
  17. }
  18. });
  19. aliyunVodPlayer.setOnCompletionListener(new IAliyunVodPlayer.OnCompletionListener() {
  20. @Override
  21. public void onCompletion() {
  22. //播放正常完成时触发
  23. }
  24. });
  25. aliyunVodPlayer.setOnSeekCompleteListener(new IAliyunVodPlayer.OnSeekCompleteListener() {
  26. @Override
  27. public void onSeekComplete() {
  28. //seek完成时触发
  29. }
  30. });
  31. aliyunVodPlayer.setOnStoppedListner(new IAliyunVodPlayer.OnStoppedListener() {
  32. @Override
  33. public void onStopped() {
  34. //使用stop功能时触发
  35. }
  36. });
  37. aliyunVodPlayer.setOnChangeQualityListener(new IAliyunVodPlayer.OnChangeQualityListener() {
  38. @Override
  39. public void onChangeQualitySuccess(String finalQuality) {
  40. //视频清晰度切换成功后触发
  41. }
  42. @Override
  43. public void onChangeQualityFail(int code, String msg) {
  44. //视频清晰度切换失败时触发
  45. }
  46. });
  47. aliyunVodPlayer.setCircleStartListener(new IAliyunVodPlayer.OnCircleStartListener(){
  48. @Override
  49. public void onCircleStart() {
  50. //循环播放开始
  51. }
  52. });

更多接口,请参考高级播放器接口文档。

5.3 准备播放

在开始播放前,播放器必须先prepare,高级播放器一共提供四种播放方式,选择一种即可,示例如下:

  1. //播放方式一:使用vid+STS方式播放(点播用户推荐使用)
  2. String mVid = getIntent().getStringExtra("vid").toString();
  3. String akid = getIntent().getStringExtra("akId");
  4. String aks = getIntent().getStringExtra("akSecret");
  5. String token = getIntent().getStringExtra("securityToken");
  6. AliyunVidSts mVidSts = new AliyunVidSts();
  7. mVidSts.setVid(mVid);
  8. mVidSts.setAcId(akid);
  9. mVidSts.setAkSceret(aks);
  10. mVidSts.setSecurityToken(token);
  11. aliyunVodPlayer.prepareAsync(mVidSts);
  12. //播放方式二:使用URL播放(直播用户推荐使用)
  13. String url = getIntent().getStringExtra("url");
  14. AliyunLocalSource.AliyunLocalSourceBuilder asb = new AliyunLocalSource.AliyunLocalSourceBuilder();
  15. asb.setSource(url);
  16. //aliyunVodPlayer.setLocalSource(asb.build());
  17. AliyunLocalSource mLocalSource = asb.build();
  18. aliyunVodPlayer.prepareAsync(mLocalSource);
  19. //播放方式三:使用vid+playAuth方式播放
  20. //NOTE: 注意过期时间。特别是重播的时候,可能已经过期。所以重播的时候最好重新请求一次服务器。
  21. String mVid = getIntent().getStringExtra("vid").toString();
  22. String authInfo = getIntent().getStringExtra("authinfo");
  23. AliyunPlayAuth.AliyunPlayAuthBuilder aliyunPlayAuthBuilder = new AliyunPlayAuth.AliyunPlayAuthBuilder();
  24. aliyunPlayAuthBuilder.setVid(mVid);
  25. aliyunPlayAuthBuilder.setPlayAuth(authInfo);
  26. aliyunPlayAuthBuilder.setQuality(IAliyunVodPlayer.QualityValue.QUALITY_LOW);
  27. AliyunPlayAuth mPlayAuth = aliyunPlayAuthBuilder.build();
  28. aliyunVodPlayer.prepareAsync(mPlayAuth);
  29. //播放四:MPS的vid播放方式(仅限MPS用户使用)
  30. String mVid = getIntent().getStringExtra("vid").toString();
  31. String authInfo = getIntent().getStringExtra("authinfo");
  32. String token = getIntent().getStringExtra("token");
  33. String akid = getIntent().getStringExtra("akid");
  34. String aks = getIntent().getStringExtra("aks");
  35. AliyunVidSource mVidSource = new AliyunVidSource();
  36. mVidSource.setVid(mVid);
  37. mVidSource.setAuthInfo(authInfo);
  38. mVidSource.setStsToken(token);
  39. mVidSource.setAcKey(aks);
  40. mVidSource.setAcId(akid);
  41. mVidSource.setDomainRegion("cn-shanghai");
  42. aliyunVodPlayer.prepareAsync(mVidSource);

MPS播放的参数说明详见:MPS播放说明

5.4 播放器各种控制功能

用户自行创建播放器的播放控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止、暂停、恢复、重播、Seek、循环播放,其中Seek功能仅对点播有效,直播使用暂停功能时会使画面停留在当前画面,使用恢复后会开始播放当前画面。具体示例如下:

  1. //开始播放
  2. aliyunVodPlayer.start()
  3. //停止播放,在开始播放之后调用
  4. aliyunVodPlayer.stop()
  5. //暂停播放
  6. aliyunVodPlayer.pause()
  7. //恢复播放,在调用暂停播放之后调用
  8. aliyunVodPlayer.start()
  9. //重播,播放上一次的url
  10. aliyunVodPlayer.replay()
  11. //Seek,跳转到指定时间点的视频画面,时间单位为秒
  12. aliyunVodPlayer.seekTo(position)
  13. //循环播放
  14. aliyunVodPlayer.setCirclePlay(true);

5.5 清晰度切换

播放器在prepare成功之后可以设置清晰度,在清晰度切换的按钮事件中添加设置,用户可以自行开发根据网速情况选择当前清晰度,示例如下:

  1. //设置清晰度为标清
  2. aliyunVodPlayer.changeQuality(IAliyunVodPlayer.QualityValue.QUALITY_LOW);

5.6 播放进度和时间

播放的当前时间和播放时长在prepare成功之后可以获取。示例代码如下:

  1. //获取播放的当前时间,单位为秒
  2. aliyunVodPlayer.getCurrentPosition()
  3. //获取视频的总时长,单位为秒
  4. aliyunVodPlayer.getDuration()

5.7 倍数播放

在播放器创建之后可调用倍数播放功能,在开始播放之前和之后都可以起作用,仅对点播有效。示例代码如下:

  1. //倍数播放支持0.5~2倍的设置,支持音频变速不变调
  2. aliyunVodPlayer.setPlaySpped(speed)

5.8 边播边下缓存功能

边播边下缓存功能是在视频被成功播放后,文件会缓存到本地,再次播放视频时会直接使用本地缓存文件,不再走网络请求。加密流视频缓存到本地进行加密处理,需要集成安全下载加密文件,详见本文5.16。

可设置下载路径、最大下载数据(单位:MB)、单一视频最大允许下载的时长(单位:秒)

  1. //设置缓存目录路径。在创建播放器类,并在调用prepare方法之前设置。
  2. String sdDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/test_save_cache";
  3. aliyunVodPlayer.setPlayingCache(true, sdDir, 60 * 60 /*单个文件的最大时长, s */, 300 /*缓存目录文件的总大小,MB*/);
  4. //比如:maxSize设置500M时缓存文件超过500M后会优先覆盖最早缓存的文件。maxDuration设置为300秒时表示超过300秒的视频不会启用缓存功能。

功能限制说明:
1.缓存功能仅针对被完整播放的视频(seek后无效),主要用于短视频循环播放场景。
3.需要在播放器prepare之前调用。

5.9 截图功能

播放器在播放时,使用截图接口可以获取当前时间的视频画面。

  1. //截图后获取图片数据,存储、上传或分享需用户自行处理
  2. Bitmap bitmap = aliyunVodPlayer.snapShot();

5.10 获取播放器状态

用户可以获取播放器的当前播放状态,可获取的状态有闲时、错误、准备完成、播放中、暂停中、已停止、播放完成和加载中。代码示例如下:

  1. aliyunVodPlayer.getPlayerState()

5.11 视频渲染旋转角度

设置视频画面旋转角度,支持0°,90°,180°,270°设置,默认0°,角度按顺时针方向计算

  1. mPlayer.setRenderRotate(MediaPlayer.VideoRotate.ROTATE_90);

5.12 画面镜像

支持设置画面镜像,包括水平镜像和垂直镜像。默认为无镜像。

  1. mPlayer.setRenderMirrorMode(MediaPlayer.VideoMirrorMode.VIDEO_MIRROR_MODE_VERTICAL);

5.13 播放器其他功能

播放器还提供了自动播放、音量控制、静音、亮度调节、显示模式设置和获取媒体信息等接口。示例代码如下:

  1. //设置自动播放,设置后调用prepare之后会自动开始播放,无需调start接口
  2. aliyunVodPlayer.setAutoPlay(bAutoPlay)
  3. //设置播放器音量(系统音量),值为0~100
  4. aliyunVodPlayer.setVolume(volume)
  5. //设置为静音
  6. aliyunVodPlayer.setMuteMode(bMute)
  7. //设置亮度(系统亮度),值为0~100
  8. aliyunVodPlayer.setScreenBrightness(brightness)
  9. //设置显示模式,可设置为fit方式填充或corp方式裁剪充满
  10. aliyunVodPlayer.setVideoScalingMode(IAliyunVodPlayer.VideoScalingMode.VIDEO_SCALING_MODE_SCALE_TO_FIT);
  11. aliyunVodPlayer.setVideoScalingMode(IAliyunVodPlayer.VideoScalingMode.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
  12. //获取媒体信息,在prepareDone的时候才可以获取,主要可获取信息有视频ID、视频标题、视频封面、视频总时长、当前视频清晰度、所有视频清晰度
  13. aliyunVodPlayer.getMediaInfo()

5.14 referer设置

客户端发送视频播放器请求时带上referer信息。(同时支持地址和vid播放)。使用流程如下:

  1. 控制台-防盗链-开启防盗链
  2. 添加黑白名单(黑名单:如果设置referer是被添加的域名,则不能访问,白名单:如果设置的referer被添加到白名单的域名才可以访问)
  3. 默认不选中允许空referer,如果允许空refer,则客户端不设置referer是可以访问的。如果设置了,但是错误的,则不能访问。

示例代码:

  1. aliyunVodPlayer.setReferer("http://aliyun.com);

5.15 播放器直播时移功能

  1. mAliyunLiveTimeShift = new AliyunLiveTimeShift();
  2. //设置时移播放地址。
  3. mAliyunLiveTimeShift.setUrl(播放地址);
  4. //设置时移地址,获取可时移段。
  5. mAliyunLiveTimeShift.setTimeLineUrl(获取时移段的地址);
  6. //获取当前直播时间
  7. long mLiveTime = mPlayer.getCurrentLiveTime();
  8. //获取当前播放时间
  9. long mPlayTime = mPlayer.getCurrentTime();
  10. //获取时移接口返回的时移数据,每60秒更新一次。
  11. mPlayer.setOnTimeShiftUpdaterListener(new OnTimeShiftUpdaterListener(){....});
  12. //seek 到播放某一时间点,单位秒
  13. mPlayer.seekToLiveTime(seekTime);

5.16 下载功能

视频云点播服务提供两种下载方式:普通下载和安全下载。普通下载即下载的视频存在本地为非加密视频可以任意传播(即使视频流是加密的,下载后也为普通视频,谨慎使用)。安全下载可确保下载的视频为加密视频,仅能通过在控制台下载加密文件时填写的bundleID或签名绑定的应用播放(需要保护视频版权的用户使用,限点播和MPS用户)。

加密文件获取参考文档

5.16.1 获取对象并设置代理

在需要使用下载功能的activity里面添加如下代码:

  1. //获取下载的单例对象,并设置监听
  2. downloadManager = AliyunDownloadManager.getInstance(this);
  3. //两种刷新方式。具体描述参见高级播放器接口说明文档
  4. // downloadManager.setRefreshAuthCallBack(authCallback);
  5. downloadManager.setRefreshStsCallback(new MyRefreshStsCallback());

5.16.2 设置下载监听事件

根据需求在使用下载功能的activity里面添加监听事件。

  1. //注意在不需要的时候,调用remove,移除监听。
  2. downloadManager.addDownloadInfoListener(downloadInfoListener);

5.16.3 设置下载路径和最大下载个数

设置下载路径后,视频下载后存放在用户设置的目录下面。只需要设置一次即可。建议在Application中做设置。

  1. AliyunDownloadConfig config = new AliyunDownloadConfig();
  2. //设置加密文件路径。使用安全下载的用户必须设置(在准备下载之前设置),普通下载可以不用设置。
  3. config.setSecretImagePath(Environment.getExternalStorageDirectory().getAbsolutePath()+"/aliyun/encryptedApp.dat");
  4. //设置保存路径。请确保有SD卡访问权限。
  5. config.setDownloadDir(Environment.getExternalStorageDirectory().getAbsolutePath()+"/test_save/");
  6. //设置最大下载个数,最多允许同时开启4个下载
  7. config.setMaxNums(4);
  8. AliyunDownloadManager.getInstance(this).setDownloadConfig(config);

5.16.4 设置加密文件路径

使用安全下载的用户必须设置(在准备下载之前设置),普通下载可以不用设置。

  1. //将下载的加密文件集成到自己的项目中,确保加密文件的路径正确
  2. config.setSecretImagePath(Environment.getExternalStorageDirectory().getAbsolutePath()+"/aliyun/encryptedApp.dat");

5.16.5 准备下载

准备下载的目的是为了获取需要下载的视频流信息,如果明确知道需要下载的视频流,可以不使用准备下载功能。

  1. //以下参数使用STS方式下载的用户使用
  2. AliyunVidSts vidSts = new AliyunVidSts();
  3. //设置vidsts信息
  4. ....
  5. downloadManager.prepareDownloadMedia(vidSts);
  6. //以下参数使用playAuth下载方式的用户使用
  7. AliyunPlayAuth playAuth = ....
  8. //设置playAuth信息
  9. ....
  10. downloadManager.prepareDownloadMedia(playAuth);
  11. //以下参数使用mps下载方式的用户使用
  12. AliyunVidSource mVidSource = new AliyunVidSource();
  13. //设置vidsource的信息
  14. ....
  15. downloadManager.prepareDownloadMedia(mVidSource);

5.16.6 开始下载

准备下载和开始下载为相互独立的功能,在用户获取到需要下载的Datasource便可开始下载。

  1. //以下参数使用STS方式下载的用户使用
  2. downloadManager.setRefreshStsCallback(new AliyunRefreshStsCallback() {
  3. @Override
  4. public AliyunVidSts refreshSts(String vid, String quality, String format, String title, boolean encript) {
  5. //NOTE: 注意:这个不能启动线程去请求。因为这个方法已经在线程中调用了。
  6. AliyunVidSts vidSts = VidStsUtil.getVidSts();
  7. if (vidSts == null) {
  8. return null;
  9. } else {
  10. vidSts.setVid(vid);
  11. vidSts.setQuality(quality);
  12. vidSts.setTitle(title);
  13. return vidSts;
  14. }
  15. };
  16. //添加要下载的info到downloadManager中:
  17. downloadManager.addDownloadMedia(info);
  18. //开始下载,info为prepare要下载的info。
  19. downloadManager.startDownloadMedia(info)
  20. //以下方式使用playAuth下载方式的用户使用
  21. downloadManager.setRefreshAuthCallBack(new AliyunRefreshPlayAuthCallback() {
  22. @Override
  23. public AliyunPlayAuth refreshPlayAuth(String vid, String quality, String format, String title, boolean encript) {
  24. //NOTE: 注意:这个不能启动线程去请求。因为这个方法已经在线程中调用了。
  25. String playauth = PlayAuthUtil.getPlayAuth( vid);
  26. if (playauth == null) {
  27. return null;
  28. }
  29. AliyunPlayAuth.AliyunPlayAuthBuilder authBuilder = new AliyunPlayAuth.AliyunPlayAuthBuilder();
  30. authBuilder.setPlayAuth(playauth);
  31. authBuilder.setVid(vid);
  32. authBuilder.setTitle(title);
  33. authBuilder.setQuality(quality);
  34. authBuilder.setFormat(format);
  35. authBuilder.setIsEncripted(encript ? 1 : 0);
  36. return authBuilder.build();
  37. }
  38. });
  39. //添加要下载的info到downloadManager中:
  40. downloadManager.addDownloadMedia(info);
  41. //开始下载,info为prepare要下载的info。
  42. downloadManager.startDownloadMedia(info)
  43. //以下方式使用mps下载方式的用户使用
  44. downloadManager.setRefreshVidSourceCallback(new AliyunRefreshVidSourceCallback() {
  45. @Override
  46. public AliyunVidSource refreshVidSource(String vid, String quality, String format, String title, boolean encript) {
  47. //NOTE: 注意:这个不能启动线程去请求。因为这个方法已经在线程中调用了。
  48. AliyunVidSource vidSource = getVidSource();
  49. return vidSource;
  50. }
  51. });
  52. //添加要下载的info到downloadManager中:
  53. downloadManager.addDownloadMedia(info);
  54. //开始下载,info为prepare要下载的info。
  55. downloadManager.startDownloadMedia(info)

备注:可以将多个info添加到数组,使用`startDownloadMedias·进行多个下载。

5.16.7 停止下载

  1. //可以在开始下载的监听里面获取当前正在下载的AliyunDownloadMediaInfo(同步接口)
  2. //单独停止
  3. AliyunDownloadMediaInfo downloadInfo;
  4. downloadManager.stopDownloadMedia(downloadInfo)
  5. //批量停止:
  6. List<AliyunDownloadMediaInfo> downloadInfos;
  7. downloadManager.stopDownloadMedias(downloadInfos)

5.16.8 下载列表相关功能

  1. //获取所有的视频资源列表,包括停止的,正在下载的
  2. final List<AliyunDownloadMediaInfo> downloadingMedias = downloadManager.getDownloadingMedias();
  3. //清除指定下载的媒体资源,AliyunDownloadMediaInfo可以通过onCompletion的回调获取
  4. downloadManager.removeDownloadMedia(info);

备注:使用清除媒体资源接口后会清除已经下载的本地视频文件。

更多请参功能和接口请参考接口文档

六、混淆配置

  1. -keep class com.alivc.player.**{*;}
  2. -keep class com.aliyun.clientinforeport.**{*;}
  3. -keep class com.aliyun.vodplayer.**{*;}
  4. -dontwarn com.alivc.player.**

七、注意事项

  1. SDK提供的是aar库,请参考SDK导入说明的方式添加,集成后包大小增加5.0M左右
  2. 当前SDK仅支持HLS、RTMP、HTTP FLV、mp4、mp3等流格式,支持的视频编码格式为H264,音频编码格式为AAC。建议使用MPS或点播平台转码后使用。
  3. 部分低端机型在使用变速功能时可能存在性能问题。
  4. 播放器使用软解,硬解功能暂不支持。
  5. 强烈推荐使用playAuth方式播放点播视频,其相比STS方式,在易用性、安全性、灵活性等各方面都有优势,详情参考 凭证与STS方式对比
  6. 使用点播上传不转码的用户,在使用vid播放时需要配合V3.1.0之后的版本使用。
  7. 当前ffmpeg版本为V3.3。