本文提供Android播放器进阶功能的使用示例。

播放

短视频列表播放

针对典型的短视频列表播放场景,Android播放器SDK提供了完善的列表播放功能,结合预加载等机制大幅改善短视频的起播速度。长视频场景不建议使用该功能。

  1. 创建播放器。
    通过AliPlayerFactory类创建AliListPlayer播放器。示例如下:
    AliListPlayer aliyunListPlayer;
    .....
    aliyunListPlayer = AliPlayerFactory.createAliListPlayer(getApplicationContext());
    aliyunListPlayer.setTraceId("traceId");  //traceId为设备或用户的唯一标识符,通常为imei或idfa
  2. 可选:设置监听器。
    创建列表播放时,监听器为非必须配置,但如果不设置,将无法收到播放器的播放失败、播放进度等事件通知,因此,建议您设置。其中OnPreparedListenerOnErrorListenerOnCompletionListenerOnLoadingStatusListenerOnInfoListener较为重要,建议您设置。
    aliyunListPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
        @Override
        public void onCompletion() {
            //播放完成事件
        }
    });
    aliyunListPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            //出错事件
        }
    });
    aliyunListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            //准备成功事件
        }
    });
    aliyunListPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            //视频分辨率变化回调
        }
    });
    aliyunListPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            //首帧渲染显示事件
        }
    });
    aliyunListPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            //其他信息的事件,type包括了:循环播放开始,缓冲位置,当前播放位置,自动播放开始等
        }
    });
    aliyunListPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            //缓冲开始。
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            //缓冲进度
        }
        @Override
        public void onLoadingEnd() {
            //缓冲结束
        }
    });
    aliyunListPlayer.setOnSeekCompleteListener(new IPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete() {
            //拖动结束
        }
    });
    aliyunListPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            //显示字幕
        }
        @Override
        public void onSubtitleHide(long id) {
            //隐藏字幕
        }
    });
    aliyunListPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            //切换音视频流或者清晰度成功
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            //切换音视频流或者清晰度失败
        }
    });
    aliyunListPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            //播放器状态改变事件
        }
    });
    aliyunListPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            //截图事件
        }
    });
  3. 设置预加载个数。
    合理设置预加载个数,能够有效的提高起播的速度。示例如下:
    //设置预加载个数。总共加载的个数为: 1 + count*2。
    aliyunListPlayer.setPreloadCount(int count);
  4. 添加或移除多个播放源。
    列表播放支持两种播放源:VidSts播放和UrlSource播放。Url为视频的播放地址。示例如下:
    • Url:播放地址可以是第三方点播地址或阿里云点播服务中的播放地址。阿里云播放地址可以调用获取音视频播放地址接口获取。建议您集成点播服务端SDK来获取音视频播放地址,免去自签名的麻烦。调用接口获取音视频播放地址的示例请参见开发者门户
    • Vid:音视频ID,可以在音视频上传完成后通过控制台(路径:媒资库 > 音/视频。)或服务端接口(搜索媒体信息)获取。
    //添加VidSts播放源
    aliyunListPlayer.addVid(String videoId, String uid);
    //添加UrlSource播放源
    aliyunListPlayer.addUrl(String url, String uid);
    //移除某个源
    aliyunListPlayer.removeSource(String uid);
    说明
    • 不支持VidAuth播放和VidMps播放方式。
    • uid是视频的唯一标志。用于区分视频是否一样。如果uid一样,则认为视频是一样的。如果播放出现串流的情况,请注意查看是不是在不同的界面设置了同一个uid。uid没有格式限制,可以是任意的字符串。
  5. 设置显示View。
    播放器支持SurfaceView和TextureView,任选其中一种即可。
    • 设置SurfaceView,示例如下:
      SurfaceView surfaceView = findViewById(R.id.surface_view);
      surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
          @Override
          public void surfaceCreated(SurfaceHolder holder) {
              aliyunListPlayer.setSurface(holder.getSurface());
          }
      
          @Override
          public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
              aliyunListPlayer.surfaceChanged();
          }
      
          @Override
          public void surfaceDestroyed(SurfaceHolder holder) {
              aliyunListPlayer.setSurface(null);
          }
      });
    • 设置TextureView,示例如下:
      TextureView textureView = findViewById(R.id.texture_view);
      textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
          @Override
          public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
              aliyunListPlayer.setSurface(new Surface(surface));
          }
      
          @Override
          public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
              aliyunListPlayer.surfaceChanged();
          }
      
          @Override
          public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
              aliyunListPlayer.setSurface(null);
              return false;
          }
      
          @Override
          public void onSurfaceTextureUpdated(SurfaceTexture surface) {
      
          }
      });
  6. 播放视频源。
    添加了一个或多个播放源之后,调用moveTo便可以自动播放某个视频源。示例如下:
    //url时使用此接口
    aliyunVodPlayer.moveTo(String uid);
    //vid的时候使用此接口,需要传递stsInfo即STS临时凭证和临时AK对,需要提前获取,获取方式请参见创建角色并进行STS临时授权。
    aliyunVodPlayer.moveTo(String uid, StsInfo info);
  7. 播放上一个、下一个视频。
    播放器提供了moveToPrevmoveToNext接口用于播放上一个,下一个视频。示例如下:
    //移动到下一个视频。 注意:只能用于url的源。这个方法不适用于vid的播放。
    aliyunVodPlayer.moveToNext();
    //移动到上一个视频。注意:只能用于url的源。这个方法不适用于vid的播放。
    aliyunVodPlayer.moveToPrev();
    //移动到下一个视频。注意:只能用于vid的播放。
    aliyunVodPlayer.moveToNext(StsInfo info);
    // 移动到上一个视频。注意:只能用于vid的播放。
    aliyunVodPlayer.moveToPrev(StsInfo info);

