Android端实现RTS拉流

通过阅读本文,您可以了解Android端阿里云播放器SDK实现超低延时直播的方法。

SDK集成

添加阿里云播放器SDK的依赖文件,示例如下:

  • Maven集成

    1. 添加Maven仓库地址。

      在根目录的build.gradle中添加Maven仓库地址。

      //阿里云相关SDK(阿里云播放器) Maven仓库地址
      maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }
    2. 在工程的app/build.gradle文件中添加阿里云播放器SDK依赖文件。

      def player_sdk_version = "x.x.x" // 建议使用最新版本
      def rts_sdk_version = "7.8.0" // 独立版本号,目前最新版本
      
      // 播放器主库
      implementation "com.aliyun.sdk.android:AliyunPlayer:$player_sdk_version-full"
      
      // 播放器与Rts低延时直播组件的桥接层(AlivcArtc),版本号需要与播放器一致,需要和 Rts低延时直播组件 一起集成
      implementation "com.aliyun.sdk.android:AlivcArtc:$player_sdk_version"
      
      // Rts低延时直播组件
      implementation "com.aliyun.rts.android:RtsSDK:$rts_sdk_version"
      重要
      • 播放器与RTS低延时直播组件的桥接层(AlivcArtc)需与播放器版本号保持一致,且必须与RTS低延时直播组件同时集成。

      • 播放器版本请参考SDK下载,建议使用最新版本。播放器版本要求:推荐V7.5.0或以上版本,最低支持V5.4.5.0。

      • 常见问题请参见Android播放器常见问题

阿里云播放器SDK接口使用

调用阿里云播放器SDK接口实现超低延时直播功能。更多阿里云播放器SDK功能,请参见进阶功能API说明

说明
  • 以下为示例代码。详细代码请参见 API-Example RTS超低延迟直播播放模块,该工程是基于Java的阿里云播放器SDK Android示例工程,能够帮助开发者快速掌握SDK核心功能集成。

  • 基于阿里云播放器实现RTS拉流时,不能调用pause暂停直播流。您可以先调用stop停止播放,再调用prepare重新播放。

  • 不支持seek(拖动)。

加载RTS

根据实际需求,在适当的Activity内加入System.loadLibrary("RtsSDK");

static {
    System.loadLibrary("RtsSDK");
}

创建播放器

  1. 创建播放器。

    通过AliPlayerFactory类创建AliPlayer播放器。

    // 创建播放器实例
    AliPlayer mAliPlayer = AliPlayerFactory.createAliPlayer(context);
    // 传入traceid
    // 可选:推荐使用`播放器单点追查`功能,当使用阿里云播放器 SDK 播放视频发生异常时,可借助单点追查功能针对具体某个用户或某次播放会话的异常播放行为进行全链路追踪,以便您能快速诊断问题原因,可有效改善播放体验治理效率。
    // traceId 值由您自行定义,需为您的用户或用户设备的唯一标识符,例如传入您业务的 userid 或者 IMEI、IDFA 等您业务用户的设备 ID。
    mAliPlayer.setTraceId("traceId");
    说明

    播放器提供的播放质量监控(可查看播放器整体播放质量相关数据)、单点追查(可定位到具体的用户或设备,分析其播放行为,快速定位播放异常等问题)及视频播放统计功能都依赖埋点日志上报功能而实现。

    在创建播放器时,根据setTraceId参数的设置不同,其后续可实现的功能不同,具体如下:

    • setTraceId参数不传(默认):埋点日志上报功能开启,后续可以使用播放质量监控和视频播放统计功能,无法使用单点追查功能。

    • setTraceId参数传入traceid:traceid的值由您自行定义,需为您的用户或用户设备的唯一标识符,例如传入您业务的userid或者IMEI、IDFA等您业务用户的设备ID。传入traceid后,埋点日志上报功能开启,后续可以使用播放质量监控、单点追查和视频播放统计功能。

    • setTraceId参数设置为DisableAnalytics:关闭埋点日志上报,后续无法使用播放质量监控、单点追查和视频播放统计功能。

  2. 设置显示视图。

    播放器支持AliDisplayView(推荐)、SurfaceViewTextureView,任选其中一种即可。

    1. 在 XML 文件中声明视图。

      AliDisplayView(推荐)

      <!-- 播放器渲染视图 -->
      <com.aliyun.player.videoview.AliDisplayView
          android:id="@+id/ali_display_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_gravity="center" />

      SurfaceView

      <!-- 播放器渲染视图 -->
      <SurfaceView
          android:id="@+id/surface_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_gravity="center" />

      TextureView

      <!-- 播放器渲染视图 -->
      <TextureView
          android:id="@+id/texture_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_gravity="center" />
    2. 设置显示视图。

      AliDisplayView(推荐)

      调用播放器的setDisplayView接口,绑定播放器视图。

      AliDisplayView mAliDisplayView = findViewById(R.id.display_view);
      // 可以通过 setPreferDisplayView() 设置播放视图类型
      mAliDisplayView.setPreferDisplayView(AliDisplayView.DisplayViewType.SurfaceView);
      mAliPlayer.setDisplayView(mAliDisplayView);

      SurfaceView

      调用播放器的setSurface接口,绑定播放器视图。

      SurfaceView mSurfaceView = findViewById(R.id.surface_view);
      mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
          @Override
          public void surfaceCreated(@NonNull SurfaceHolder holder) {
              mAliPlayer.setSurface(holder.getSurface());
          }
      
          @Override
          public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
              mAliPlayer.surfaceChanged();
          }
      
          @Override
          public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
              mAliPlayer.setSurface(null)
          }
      });

      TextureView

      调用播放器的setSurface接口,绑定播放器视图。

      TextureView mTextureView = findViewById(R.id.texture_view);
      mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
          @Override
          public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
              mAliPlayer.setSurface(new Surface(surface));
          }
      
          @Override
          public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {
              mAliPlayer.surfaceChanged();
          }
      
          @Override
          public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
              mAliPlayer.setSurface(null);
              return true;
          }
      
          @Override
          public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
      
          }
      });
  3. 设置播放源。

    播放器支持4种播放源:VidSts、VidAuth、VidMpsUrlSource。其中UrlSource是直接URL播放,需要将URL设置为artc://协议,才可以使用RTS服务。

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("artc://<播流地址>");
    mAliPlayer.setDataSource(urlSource);
    说明

    更多设置播放源方法,请参见基础功能

  4. 配置播放参数。

    配置播放参数,提升超低延时直播效果。

    说明

    6.3.0版本以及之后的播放器SDK均支持自动低延时最佳配置,当播放URL为“artc://”开头,且客户没有手工修改过PlayerConfigmMaxDelayTimemHighBufferDurationmStartBufferDuration值时,SDK会自动分别使用1000、10、10值进行实际的播放。

    若想自定义控制,请参考如下示例:

    //1. 获取并修改配置
    PlayerConfig config = mAliPlayer.getConfig();
    if (playUrl.startWith("artc://")) {
        //最大延时为1000毫秒
        config.mMaxDelayTime = 1000;
        //起播缓存时长,10毫秒
        config.mStartBufferDuration = 10;
        //卡顿恢复缓存时长,10毫秒
        config.mHighBufferDuration = 10;
    } else {
        //config使用默认配置或自定义为其他配置
    }
    
    //2. 应用配置
    mAliPlayer.setConfig(config);
  5. 开始播放。

    // 准备播放
    mAliPlayer.prepare();
    // 开始播放
    mAliPlayer.start();

