全部产品
Search
文档中心

视频直播:Android端

更新时间:Jan 19, 2024

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

SDK集成

添加阿里云播放器SDK和Native RTS SDK的依赖文件,有以下两种方式:

  • 方式一:Maven集成

    1. 在工程的app/build.gradle文件中添加阿里云播放器SDK和Native RTS SDK的依赖文件。

      implementation 'com.aliyun.sdk.android:AlivcArtc:5.4.4.0'
      implementation 'com.aliyun.rts.android:RtsSDK:2.1.0'
      implementation 'com.aliyun.sdk.android:AliyunPlayer:5.4.4.0-full'
      说明
      • AlivcArtcRtsSDK对应的依赖文件添加后,阿里云播放器SDK会自动将RTS SDK加载为插件。

      • 此处Maven依赖的版本仅供参考。获取最新的版本,阿里云播放器SDK请参见Android播放器SDK超低延时直播SDK请参见SDK下载

      • 集成阿里云播放器SDK和Native RTS SDK时需要满足对应的配套关系,详情请参见发布日志

    2. 添加Maven仓库地址。

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

      //MPChart maven仓库地址,如果不需要曲线图,可以删除
      maven { url 'https://jitpack.io' }
      //阿里云相关SDK(阿里云播放器、RTS SDK) Maven仓库地址
      maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }
  • 方式二:手动aar集成

    1. 将对应的.aar文件拷贝到app/libs目录下。aar文件

    2. 在app/build.gradle文件中,添加如下代码:

      dependencies{
          implementation fileTree(dir: 'libs', include: ['*.aar'])
      }

阿里云播放器SDK接口使用

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

说明
  • 以下为示例代码。详细代码请参见开源项目

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

  • 不支持seek(拖动)。

  • 加载库

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

    static {
        System.loadLibrary("RtsSDK");
    }
  • 创建播放器

    通过AliPlayerFactory类可创建两种播放器:AliPlayer和AliListPlayer。单个播放功能使用AliPlayer,创建方法如下所示:

    AliPlayer aliyunVodPlayer;
    .....
    aliyunVodPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext());
  • 设置播放器监听事件

    播放器提供了多种监听事件,例如:onPrepared、onCompletion等。设置方法如下所示:

    aliyunVodPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            //出错事件
        }
    });
    aliyunVodPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            //准备成功事件
        }
    });
    aliyunVodPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            //视频分辨率变化回调
        }
    });
    aliyunVodPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            //首帧渲染显示事件
        }
    });
    aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            //其他信息的事件,type包括循环播放开始、缓冲位置、当前播放位置、自动播放开始等
        }
    });
    aliyunVodPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            //缓冲开始
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            //缓冲进度
        }
        @Override
        public void onLoadingEnd() {
            //缓冲结束
        }
    });
    aliyunVodPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            //显示字幕
        }
        @Override
        public void onSubtitleHide(long id) {
            //隐藏字幕
        }
    });
    aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            //切换音视频流或者清晰度成功
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            //切换音视频流或者清晰度失败
        }
    });
    aliyunVodPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            //播放器状态改变事件
        }
    });
    aliyunVodPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            //截图事件
        }
    });
  • 创建DataSource

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

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("artc://<播流地址>");
    aliyunVodPlayer.setDataSource(urlSource);
  • 设置显示的View

    如果源有画面,需要设置显示的View(支持SurfaceView和TextureView)到播放器中,用来显示画面。此处以SurfaceView举例说明,如下所示:

    surfaceView = (SurfaceView) findViewById(R.id.playview);
    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            aliyunVodPlayer.setDisplay(holder);
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            aliyunVodPlayer.surfaceChanged();
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            aliyunVodPlayer.setDisplay(null);
        }
    });
  • 播放控制

    您需要自行创建播放器的控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止,使用示例如下所示:

    //准备,在准备完成的回调接口中,调用start()可以开始播放
    aliyunVodPlayer.prepare();
    //开始播放
    aliyunVodPlayer.start();
    //停止播放
    aliyunVodPlayer.stop();
    //重置
    aliyunVodPlayer.reset();
    //释放(释放后播放器将不可再被使用)
    aliyunVodPlayer.release();
  • 播放参数配置

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

    //获取配置
    PlayerConfig config = mAliyunVodPlayer.getConfig();
    //设置最大延时为1秒,延时控制由ARTC控制
    config.mMaxDelayTime = 1000;
    //设置播放器启播缓存为10毫秒,数据控制由ARTC控制。
    config.mHighBufferDuration = 10;
    config.mStartBufferDuration = 10;
    ....//其他设置
    //给播放器加载配置
    mAliyunVodPlayer.setConfig(config);
  • 日志开关

    //开启日志
    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);
  • 直播降级

    直播降级是将前缀为artc://的播放器URL源字符串直接修改为 http-flv 形式,然后更新播放器UrlSource,并开始播放的策略。

    /**
     * 降级策略
     */
    private void willBeDemoted() {
        mRtsAliPlayer.stop();
        if (mUrl.startsWith("artc://")) {
            setDataSource("http://xxxx.flv");
            mRtsAliPlayer.prepare();
        }
    }
  • 获取TraceId

    播放器事件回调收到播放组件中透传输出的消息时,解析播放器事件说明JSON字符串,得到的code是RtsSDK中的message,收到E_HELP_SUPPORT_ID_SUBSCRIBE时,解析字符串中"-sub-"后的字符串得到TraceId。

    private static final int TRACE_ID_CODE = 104;
    
    //监听播放器 onInfo 回调,并解析 Rts 事件消息
    mRtsAliPlayer.setOnInfoListener(infoBean -> {
        if (infoBean.getCode() == InfoCode.DirectComponentMSG) {
            String extraMsg = infoBean.getExtraMsg();
            parseDirectComponentMSG(extraMsg);
        }
    });
    
    private void parseDirectComponentMSG(String msg) {
        if (msg.contains("code=" + TRACE_ID_CODE)) {
            parseTraceId(msg);
        }
    }
    
    /**
     * 解析 TraceId
     */
    private void parseTraceId(String msg) {
        String[] split = msg.split("-sub-");
        if (split.length >= 1) {
            mTraceId = "RequestId:" + (split[1].substring(0, split[1].length() - 1));
            mTraceId = mTraceId.replace("\"", "").replace("\\", "");
        }
    }