外挂字幕

Android播放器SDK支持添加和切换外挂字幕,现已支持SRT、SSA、ASS、VTT这4种格式的字幕。示例如下:

  1. 创建显示字幕的View。
    根据不同的字幕格式创建不同的View。
    //用于显示SRT和VTT字幕
    SubtitleView subtitleView = new SubtitleView(getContext());
    //用于显示ASS和SSA字幕
    AssSubtitleView assSubtitleView = new AssSubtitleView(getContext());
    //将字幕View添加到布局视图中
    viewGroup.addView(assSubtitleView);
  2. 设置字幕相关监听。
    mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleExtAdded(int trackIndex, String url) { }
    
        @Override
        public void onSubtitleShow(int trackIndex, long id, String data) {
                // ass 字幕
            assSubtitleView.show(id,data);
    
            // srt 字幕
            SubtitleView.Subtitle subtitle = new SubtitleView.Subtitle();
            subtitle.id = id + "";
            subtitle.content = data;
            subtitleView.show(subtitle);
    
        }
    
        @Override
        public void onSubtitleHide(int trackIndex, long id) {
                // ass 字幕
                assSubtitleView.dismiss(id);
    
            // srt 字幕
            subtitleView.dismiss(id + "");
        }
    
        @Override
        public void onSubtitleHeader(int trackIndex, String header) { }
    });
  3. 添加字幕。
    mAliPlayer.addExtSubtitle(url);
  4. 切换字幕。
    //trackIndex:传入字幕索引;true:表示显示传入的字幕;false:表示隐藏传入的字幕
    mAliPlayer.selectExtSubtitle(trackIndex, true);

纯音频播放

通过禁用视频播放,达到纯音频播放的效果。在prepare之前配置PlayerConfig。
PlayerConfig config = mAliPlayer.getConfig();
config.mDisableVideo = true;  //设置开启纯音频播放
mAliPlayer.setConfig(config);

软硬解切换

说明 解码方式需要在播放前切换,播放中切换解码方式将不会生效。
Android播放器SDK提供了H.264、H.265的硬解码能力,同时提供了enableHardwareDecoder提供开关。默认开,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。示例如下:
//开启硬解。默认开启
mAliyunVodPlayer.enableHardwareDecoder(true);
如果从硬解自动切换为软解,将会通过onInfo回调,示例如下:
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
            //切换到软解
        }
    }
});

网络自适应切换视频清晰度