控制播放

Android播放器SDK支持从指定时间点播放、开始、停止播放等操作。

  1. 开始播放。

    指开始播放视频,由start接口实现。示例如下:

    mAliPlayer.start();
  2. 停止播放。

    指停止播放视频,由stop接口实现。示例如下:

    mAliPlayer.stop();
  3. 销毁播放器。

    销毁播放器实例,有同步和异步两种销毁方式,示例如下:

    //同步销毁,内部会自动调用stop接口
    mAliPlayer.release();
    //异步销毁,内部会自动调用stop接口
    mAliPlayer.releaseAsync();	
    说明

    调用同步销毁接口需等待播放器资源完全释放后才返回。如果您对界面的响应速度有较高要求,建议使用异步销毁接口,并注意以下几点:

    1. 避免在异步销毁过程中对播放器对象执行任何其他操作。

    2. 无需在调用异步销毁之前手动停止播放器,因为该过程内部已经包含了异步化的停止流程。

辅助功能

  1. 日志开关。

    //开启日志
    Logger.getInstance(context).enableConsoleLog(true);
    Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_TRACE);
    //关闭日志
    Logger.getInstance(context).enableConsoleLog(false);
    Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_NONE);
  2. 直播RTS降级。

    说明
    • 播放失败降级仅针对超时场景,播放超时场景下若配置了以下任一降级方案,则会进行降级播放处理;否则触发播放器onError回调。例如404、403或主播断流等异常不会触发降级。

    • RTS自动降级使用相同域名实现RTSFLV降级。若您的RTSFLV域名不一样,需配置RTS自定义降级方案以指定目标FLV域名。

    1. RTS自动降级(默认开启

      在使用超低延时直播RTS地址播放的场景下,当未配置RTS自定义降级且RTS拉流失败时,会自动降级到RTS对应的默认FLV地址进行播放。示例如下:

      // 1表示开启,0表示关闭。默认开启
      AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);
    2. RTS自定义降级

      在使用超低延时直播RTS地址播放的场景下,通过设置RTS的降级地址(如HLS地址或FLV地址),当RTS拉流失败时,会自动降级到该地址播放。示例如下:

      PlayerConfig config = mAliPlayer.getConfig();
      //可选,配置config其他项
      UrlSource urlSource = new UrlSource();
      urlSource.setUri(downgradeUrl);
      //设置降级URL
      mAliPlayer.enableDowngrade(urlSource, config);
  3. 获取TraceID。

    每一次低延时播放都会有一个traceId,可用于问题排查,可以通过播放器事件回调拿到traceid

    //监听播放器 onInfo 回调,并解析 DemuxerTraceID 消息
    mAliPlayer.setOnInfoListener(infoBean -> {
        if (infoBean.getCode() == InfoCode.DemuxerTraceID) {
            String traceId = infoBean.getExtraMsg();
    });