通过调用相应接口创建普通播放器或列表播放器,并可按需选择调用播放器提供的其他功能接口。

简介

播放器SDK通过AliPlayerFactory类创建播放器,可以创建AliPlayer(普通播放)和AliListPlayer(列表播放)两种播放器,并可按需选择使用播放器提供的播放功能,同时播放器SDK还提供了视频下载、加密直播播放的功能。

创建普通播放器(手动播放)

创建AliPlayer普通播放器时,可分为创建手动播放和自动播放。本节介绍创建手动播放的操作步骤,以下步骤为创建一个手动播放的普通播放器最简要的步骤,播放器SDK还提供了丰富的其他播放功能,您可以按需配置,相关操作请参见播放功能

  1. 创建播放器。
    通过AliPlayerFactory类创建AliPlayer播放器。
    AliPlayer aliPlayer = AliPlayerFactory.createAliPlayer(context);
    aliPlayer.setTraceId("traceId");  //traceId为设备或用户的唯一标识符,通常为imei或idfa
  2. 设置监听器。
    播放器支持设置多个监听器。
    • OnPreparedListener必须设置,因为手动播放需要在OnPreparedListener回调中调用aliPlayer.start()开始播放。
    • OnErrorListenerOnCompletionListenerOnLoadingStatusListenerOnInfoListener较为重要,建议您设置。
    aliPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        //此回调会在使用播放器的过程中,出现了任何错误,都会回调此接口。
    
        @Override
        public void onError(ErrorInfo errorInfo) {
            ErrorCode errorCode = errorInfo.getCode(); //错误码
            String errorMsg =errorInfo.getMsg(); //错误描述
            //出错后需要停止掉播放器
            aliPlayer.stop();
        }
    });
    aliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        // 调用aliPlayer.prepare()方法后,播放器开始读取并解析数据。成功后,会回调此接口。
    
        @Override
        public void onPrepared() {
            //一般调用start开始播放视频
            aliPlayer.start();
        }
    });
    aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
        //播放完成之后,就会回调到此接口。
        @Override
        public void onCompletion() {
            //一般调用stop停止播放视频
            aliPlayer.stop();
        }
    });
    aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        //播放器中的一些信息,包括:当前进度、缓存位置等等
        @Override
        public void onInfo(InfoBean infoBean) {
            InfoCode code = infoBean.getCode(); //信息码
            String msg = infoBean.getExtraMsg();//信息内容
            long value = infoBean.getExtraValue(); //信息值
    
            //当前进度:InfoCode.CurrentPosition
            //当前缓存位置:InfoCode.BufferedPosition
        }
    });
    aliPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        //播放器的加载状态, 网络不佳时,用于展示加载画面。
    
        @Override
        public void onLoadingBegin() {
            //开始加载。画面和声音不足以播放。
            //一般在此处显示圆形加载
        }
    
        @Override
        public void onLoadingProgress(int percent, float netSpeed) {
            //加载进度。百分比和网速。
        }
    
        @Override
        public void onLoadingEnd() {
            //结束加载。画面和声音可以播放。
            //一般在此处隐藏圆形加载
        }
    });
  3. 创建DataSource。
    支持4种播放源:VidSts播放、VidAuth播放、VidMps播放、UrlSource播放。
    说明
    • UrlSource是直接通过URL播放,其余的三种是通过vid进行播放:VidSts,VidAuth限点播用户使用;VidMps仅限MPS用户使用。
    • MPS视频播放的流程与概念,请参见视频播放
    • 接入地域Region的设置,请参见点播中心和访问域名
    • AccessKey Id、AccessKey Secret、SecurityToken、视频ID(VideoId)、播放地址URL等信息,请参见参数解析问题
    示例如下:
    //UrlSource方式
            UrlSource urlSource = new UrlSource();
            urlSource.setUri("播放地址");//既支持HTTP、HTTPS、RTMP、ARTC等协议在线音视频播放,也支持通过本地文件的绝对路径(支持file://或content://)播放本地音视频
            aliPlayer.setDataSource(urlSource);
    //VidAuth方式
            VidAuth vidAuth = new VidAuth();
            vidAuth.setVid("Vid信息");//视频ID(VideoId)
            vidAuth.setPlayAuth("playAuth信息");//播放凭证
            vidAuth.setRegion("接入地域");//点播服务的接入地域,默认为cn-shanghai
            aliPlayer.setDataSource(vidAuth);
    //VidSts方式
            VidSts vidSts = new VidSts();
            vidSts.setVid("Vid信息");//视频ID(VideoId)
            vidSts.setAccessKeyId("<yourAccessKeyId>");//鉴权ID
            vidSts.setAccessKeySecret("<yourAccessKeySecret>");//鉴权密钥
            vidSts.setSecurityToken("<yourSecurityToken>");//安全token
            vidSts.setRegion("接入地域");//点播服务的接入地域,默认为cn-shanghai
            aliPlayer.setDataSource(vidSts);
    //VidMps方式
            VidMps vidMps = new VidMps();
            vidMps.setRegion("接入地域");//点播服务的接入地域,默认为cn-shanghai
            vidMps.setMediaId("媒体ID");//媒体ID,也是视频ID(VideoId)
            vidMps.setAuthInfo("认证信息");//设置认证信息
            vidMps.setAccessKeyId("<yourAccessKeyId>");//鉴权ID
            vidMps.setSecurityToken("<yourSecurityToken>");//安全token
            vidMps.setPlayDomain("播放Domain信息");//设置播放Domain
            vidMps.setHlsUriToken("HlsUriToken信息");//设置HlsUriToken
            vidMps.setAccessKeySecret("<yourAccessKeySecret>");//鉴权密钥
            aliPlayer.setDataSource(vidMps);
  4. 设置显示View。
    播放器支持SurfaceView和TextureView,任选其中一种即可。
    • 设置SurfaceView,示例如下:
      SurfaceView surfaceView = findViewById(R.id.surface_view);
      surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
          @Override
          public void surfaceCreated(SurfaceHolder holder) {
              aliPlayer.setSurface(holder.getSurface());
          }
      
          @Override
          public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
              aliPlayer.surfaceChanged();
          }
      
          @Override
          public void surfaceDestroyed(SurfaceHolder holder) {
              aliPlayer.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) {
              aliPlayer.setSurface(new Surface(surface));
          }
      
          @Override
          public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
              aliPlayer.surfaceChanged();
          }
      
          @Override
          public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
              aliPlayer.setSurface(null);
              return false;
          }
      
          @Override
          public void onSurfaceTextureUpdated(SurfaceTexture surface) {
      
          }
      });
  5. 开始准备播放。

    调用aliPlayer.prepare()开始读取并解析数据。

    aliPlayer.prepare();
  6. 开始播放。
    通过在OnPrepared回调中调用aliPlayer.start()开始播放视频。
    aliPlayer.start();//开始之后可以调用pause()暂停播放视频。