Android播放器SDK支持多码率自适应HLS、DASH视频流。在prepare成功之后,通过getMediaInfo可以获取到各个码流的信息,即TrackInfo。示例如下:
List<TrackInfo> trackInfos  = aliyunVodPlayer.getMediaInfo().getTrackInfos();
在播放过程中,可以通过调用播放器的selectTrack方法切换播放的码流,取值为AUTO_SELECT_INDEX时,为多码率自适应。示例如下:
int index = trackInfo.getIndex();
//多码率切换
aliyunVodPlayer.selectTrack(index);
//多码率切换并自适应
aliyunVodPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);
切换的结果会在OnTrackChangedListener监听之后会回调(在调用selectTrack之前设置)。示例如下:
aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
    @Override
    public void onChangedSuccess(TrackInfo trackInfo) {
        //切换成功
    }
    @Override
    public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
        //切换失败。失败原因通过errorInfo.getMsg()获取
    }
});

截图

Android播放器SDK提供了对当前视频截图的功能,由snapshot接口实现。截取的是原始的数据,并转为bitmap返回。回调接口为OnSnapShotListener。示例如下:
//设置截图回调
aliyunVodPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        //获取到的bitmap以及图片的宽高。
    }
});
//截取当前播放的画面
aliyunVodPlayer.snapshot();

试看

Android播放器SDK通过配合点播服务配置,可以实现试看功能,支持VidSts和VidAuth(视频点播推荐使用此方式)两种播放方式。如何配置和使用试看功能,请参见点播试看

配置试看功能之后,通过VidPlayerConfigGen.setPreviewTime()方法设置播放器的试看时长。以VidSts播放方式为例,示例如下:
VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);//20秒试看
vidSts.setPlayConfig(configGen);//设置给播放源
...
当设置试看的时长,通过Android播放器SDK播放视频时,服务端将不会返回完整的视频内容,而是返回试看时间段的内容。
说明
  • VidPlayerConfigGen支持设置服务端支持的请求参数。请参见请求参数说明
  • FLV和MP3格式视频暂时不支持试看。

设置黑名单

Android播放器SDK提供了硬解的黑名单机制。对于明确不能使用硬解播放的机器,可以直接使用软解,避免了无效的操作。示例如下:
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );
说明 退出App之后,黑名单自动失效。

设置Referer

Android播放器SDK支持设置Referer,配合控制台的黑白名单Referer,可以控制访问权限,由PlayerConfig方法设置请求Referer。播放器SDK的设置示例如下:
//先获取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//设置referer,示例:http://example.aliyundoc.com。(注意:设置referer时,需要加上前面的协议部分。)
config.mReferrer = referrer;
....//其他设置
  //设置配置给播放器
mAliyunVodPlayer.setConfig(config);

设置UserAgent

Android播放器SDK提供了PlayerConfig用来设置请求UA。设置之后,播放器请求的过程中将会带上UA信息。示例如下:
//先获取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//设置UA
config.mUserAgent = "需要设置的UserAgent";
....//其他设置
  //设置配置给播放器
mAliyunVodPlayer.setConfig(config);

配置网络重试时间和次数

支持设置Android播放器SDK的网络超时的时间和重试次数,由PlayerConfig方法实现。示例如下:
//先获取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//设置网络超时时间,单位:毫秒
config.mNetworkTimeout = 5000;
//设置超时重试次数。每次重试间隔为networkTimeout。networkRetryCount=0则表示不重试,重试策略app决定,默认值为2
config.mNetworkRetryCount=2;
....//其他设置
  //设置配置给播放器
mAliyunVodPlayer.setConfig(config);
说明
  • 如果设置了NetworkRetryCount,若此时发生网络问题,导致出现loading后,那么将会重试NetworkRetryCount次,每次的间隔时间为mNetworkTimeout。
  • 如果重试多次之后,还是loading的状态,那么就会回调onError事件,此时,ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT。
  • 如果NetworkRetryCount设置为0,当网络重试超时的时候,播放器就会回调onInfo事件,事件的InfoBean.getCode()=InfoCode.NetworkRetry。 此时,可以调用播放器的reload方法进行重新加载网络,或者进行其他的处理。

配置缓存和延迟控制

Android播放器SDK通过PlayerConfig提供了设置缓存和延迟的控制接口。示例如下:
//先获取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//最大延迟。注意:直播有效。当延时比较大时,播放器sdk内部会追帧等,保证播放器的延时在这个范围内。
config.mMaxDelayTime = 5000;
// 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。
config.mMaxBufferDuration = 50000;
//高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。
config.mHighBufferDuration = 3000;
// 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。
config.mStartBufferDuration = 500;
....//其他设置
//往前缓存的最大时长。单位ms。默认为0。
config.mMaxBackwardBufferDurationMs = 0;

//设置配置给播放器
mAliyunVodPlayer.setConfig(config);
注意 三个缓冲区时长的大小关系必须为:mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration。

设置HTTP Header

通过PlayerConfig方法,可以给播放器中的请求加上HTTP的header参数。示例如下:
//先获取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//定义header
String[] headers = new String[1];
headers[0]="Host:example.com";//比如需要设置Host到header中。
//设置header
config.setCustomHeaders(headers);
....//其他设置
  //设置配置给播放器
mAliyunVodPlayer.setConfig(config);

性能

本地缓存

Android播放器SDK提供了本地缓存(边播边缓存)的功能,能够让用户重复播放视频时,达到省流量的目的。只需在prepare之前给播放器配置CacheConfig即可实现此功能。示例如下:
CacheConfig cacheConfig = new CacheConfig();
//开启缓存功能
cacheConfig.mEnable = true;
 //能够缓存的单个文件最大时长。超过此长度则不缓存
cacheConfig.mMaxDurationS =100;
//缓存目录的位置
cacheConfig.mDir = "缓存的文件目录";
 //缓存目录的最大大小。超过此大小,将会删除最旧的缓存文件
cacheConfig.mMaxSizeMB = 200;
//设置缓存配置给到播放器
mAliyunVodPlayer.setCacheConfig(cacheConfig);
缓存成功之后,以下情况将会利用缓存文件(必须已经设置了setCacheConfig
  • 如果设置了循环播放,即setLoop(true),那么第二次播放的时候,将会自动播放缓存的文件。
  • 缓存成功后,重新创建播放器,播放同样的资源,也会自动使用缓存文件。
    说明 vid的缓存文件是通过vid等信息定位的,所以对于vid的缓存文件,将需要网络请求信息之后才能确定使用哪个缓存文件。
播放器提供了获取缓存文件路径的接口:
API接口 描述 参数 返回值
public String getCacheFilePath(String URL) 根据URL获取缓存的文件名。必须先调用setCacheConfig接口才能获取到。 URL 最终缓存的文件绝对路径。
public String getCacheFilePath(String vid, String format, String definition, int previewTime) 根据vid获取缓存的文件名。必须先调用setCacheConfig接口才能获取到。
  • vid:视频ID
  • format:视频格式
  • definition:视频清晰度
  • previewTime:试看时长
最终缓存的文件绝对路径。
边播边缓存的使用有限制条件,具体如下:
  • 对于UrlSource播放方式。如果是HLS(即M3U8)地址,将不会缓存。如果是其他支持的格式,则根据缓存配置进行缓存。
  • 对于VidAuth、VidSts播放方式,将会根据缓存配置进行缓存。
  • 播放器读取完全部的数据则视为缓存成功。如果在此之前,调用stop,或者出错onError,则缓存将会失败。
  • cache内的seek的操作不会影响缓存结果。cache外的seek会导致缓存失败。
  • 如果视频源是加密的,此时如果加密文件与App信息不一致,将会缓存失败。
  • cache的结果回调,会通过onInfo回调。
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if(infoBean.getCode() == InfoCode.CacheSuccess){
            //缓存成功事件。
        }else if(infoBean.getCode() == InfoCode.CacheError){
            //缓存失败事件
        }
    }
});

预加载

Android播放器SDK提供预加载功能,是对本地缓存(边播边缓存)功能的升级,通过设置视频缓存的内存占用大小,更能提升视频的起播速度。