创建普通播放器(自动播放)

本节介绍创建自动播放的操作步骤,以下步骤为创建一个自动播放的普通播放器最简要的步骤,播放器SDK还提供了丰富的其他播放功能,您可以按需配置,相关操作请参见播放功能

  1. 创建播放器。
    通过AliPlayerFactory类创建AliPlayer播放器。创建播放器的方法与创建手动播放的方法一致,请参见创建普通播放器(手动播放)的步骤一
  2. 可选:设置监听器。
    创建自动播放时,监听器为非必须配置,但如果不设置,将无法收到播放器的播放失败、播放进度等事件通知,因此,建议您设置。

    播放器支持设置多个监听器,其中OnPreparedListenerOnErrorListenerOnCompletionListenerOnLoadingStatusListenerOnInfoListener较为重要,建议您设置。

    设置监听器的方法与创建手动播放的方法一致,请参见创建普通播放器(手动播放)的步骤二

  3. 创建DataSource。
    支持4种播放源:VidSts播放、VidAuth播放、VidMps播放、UrlSource播放。创建DataSource的方法与创建手动播放的方法一致,请参见创建普通播放器(手动播放)的步骤三
  4. 设置显示View。
    播放器支持SurfaceView和TextureView,任选其中一种即可。设置显示View的方法与创建手动播放的方法一致,请参见创建普通播放器(手动播放)的步骤四
  5. 开启自动播放。
    aliPlayer.setAutoPlay(true);
  6. 开始准备播放。
    调用aliPlayer.prepare()开始读取并解析数据,数据解析完成后将开始自动播放视频。设置方法与创建手动播放的方法一致,请参见创建普通播放器(手动播放)的步骤五