预加载功能的使用说明如下所示:
  • 目前支持MP4、MP3、FLV、HLS(单码率视频流)等单个媒体文件的加载。
  • 仅支持UrlSource播放方式播放视频的预加载,暂不支持VidAuth、VidSts方式播放视频的预加载。
  1. 开启本地缓存功能。
    本地缓存功能默认关闭,如需使用,需要手动开启。通过AliPlayerGlobalSettings中的enableLocalCache控制。
    /**
     *  开启本地缓存,开启之后,会缓存到本地文件中。
     *
     *  @param enable - 本地缓存功能开关。true:开启本地缓存,false:关闭,默认关闭。
     *  @param maxBufferMemoryKB - 设置能够缓存的单个视频源文件的最大内存占用大小,超过此大小则不缓存,单位:KB。
     *  @param localCacheDir - 本地缓存的文件目录,为绝对路径。
     */
    public static void enableLocalCache(boolean enable,
                                        int maxBufferMemoryKB,
                                        java.lang.String localCacheDir)
    
     /**
      * 本地缓存文件清理相关配置。
      *
      * @param expireMin - 设置缓存的过期时间。单位:分钟,默认值30天,过期的缓存不管容量多大,都会被删除。
      * @param maxCapacityMB - 最大缓存容量。单位:兆,默认值20GB,在清理时,如果缓存总容量超过此大小,则会以cacheItem为粒度,按缓存的最后时间排序,一个一个的删除最旧的缓存文件,直到小于等于最大缓存容量。
      * @param freeStorageMB - 磁盘最小空余容量。单位:兆,默认值0,在清理时,同最大缓存容量,如果当前磁盘容量小于该值,也会按规则一个一个的删除缓存文件,直到freeStorage大于等于该值或者所有缓存都被清理掉。
      */
     public static void setCacheFileClearConfig(long expireMin,
                                               long maxCapacityMB,
                                               long freeStorageMB)
    
      /**
       * 设置加载url的hash值回调。如果不设置,SDK使用md5算法。
       */
      public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
    说明
    • 如果视频播放URL带有鉴权参数,预加载和播放时鉴权参数会变化,可以将URL的鉴权参数去掉后再计算md5值。例如:带有鉴权参数的视频播放URL为http://****.mp4?aaa,则加载时使用http://****.mp4计算md5值。
    • 如果服务器同时支持HTTP和HTTPS协议,但是不同的协议指向的媒体文件是同一个,则可以将请求头去掉或者统一后再计算md5值。例如:
      • 视频播放URL为https://****.mp4http://****.mp4,则加载时使用****.mp4计算md5值。
      • 视频播放URL为https://****.mp4,加载时统一为http://****.mp4后再计算md5值。
  2. 获取AliMediaLoader实例。

    AliMediaLoader实例为单例,即无论获取多少次,创建的都是同一个实例。

    MediaLoader mediaLoader = MediaLoader.getInstance();
  3. 配置AliMediaLoader。

    配置回调,并开始加载。

    /**
     * 设置加载状态回调
     */
    mediaLoader.setOnLoadStatusListener(new MediaLoader.OnLoadStatusListener() {
        @Override
        public void onError(String url, int code, String msg) {
            //加载出错
        }
    
        @Override
        public void onCompleted(String s) {
            //加载完成
        }
    
        @Override
        public void onCanceled(String s) {
            //加载取消
        }
    });
    /**
     * 开始加载文件。异步加载。可以同时加载多个视频文件。
     * @param url - 视频文件地址。
     * @param duration - 加载的时长大小,单位:毫秒。
     */
    mediaLoader.load("url","duration");
  4. 可选:删除加载文件。
    可按需删除加载文件,以节省空间。Android播放器SDK不提供删除接口,需要在App删除加载目录下的文件。

获取下载速度

指获取当前播放视频的下载速度,在onInfo回调中获取,由getExtraValue接口实现。示例如下:
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
            //当前下载速度
            long extraValue = infoBean.getExtraValue();
        }
    }
});

网络特性

用HTTP/2