创建列表播放器

当前短视频列表播放比较流行。阿里云播放器提供了完整的列表播放功能,内部包含预加载机制,大幅提高了视频的起播速度。

本节介绍创建列表播放的操作步骤,以下步骤为创建一个列表播放器最简要的步骤,播放器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为视频的播放地址,Vid为点播视频的视频ID(videoId)。示例如下:
    //添加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,保证不会失效
    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);

播放功能

播放器SDK提供了丰富的播放功能,可按需选择性的设置使用。
说明 以下示例均以AliPlayer类型的普通播放器的代码为例,AliListPlayer类型的列表播放器的代码与其相似,可参考设置。
  • 播放控制
    您可以自行创建播放器的播放控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止、暂停、拖动(Seek),其中Seek功能仅对点播有效,直播使用暂停功能时会使画面停留在当前画面,使用恢复后会开始播放当前画面。示例如下:
    // 开始播放。
    aliyunVodPlayer.start();
    //暂停播放
    aliyunVodPlayer.pause();
    //停止播放
    aliyunVodPlayer.stop();
    // 跳转到。不精准。
    aliyunVodPlayer.seekTo(long position);
    // 重置
    aliyunVodPlayer.reset();
    //释放。释放后播放器将不可再被使用。
    aliyunVodPlayer.release();
  • 切换多码率
    播放器SDK支持HLS多码率地址播放。在prepare成功之后,通过getMediaInfo可以获取到各个码流的信息,即TrackInfo。示例如下:
    List<TrackInfo> trackInfos  = aliyunVodPlayer.getMediaInfo().getTrackInfos();
    在播放过程中,可以通过调用播放器的selectTrack方法切换播放的码流。示例如下:
    int index = trackInfo.getIndex();
    aliyunVodPlayer.selectTrack(index);
    切换的结果会在OnTrackChangedListener监听之后会回调(在调用selectTrack之前设置)。示例如下:
    aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            //切换成功
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            //切换失败。失败原因通过errorInfo.getMsg()获取
        }
    });
  • 循环播放
    播放器SDK提供了循环播放视频的功能。调用setLoop开启循环播放,播放完成后,将会自动从头开始播放视频。示例如下:
    aliyunVodPlayer.setLoop(true);
    同时循环开始的回调将会使用onInfo中通知。示例如下:
    aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(InfoBean infoBean) {
            if (infoBean.getCode() == InfoCode.LoopingStart){
                //循环播放开始事件。
            }
        }
    });
  • 画面旋转、画面填充、画面镜像
    播放器SDK提供了多种设置,可以对画面进行精确的控制。包括设置画面旋转模式,设置画面缩放模式,设置镜像模式。示例如下:
    //设置画面的镜像模式:水平镜像,垂直镜像,无镜像。
    aliyunVodPlayer.setMirrorMode(MirrorMode.MIRROR_MODE_NONE);
    //设置画面旋转模式:旋转0度,90度,180度,270度
    aliyunVodPlayer.setRotateMode(RotateMode.ROTATE_0);
    //设置画面缩放模式:宽高比填充,宽高比适应,拉伸填充
    aliyunVodPlayer.setScaleMode(ScaleMode.SCALE_ASPECT_FIT);
    画面的旋转模式包括:
    说明
    ROTATE_0 顺时针旋转0度。
    ROTATE_90 顺时针旋转90度。
    ROTATE_180 顺时针旋转180度。
    ROTATE_270 顺时针旋转270度。
    画面的缩放模式包括:
    说明
    SCALE_ASPECT_FIT 宽高比适应(将按照视频宽高比等比缩小到view内部,不会有画面变形)。
    SCALE_ASPECT_FILL 宽高比填充(将按照视频宽高比等比放大,充满view,不会有画面变形)。
    SCALE_TO_FILL 拉伸填充(如果视频宽高比例与view比例不一致,会导致画面变形)。
    镜像模式包括:
    说明
    MIRROR_MODE_NONE 无镜像。
    MIRROR_MODE_HORIZONTAL 水平镜像。
    MIRROR_MODE_VERTICAL 垂直镜像。
  • 静音、音量控制
    播放器SDK提供了对视频的音量控制功能。调用setMute设置播放器静音,调用setVolume控制音量大小,范围是0~1。示例如下:
    //设置播放器静音
    aliyunVodPlayer.setMute(true);
    //设置播放器音量,范围0~1.
    aliyunVodPlayer.setVolume(1f);
  • 倍速播放
    播放器SDK提供了倍速播放视频的功能,通过设置setSpeed方法,能够以0.5倍~2倍速去播放视频。同时保持变声不变调。示例如下:
    //设置倍速播放:支持0.5~2倍速的播放
    aliyunVodPlayer.setSpeed(1.0f);
  • 截图功能
    播放器SDK提供了对当前视频截图的功能snapshot。截取的是原始的数据,并转为bitmap返回。回调接口为OnSnapShotListener。示例如下:
    //设置截图回调
    aliyunVodPlayer.setOnSnapShotListener(new OnSnapShotListener(){
        @Override
        public void onSnapShot(Bitmap bm, int with, int height){
            //获取到的bitmap。以及图片的宽高。
        }
    });
    //截取当前播放的画面
    aliyunVodPlayer.snapshot();
  • 边播边缓存
    播放器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:试看时长
    最终缓存的文件绝对路径。
    边播边缓存并不是所有的视频都会缓存,有些情况是不会缓存的。示例如下:
    • 对于直接播放URL的方式,即UrlSource。如果是HLS(即M3U8)地址,将不会缓存。如果是其他支持的格式,则根据缓存配置进行缓存。
    • 对于VID的方式播放,将会根据缓存配置进行缓存。
    • 播放器读取完全部的数据则视为缓存成功。如果在此之前,调用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){
                //缓存失败事件
            }
        }
    });
  • 试看功能

    当设置试看的时长,通过播放器SDK播放视频时,服务端将不会返回完整的视频内容,而是返回试看时间段的内容。

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

    配置试看功能之后,通过SDK的VidPlayerConfigGen.setPreviewTime()方法设置播放器的试看时长。以VidSts为例,示例如下:
    VidSts vidSts = new VidSts;
    ....
    VidPlayerConfigGen configGen = new VidPlayerConfigGen();
    configGen.setPreviewTime(20);//20秒试看
    vidSts.setPlayConfig(configGen);//设置给播放源
    ...
    说明
    • VidPlayerConfigGen支持设置服务端支持的请求参数。请参见请求参数说明
    • FLV和MP3暂时不支持试看。
  • 硬解开关
    播放器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) {
                //切换到软解
            }
        }
    });
  • 设置黑名单
    播放器SDK提供了硬解的黑名单机制。对于明确不能使用硬解播放的机器,可以直接使用软解,避免了无效的操作。示例如下:
    DeviceInfo deviceInfo = new DeviceInfo();
    deviceInfo.model="Lenovo K320t";
    AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );

    退出App之后,黑名单自动失效。

  • 设置Referer
    播放器SDK提供了PlayerConfig用来设置请求referer。配合控制台的黑白名单referer,可以控制访问权限。播放器SDK的设置示例如下:
    //先获取配置
    PlayerConfig config = mAliyunVodPlayer.getConfig();
    //设置referer,示例:http://example.aliyundoc.com。(注意:设置referer时,需要加上前面的协议部分。)
    config.mReferrer = referrer;
    ....//其他设置
      //设置配置给播放器
    mAliyunVodPlayer.setConfig(config);
  • 设置UserAgent
    播放器SDK提供了PlayerConfig用来设置请求UA。设置之后,播放器请求的过程中将会带上UA信息。播放器SDK的设置示例如下:
    //先获取配置
    PlayerConfig config = mAliyunVodPlayer.getConfig();
    //设置UA
    config.mUserAgent = "需要设置的UserAgent";
    ....//其他设置
      //设置配置给播放器
    mAliyunVodPlayer.setConfig(config);
  • 配置网络重试时间和次数
    通过PlayerConfig,用户可以设置播放器SDK的网络超时的时间和重试次数。播放器SDK的设置,示例如下:
    //先获取配置
    PlayerConfig config = mAliyunVodPlayer.getConfig();
    //设置网络超时时间,单位ms
    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方法进行重新加载网络,或者进行其他的处理。这块的逻辑可以由App自己来处理。
  • 配置缓存和延迟控制
    播放器SDK通过PlayerConfig提供了设置缓存和延迟的控制接口。示例如下:
    //先获取配置
    PlayerConfig config = mAliyunVodPlayer.getConfig();
    //最大延迟。注意:直播有效。当延时比较大时,播放器sdk内部会追帧等,保证播放器的延时在这个范围内。
    config.mMaxDelayTime = 5000;
    // 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。
    config.mMaxBufferDuration = 50000;
    //高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。
    config.mHighBufferDuration = 3000;
    // 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。
    config.mStartBufferDuration = 500;
    ....//其他设置
    //设置配置给播放器
    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);

本地缓存加载功能

播放器SDK提供本地缓存加载功能,是对边播边缓存功能的升级,在能使用户重复播放视频时,达到省流量的目的同时,通过设置视频缓存的内存占用大小,更能提升视频的起播速度。

本地缓存加载功能的使用说明如下所示:
  • 目前支持MP4、MP3、FLV、M3U8等单个媒体文件的加载。
  • 仅支持URL方式播放视频的本地缓存加载,暂不支持Vid方式播放视频的本地缓存加载。
  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?aaa计算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. 可选:删除加载文件。
    可按需删除加载文件,以节省空间。SDK不提供删除接口,需要在APP删除加载目录下的文件。

视频下载功能

阿里云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方法。选择某个Track进行下载,示例如下:
    public void onPrepared(MediaInfo mediaInfo) {
        //准备下载项成功
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        //比如:下载第一个TrackInfo
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
    }
  5. 更新下载源并开始下载。
    为了防止VidSts和VidAuth过期,建议更新下载源的信息后开始下载。示例如下:
    //更新下载源
    mAliDownloader.updateSource(mVidSts);
    //开始下载
    mAliDownloader.start();
  6. 下载成功或失败后,释放下载器。
    下载成功后,调用release释放下载器。在onCompletion或者onError回调中。示例如下:
    mAliDownloader.stop();
    mAliDownloader.release();
  7. 删除下载的文件。
    下载过程中,或者下载完成后,可以删除下载的文件。示例如下:
    //通过对象删除文件
    mAliDownloader.deleteFile();
    //通过静态方法删除
    AliDownloaderFactory.deleteFile("下载文件夹路径",vid, format,index);