Android播放器SDK支持使用HTTP/2协议,该协议通过多路复用,避免队头阻塞,以改善播放性能。示例如下:
AliPlayerGlobalSettings.setUseHttp2(true);

视频下载

Android播放器SDK提供了点播服务视频的下载功能,能够通过VidSts和VidAuth方式下载点播服务上的视频。同时,下载的方式提供了安全下载和普通下载的模式(可登录点播控制台,选择配置管理 > 分发加速配置 > 下载设置配置)。
  • 普通下载

    下载后的视频数据未经过阿里云加密,用户可以用第三方播放器播放。

  • 安全下载

    下载后的视频数据经过阿里云加密。第三方播放器无法播放。仅支持使用阿里云的播放器进行播放。

  1. 创建并设置下载器创建下载器,通过AliDownloaderFactory创建。示例如下:
    AliMediaDownloader mAliDownloader = null;
    ......
    //创建下载器
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    //配置下载保存的路径
    mAliDownloader.setSaveDir("保存的文件夹地址");
    下载SDK支持私有加密的下载。为了保证安全性,需要配置一个加密校验文件到SDK(建议在Application中配置一次即可)。示例如下:
    PrivateService.initService(getApplicationContext(),  "encryptedApp.dat所在的文件路径");
    注意 如果是安全下载,并且加密校验文件与App信息不一致,会导致下载失败。
  2. 设置监听事件。
    下载器提供了多个事件监听。示例如下:
    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           //准备下载项成功
       }
    });
    mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() {
       @Override
       public void onDownloadingProgress(int percent) {
           //下载进度百分比
       }
       @Override
       public void onProcessingProgress(int percent) {
           //处理进度百分比
       }
    });
    mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() {
       @Override
       public void onError(ErrorInfo errorInfo) {
           //下载出错
       }
    });
    mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() {
       @Override
       public void onCompletion() {
           //下载成功
       }
    });
  3. 准备下载源。
    通过preapre方法准备下载源。下载源支持VidSts和VidAuth两种方式。以VidSts举例,示例如下:
    //创建VidSts
    VidSts aliyunVidSts = new VidSts();
    aliyunVidSts.setVid(视频vid);
    aliyunVidSts.setAccessKeyId(临时akId);
    aliyunVidSts.setAccessKeySecret(临时akSecret);
    aliyunVidSts.setSecurityToken(安全token);
    aliyunVidSts.setRegion(接入区域);
    //准备下载源
    mAliDownloader.prepare(aliyunVidSts)
    说明 源文件是什么格式,则输出的下载文件就是什么格式,不支持更改。
  4. 准备成功后,选择下载项。
    准备成功后,会回调OnPreparedListener方法。返回的TrackInfo中会包含各视频流的清晰度等信息,请选择一个Track进行下载,示例如下:
    public void onPrepared(MediaInfo mediaInfo) {
        //准备下载项成功
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        //比如:下载第一个TrackInfo
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
    }
  5. 更新下载源并开始下载。
    为了防止VidSts和VidAuth过期,建议更新下载源的信息后开始下载。示例如下:
    //更新下载源
    mAliDownloader.updateSource(VidSts);
    //开始下载
    mAliDownloader.start();
  6. 下载成功或失败后,释放下载器。
    下载成功后,调用release释放下载器。在onCompletion或者onError回调中。示例如下:
    mAliDownloader.stop();
    mAliDownloader.release();
  7. 删除下载的文件。
    下载过程中,或者下载完成后,可以删除下载的文件。示例如下:
    //通过对象删除文件
    mAliDownloader.deleteFile();
    //通过静态方法删除
    AliDownloaderFactory.deleteFile("下载文件夹路径",vid, format,index);

视频加密播放

点播视频支持HLS标准加密、阿里云私有加密和DRM加密,直播视频仅支持DRM加密。加密播放请参见播放加密视频

Native RTS播放

Android播放器SDK集成Native RTS SDK实现Native端低延时直播功能,详情请参见阿里云播放器SDK集成Native RTS SDK实现说明(Android端)

异常处理

使用阿里云播放器播放视频发生异常时,可借助单点探查功能快速定位问题,详细内容,请参见单点探查

相关文档