加密直播播放功能

阿里云播放器支持加密直播的播放。播放器的创建与使用方式,具体操作请参见创建普通播放器(手动播放)创建普通播放器(自动播放)创建列表播放器播放功能

  1. 设置播放源。
    需传递AVPLiveStsSource作为播放源。示例如下:
    //创建LiveSts
     LiveSts liveSts = new LiveSts();
     liveSts.setUrl("加密直播url");
     liveSts.setAccessKeyId("临时akId");
     liveSts.setAccessKeySecret("临时akSecret");
     liveSts.setSecurityToken("安全token");
     liveSts.setDomain("url播流域名");
     liveSts.setApp("播流应用名");
     liveSts.setStream("播流流名");
     //设置播放源
     aliyunVodPlayer.setDataSource(liveSts);
     ......
     //准备播放
     aliyunVodPlayer.prepare();
  2. 监听STS是否无效。
    加密直播播放过程中可能会有换加密Key的过程,换Key时则会通过STS去请求到最新的Key。开发者需要监听STS是否有效。如果无效则会影响加密直播流的播放。监听设置示例如下:
    mAliyunVodPlayer.setOnVerifyStsCallback(new IPlayer.OnVerifyStsCallback() {
        @Override
        public IPlayer.StsStatus onVerifySts(StsInfo info) {
            if(info 可以使用){
                return IPlayer.StsStatus.Valid;
            }
    
            if(可以获取有效的STS){
                获取STS();//异步同步均可。
                return IPlayer.StsStatus.Pending;
            }
            //如果info无效,且无法获取到最新的STS,那么建议停止播放。防止出现花屏。
            mAliyunVodPlayer.stop();
            return IPlayer.StsStatus.Invalid;
        }
    });
    获取STS成功之后,需要调用updateStsInfo方法去更新STS。如果获取失败,则建议停止播放。
    mAliyunVodPlayer.updateStsInfo(stsInfo);
    说明 如果不调用,超时之后播放器会继续使用之前的STS去获取Key。如果STS失效,则可能会出现花屏或者播放失败。

相关文档

接口说明