功能说明

本文主要介绍了Android端直播推流SDK的功能和使用方法。包括SDK的主要接口、基本使用流程说明,同时还提供了相关功能的使用示例。旨在帮助开发者更好地理解和应用SDK进行直播推流操作。

说明

如果您需要使用移动端进行推流,详细操作请参见推流、拉流与播流

Android推流SDK特性

  • 支持RTMP推流协议。

  • 支持基于RTC的RTS超低延时直播推拉流协议。

  • 支持连麦互动和PK互动。

  • 使用视频H.264编码以及音频AAC编码。

  • 支持码控、分辨率、显示模式等自定义配置。

  • 支持多种摄像头相关操作。

  • 支持实时美颜和自定义美颜效果调节。

  • 支持增、删动态贴纸实现动态水印效果。

  • 支持录屏直播。

  • 支持自定义YUV、PCM等外部音视频输入。

  • 支持多路混流功能。

  • 支持纯音视频推流以及后台推流。

  • 支持背景音乐及其相关操作。

  • 支持视频截图功能。

  • 支持自动重连、异常处理。

  • 支持音频3A算法。

  • 增加视频软编、硬编切换逻辑,提升编码模块稳定性。

推流主要接口类列表

说明

AlivcLivePushConfig

推流初始配置

AlivcLivePusher

推流功能类

AlivcLivePusherErrorListener

错误回调

AlivcLivePusherNetworkListener

网络相关通知回调

AlivcLivePusherInfoListener

推流相关信息回调

AlivcLivePusherBGMListener

背景音乐回调

AlivcLivePushCustomFilter

自定义滤镜回调

AlivcLivePushCustomDetect

自定义人脸检测回调

AlivcSnapshotListener

截图回调

功能限制

使用Android推流SDK需注意以下限制:

  • 您只能在推流之前设置横竖屏模式,不支持在直播的过程中实时切换。

  • 在推流设定为横屏模式时,需设定界面为不允许自动旋转。

  • 在硬编模式下,考虑编码器兼容问题分辨率会使用16的倍数,如设定为540P,则输出的分辨率为544*960,在设置播放器视图大小时需按输出分辨率等比缩放,避免黑边等问题。

推流SDK使用流程

基础版SDK的基本使用流程如下

步骤

描述

操作指引及代码示例

一、注册SDK

配置License相关参数,注册推流SDK。若不调用注册函数,推流功能无法使用。

注册SDK

二、配置推流参数

完成推流基本配置、码率控制配置、分辨率自适应配置、美颜功能配置等。

配置推流参数(基础版)

三、使用推流SDK推流

初始化SDK、注册推流回调、创建预览视图后可以开始推流。用户可以根据业务需求添加推流控制、设置背景音乐、摄像头、外部音频、动态贴纸等。

重要
  • 开始推流前必须初始化SDK及创建预览视图。

  • 阿里云视频直播不允许同一时间向同一个推流URL进行多路推流(第二路推流会被拒绝)。

使用推流SDK推流(基础版)

四、设置录屏推流(按需)

如需使用录屏推流,可以实现录屏推流相关的配置。

设置录屏推流(基础版)

互动版SDK使用流程如下

步骤

描述

操作指引及代码示例

一、注册SDK

配置License相关参数,注册推流SDK。若不调用注册函数,推流功能无法使用。

注册SDK

二、设置直播连麦互动

设置连麦互动,用户可以使用推流SDK互动版本完成主播和连麦观众超低延时(300ms以内)互动。

设置直播连麦互动(互动版)

注册SDK

推流SDK升级到4.4.2及以后版本,接入一体化License服务。在使用推流功能前必须进行注册,否则无法使用推流SDK功能。具体操作,请参见Android端注册SDK

配置推流参数(基础版)

您可以使用AlivcLivePushConfig配置推流参数,每个参数有一个对应的默认值。您可以根据需求修改对应的属性值。关于默认值和参数范围,请参见Android基础版推流SDK接口说明Android互动版推流SDK接口说明

说明

如需在推流过程中实时修改参数,请参见AlivcLivePusher提供的属性和方法。

  1. 基本推流配置。

    基本推流配置对应参数都有默认值,建议采用默认值,即您可以进行简单初始化,不做配置。

    示例代码

    // 初始化推流配置类
    mAlivcLivePushConfig = new AlivcLivePushConfig();
    // 设置推流模式,默认普通推流模式
    mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveBasicMode);
    // 设置分辨率,默认540P
    mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
    // 设置帧率,默认20fps
    mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
    // 设置视频编码Gop,单位秒,默认2秒
    mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
    // 打开码率自适应,默认为true
    mAlivcLivePushConfig.setEnableBitrateControl(true);
    // 设置横竖屏,默认为竖屏,可设置home键向左或向右横屏
    mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
    // 设置音频编码模式,默认AAC-LC
    mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
    // 设置视频编码模式,默认硬编
    mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
    // 设置音频编码模式,默认软编
    mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
    // 设置摄像头前后置,默认前置
    mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
    // 设置App推后台或暂停时推图片
    mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
    // 设置弱网推图片
    mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");
    重要
    • 综合手机性能和网络带宽要求,建议您将分辨率设置为540P(主流移动直播App基本都采用540P)。

    • 关闭自适应码率后,码率将固定在初始码率,不会在设定的目标码率和最小码率之间自适应调整。如果网络情况不稳定,可能造成播放卡顿,请慎用。

  2. 配置码率控制。

    码率控制通过AlivcQualityModeEnum参数配置。推流SDK提供以下码率控制模式,请根据实际需求修改参数值。

    码率控制模式

    描述

    示例代码

    QM_RESOLUTION_FIRST

    清晰度优先模式。SDK内部会对码率参数进行配置,优先保障推流视频的清晰度。

    mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST);//清晰度优先

    QM_FLUENCY_FIRST

    流畅度优先模式。SDK内部会对码率参数进行配置,优先保障推流视频的流畅度。

    mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_FLUENCY_FIRST);//流畅度优先

    QM_CUSTOM

    自定义模式。SDK会根据开发者设置的码率进行配置。设置为自定义模式时,您可以选择配置画质优先或者流畅度优先,并自行设定初始码率、最小码率和目标码率。

    • 初始码率:开始直播时的码率。

    • 最小码率:当网络较差时,码率会逐步减低到最小码率,以减少视频的卡顿。

    • 目标码率:当网络较好时,码率会逐步提高到目标码率,以提高视频清晰度。

    mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_CUSTOM);
    mAlivcLivePushConfig.setTargetVideoBitrate(1000); //目标码率1000kbps
    mAlivcLivePushConfig.setMinVideoBitrate(300); //最小码率300kbps
    mAlivcLivePushConfig.setInitialVideoBitrate(800); //初始码率800kbps
    说明
    • 选择清晰度优先或流畅度优先模式时,不需设置初始码率、最小码率和目标码率(initialVideoBitrate、minVideoBitrate、targetVideoBitrate)。推流SDK内部策略会自动保障在网络抖动情况下优先考虑视频清晰度或流畅度。

    • 选择自定义码率时,请参考阿里云推荐设置配置对应码率。推荐设置请参考下表内容。

    表 1. 自定义码率控制推荐设置(画质优先)

    分辨率

    初始码率 initialVideoBitrate

    最小码率 minVideoBitrate

    目标码率 targetVideoBitrate

    360P

    600

    300

    1000

    480P

    800

    300

    1200

    540P

    1000

    600

    1400

    720P

    1500

    600

    2000

    1080P

    1800

    1200

    2500

    表 2. 自定义码率控制推荐设置(流畅度优先)

    分辨率

    初始码率 initialVideoBitrate

    最小码率 minVideoBitrate

    目标码率 targetVideoBitrate

    360P

    400

    200

    600

    480P

    600

    300

    800

    540P

    800

    300

    1000

    720P

    1000

    300

    1200

    1080P

    1500

    1200

    2200

  3. 配置分辨率自适应。

    分辨率自适应即动态调整推流分辨率。开启功能后,当网络较差时会自动降低分辨率以提高视频的流畅度和清晰度。示例代码如下:

    mAlivcLivePushConfig.setEnableAutoResolution(true); // 打开分辨率自适应,默认为false
    重要
    • 某些播放器可能不支持动态分辨率,如果您需要使用分辨率自适应功能,建议使用阿里云播放器。

    • 分辨率自适应只有在清晰度优先或流畅度优先时才会生效(AlivcQualityModeEnum参数配置),自定义模式时无效。

  4. 配置美颜功能。

    如需在推流SDK中使用美颜功能,需要引入美颜库并配置对应回调。

    1. 通过Maven方式引入美颜库及美颜面板,在工程的build.gradle文件中添加如下代码,美颜SDK版本请参考最新Demo

      implementation "com.aliyun.maliang.android:queen:2.5.0-official-full"
      implementation("com.aliyun.maliang.android:queen_menu:2.5.0-official-full") {
          exclude group: 'com.aliyun.maliang.android', module: 'queen'
      }

      还可以集成Demo中的LiveBeauty模块:

      文件或文件夹

      功能描述

      live_beauty

      美颜基础抽象类

      queen_beauty

      美颜基础UI控件

    2. 获取美颜插件库LiveBeauty。

      说明

      参考获取美颜特效SDK License此文档,配置License。

      1. 通过clone命令从此路径(LiveBeauty)下载相关插件库代码到本地。

        git clone https://github.com/MediaBox-Demos/amdemos-android-live.git
      2. 在Android Studio项目根目录下打开命令行。执行如下代码,再通过File > New > Import Module LiveBeauty 模块导入到你的Android项目中。

        git submodule add https://github.com/MediaBox-Demos/amdemos-android-live.git ***/***/***
        说明

        示例代码中“***/***/***”是你想要放置LiveBeauty模块的位置

      3. 在项目的settings.gradle文件中添加模块的路径:

        include ':app', ':LiveBeauty', ':LiveBeauty:live_queenbeauty'
        说明

        示例代码中,“app”为主模块。

      4. 同时在项目主模块的build.gradle文件中,添加对 LiveBeauty 模块的依赖:

        dependencies {
            implementation project(':LiveBeauty')
            implementation project(':LiveBeauty:live_queenbeauty')
        }
      5. 点击File > Sync Project with Gradle Files,等待 Gradle 同步完成后,即可使用LiveBeauty模块。

    3. 配置美颜插件UI模块。

      1. 在本项目的布局XML文件中添加 QueenBeautyMenu 的控件。例如:

        <com.aliyunsdk.queen.menu.QueenBeautyMenu
            android:id="@+id/beauty_beauty_menuPanel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true" />
      2. 在Activity中初始化QueenBeautyMenu。例如:

        // 初始化美颜菜单面板
        QueenMenuPanel beautyMenuPanel = QueenBeautyMenu.getPanel(context);
        beautyMenuPanel.onHideMenu(); 
        beautyMenuPanel.onHideValidFeatures(); 
        beautyMenuPanel.onHideCopyright(); 
        
        // 在布局中添加美颜菜单
        QueenBeautyMenu beautyBeautyContainerView = findViewById(R.id.beauty_beauty_menuPanel);
        beautyBeautyContainerView.addView(beautyMenuPanel);
    4. 设置人脸面部识别及美颜回调。

      如果您有接入第三方美颜库的需求,可设置setCustomDetect和setCustomFilter回调。

      • AlivcLivePushCustomDetect回调函数customDetectProcess(long data、int width、int height、int rotation、int format、long extra参数)中返回的参数data是采集数据的指针,第三方美颜库可对数据指针中的数据进行识别或者处理。

      • AlivcLivePushCustomFilter回调函数customFilterProcess(int inputTexture、inttextureWidth、int textureHeight、long extra参数)中返回的参数inputTexture是图像的纹理texture,第三方美颜库可对纹理进行处理。如果需要返回一个处理过的纹理texture,则返回texture id。否则,返回原来的inputTexture即可。

      示例代码

      /**
       * 人脸面部识别回调
       */
      mAlivcLivePusher.setCustomDetect(new AlivcLivePushCustomDetect() {
          @Override
          public void customDetectCreate() {
      
          }
      
          @Override
          public long customDetectProcess(long dataPtr, int width, int height, int rotation, int format, long extra) {
              return 0;
          }
      
          @Override
          public void customDetectDestroy() {
      
          }
      });
      
      /**
       * 美颜回调
       */
       
       /**
       * 初始化BeautyManager
       */
      mAlivcLivePusher.setCustomFilter(new AlivcLivePushCustomFilter() {
          @Override
          public void customFilterCreate() {
              initBeautyManager();
          }
      
       /**
       * 处理推流视频流,添加美颜效果
       */
          @Override
          public int customFilterProcess(int inputTexture, int textureWidth, int textureHeight, long extra) {
              if (mBeautyManager == null) {
                  return inputTexture;
              }
      
              return mBeautyManager.onTextureInput(inputTexture, textureWidth, textureHeight);
          }
      
          @Override
          public void customFilterDestroy() {
              destroyBeautyManager();
          }
      });
  5. 配置图片推流。

    为了更好的用户体验,推流SDK提供了后台图片推流和码率过低时进行图片推流的设置。当SDK退至后台时默认暂停推流视频,只推流音频,此时可以设置图片来进行图片推流和音频推流。例如,在图片上提醒用户主播离开片刻,稍后回来。示例代码如下:

    mAlivcLivePushConfig.setPausePushImage("退后台png图片路径");//设置用户后台推流的图片

    另外,当网络较差时您可以根据自己的需求设置推流一张静态图片。设置图片后,SDK检测到当前码率较低时,会推流此图片,避免视频流卡顿。示例代码如下所示:

    mAlivcLivePushConfig.setNetworkPoorPushImage("网络差png图片路径");//设置网络较差时推流的图片
  6. 配置水印。

    推流SDK提供了添加水印功能,并且支持添加多个水印。水印图片必须为PNG格式图片。示例代码如下:

    mAlivcLivePushConfig.addWaterMark(waterPath,0.1,0.2,0.3);//添加水印
    说明
    • x、y、width为相对值,例如x为0.1表示水印的x值为推流画面x轴的10%位置,如果推流分辨率为540*960,则水印x值为54。

    • 水印图片的高度,按照水印图片的真实宽高与输入的width值等比缩放。

    • 要实现文字水印,可以先将文字转换为图片,再使用此接口添加水印。

  7. 配置预览显示模式。

    推流SDK支持三种预览模式,预览显示模式不影响推流。

    • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL:预览显示时,铺满窗口。当视频比例和窗口比例不一致时,预览会有变形。

    • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT:预览显示时,保持视频比例。当视频比例与窗口比例不一致时,预览会有黑边。

    • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL:预览显示时,剪切视频以适配窗口比例。当视频比例和窗口比例不一致时,预览会裁剪视频。

    示例代码如下:

    mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);

使用推流SDK推流(基础版)

AlivcLivePusher为使用推流SDK推流的核心类,提供初始化操作、推流回调、摄像头预览、推流控制、推流过程中的参数调节等功能。

说明
  • 接口的调用需要对接口抛出的异常进行处理,添加try catch处理操作。

  • 接口调用的顺序必须按照说明的顺序调用,否则会因调用顺序不正确而出现异常。

  1. 初始化。

    在配置好推流参数后,可以使用推流SDK的init方法进行初始化。示例代码如下:

    AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher();
    mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);
    说明

    AlivcLivePusher目前不支持多实例,所以一个init必须对应有一个destroy。

  2. 注册推流回调。

    推流回调分为三种:

    • Info:主要做提示和状态检测使用。

    • Error:错误回调。

    • Network:主要为网络相关。

    用户通过对应的回调通知,当发生对应的类型的事件时,相应的回调函数被触发运行。示例代码如下:

    设置推流错误事件

    /**
     * 设置推流错误事件
     *
     * @param errorListener 错误监听器
     */
    mAlivcLivePusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {
        @Override
        public void onSystemError(AlivcLivePusher livePusher, AlivcLivePushError error) {
            if (error != null) {
                //添加UI提示或者用户自定义的错误处理
            }
        }
    
        @Override
        public void onSDKError(AlivcLivePusher livePusher, AlivcLivePushError error) {
            if (error != null) {
                //添加UI提示或者用户自定义的错误处理
            }
        }
    });
                            

    设置推流通知事件

    /**
     * 设置推流通知事件
     *
     * @param infoListener 通知监听器
     */
    mAlivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
        @Override
        public void onPreviewStarted(AlivcLivePusher pusher) {
            //预览开始通知
        }
    
        @Override
        public void onPreviewStoped(AlivcLivePusher pusher) {
            //预览结束通知
        }
    
        @Override
        public void onPushStarted(AlivcLivePusher pusher) {
            //推流开始通知
        }
    
        @Override
        public void onFirstAVFramePushed(AlivcLivePusher alivcLivePusher) {
            //发送第一个音视频包成功通知
        }
    
        @Override
        public void onPushPauesed(AlivcLivePusher pusher) {
            //推流暂停通知
        }
    
        @Override
        public void onPushResumed(AlivcLivePusher pusher) {
            //推流恢复通知
        }
    
        @Override
        public void onPushStoped(AlivcLivePusher pusher) {
            //推流停止通知
        }
    
        @Override
        public void onPushRestarted(AlivcLivePusher pusher) {
            //推流重启通知
        }
    
        @Override
        public void onFirstFramePreviewed(AlivcLivePusher pusher) {
            //首帧渲染通知
        }
    
        @Override
        public void onDropFrame(AlivcLivePusher pusher, int countBef, int countAft) {
            //丢帧通知
        }
    
        @Override
        public void onAdjustBitRate(AlivcLivePusher pusher, int curBr, int targetBr) {
            //调整码率通知
        }
    
        @Override
        public void onAdjustFps(AlivcLivePusher pusher, int curFps, int targetFps) {
            //调整帧率通知
        }
    
        @Override
        public void onPushStatistics(AlivcLivePusher alivcLivePusher, AlivcLivePushStatsInfo alivcLivePushStatsInfo) {
            //直播推流器统计数据回调(每2秒回调一次)
        }
    
        @Override
        public void onSetLiveMixTranscodingConfig(AlivcLivePusher alivcLivePusher, boolean isSuccess, String msg) {
            //设置云端的混流(转码)参数回调,对应于setLiveMixTranscodingConfig接口,仅互动模式下生效
        }
    });

    设置网络通知事件

    /**
     * 设置网络通知事件
     *
     * @param infoListener 通知监听器
     */
    mAlivcLivePusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {
        @Override
        public void onNetworkPoor(AlivcLivePusher pusher) {
            //网络差通知
        }
    
        @Override
        public void onNetworkRecovery(AlivcLivePusher pusher) {
            //网络恢复通知
        }
    
        @Override
        public void onReconnectStart(AlivcLivePusher pusher) {
            //重连开始通知
        }
    
        @Override
        public void onConnectionLost(AlivcLivePusher alivcLivePusher) {
            //连接断开通知
        }
    
        @Override
        public void onReconnectFail(AlivcLivePusher pusher) {
            //重连失败通知
        }
    
        @Override
        public void onReconnectSucceed(AlivcLivePusher pusher) {
            //重连成功通知
        }
    
        @Override
        public void onSendDataTimeout(AlivcLivePusher pusher) {
            //发送数据超时通知
        }
    
        @Override
        public void onConnectFail(AlivcLivePusher pusher) {
            //连接失败通知
        }
    
        @Override
        public String onPushURLAuthenticationOverdue(AlivcLivePusher alivcLivePusher) {
            //鉴权过期通知
            return null;
        }
    
        @Override
        public void onSendMessage(AlivcLivePusher alivcLivePusher) {
            //发送sei通知
        }
    
        @Override
        public void onPacketsLost(AlivcLivePusher alivcLivePusher) {
            //推流过程丢包回调
        }
    });

    设置背景音乐播放通知事件

    /**
     * 设置背景音乐播放通知事件
     *
     * @param pushBGMListener 通知监听器
     */
    mAlivcLivePusher.setLivePushBGMListener(new AlivcLivePushBGMListener() {
        @Override
        public void onStarted() {
            //播放开始通知
        }
    
        @Override
        public void onStoped() {
            //播放停止通知
        }
    
        @Override
        public void onPaused() {
            //播放暂停通知
        }
    
        @Override
        public void onResumed() {
            //播放恢复通知
        }
    
        @Override
        public void onProgress(long l, long l1) {
            //播放进度通知
        }
    
        @Override
        public void onCompleted() {
            //播放结束通知
        }
    
        @Override
        public void onDownloadTimeout() {
            //播放超时通知
        }
    
        @Override
        public void onOpenFailed() {
            //流无效通知
        }
    });
  3. 开始预览。

    livePusher对象初始化及回调配置完成之后,可以进行开始预览操作。预览时需要传入摄像头预览的显示SurfaceView。示例代码如下:

    mAlivcLivePusher.startPreview(mSurfaceView)//开始预览,也可根据需求调用异步接口startPreviewAysnc来实现
    重要

    部分接口(如背景音乐、摄像头相关操作)必须在设置预览之后才能调用。因此,建议开始推流前先进行预览。

  4. 开始推流。

    预览成功后才可以开始推流,因此需监听onPreviewStarted回调,在回调里面添加如下代码。

    mAlivcLivePusher.startPush(mPushUrl);
    说明
    • 推流SDK同时提供了异步方法,可调用startPushAysnc来实现。

    • 推流SDK支持RTMP格式和RTS格式的推流地址,且RTS推流相对于RTMP推流稳定性和抗弱网有显著提升,建议用户优先使用RTS推流。RTMP和RTS推流效果对比及RTS推流方法,请参见推流SDK进行RTS推流指南

    • 使用正确的推流地址开始推流后,可用播放器(阿里云播放器、FFplay、VLC等)进行拉流测试,拉流地址获取请参见生成推流地址和播放地址

  5. 设置其他推流控制。

    推流控制主要包括开始推流、停止推流、停止预览、重新推流、暂停推流、恢复推流、销毁推流等操作,用户可以根据业务需求添加按钮进行操作。

    示例代码

    /*正在推流状态下可调用暂停推流。暂停推流后,视频预览和视频推流保留在最后一帧,音频推流继续*/
    mAlivcLivePusher.pause();
    /*暂停状态下可调用恢复推流。恢复推流后,音视频预览与推流恢复正常*/
    mAlivcLivePusher.resume();
    /*推流状态下可调用停止推流,完成后推流停止*/
    mAlivcLivePusher.stopPush();
    /*在预览状态下才可以调用停止预览,正在推流状态下,调用停止预览无效。预览停止后,预览画面定格在最后一帧*/
    mAlivcLivePusher.stopPreview();
    /*推流状态下或者接收到所有Error相关回调状态下可调用重新推流, 且Error状态下只可以调用此接口(或者reconnectPushAsync重连)或者调用destory销毁推流。完成后重新开始推流,重启ALivcLivePusher内部的一切资源,包括预览、推流等等restart*/
    mAlivcLivePusher.restartPush();
    /*推流状态下或者接收到AlivcLivePusherNetworkDelegate相关的Error回调状态下可调用此接口, 且Error状态下只可以调用此接口(或者restartPush重新推流)或者调用destory销毁推流。完成后推流重连,重新链接推流RTMP*/
    mAlivcLivePusher.reconnectPushAsync();
    /*销毁推流后,推流停止,预览停止,预览画面移除。AlivcLivePusher相关的一切资源销毁*/
    mAlivcLivePusher.destroy();
  6. 设置背景音乐。

    推流SDK提供了背景音乐播放、混音、降噪、耳返、静音等功能。示例代码如下:

    /*开始播放背景音乐。*/
    mAlivcLivePusher.startBGMAsync(mPath);
    /*停止播放背景音乐。若当前正在播放BGM,并且需要切换歌曲,只需要调用开始播放背景音乐接口即可,无需停止当前正在播放的背景音乐*/
    mAlivcLivePusher.stopBGMAsync();
    /*暂停播放背景音乐,背景音乐开始播放后才可调用此接口*/
    mAlivcLivePusher.pauseBGM();
    /*恢复播放背景音乐,背景音乐暂停状态下才可调用此接口*/
    mAlivcLivePusher.resumeBGM();
    /*开启循环播放音乐*/
    mAlivcLivePusher.setBGMLoop(true);
    /*设置降噪开关。打开降噪后,将对采集到的声音中非人声的部分进行过滤处理。可能存在对人声稍微抑制作用,建议让用户自由选择是否开启降噪功能,默认不使用*/
    mAlivcLivePusher.setAudioDenoise(true);
    /*设置耳返开关。耳返功能主要应用于KTV场景。打开耳返后,插入耳机将在耳机中听到主播说话声音。关闭后,插入耳机无法听到人声。未插入耳机的情况下,耳返不起作用*/
    mAlivcLivePusher.setBGMEarsBack(true);
    /*混音设置,提供背景音乐和人声采集音量调整*/
    mAlivcLivePusher.setBGMVolume(50);//设置背景音乐音量
    mAlivcLivePusher.setCaptureVolume(50);//设置人声采集音量
    /*设置静音。静音后音乐声音和人声输入都会静音。要单独设置音乐或人声静音可以通过混音音量设置接口来调整*/
    mAlivcLivePusher.setMute(true);
    重要

    背景音乐相关接口在开始预览之后才可调用。

  7. 设置推流截图。

    推流SDK提供了本地视频流截图功能,示例代码如下:

    // 视频流截图,参数:截取图片的个数、每张图片的间隔、接口回调
    pusher.snapshot(1, 1, new AlivcSnapshotListener() {
        @Override
        public void onSnapshot(Bitmap bmp) {
                // 可以将截图转储到本地png文件,下面是示例代码
            String dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss-SS").format(new Date());
            File f = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "snapshot-" + dateFormat + ".png");
            if (f.exists()) {
                f.delete();
            }
            try {
                FileOutputStream out = new FileOutputStream(f);
                bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
                out.flush();
                out.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
  8. 摄像头相关操作。

    摄像头相关操作包括推流状态、暂停状态、重连状态等,还可操作摄像头切换、闪光灯、焦距、变焦和镜像设置等。示例代码如下:

    /*切换前后摄像头*/
    mAlivcLivePusher.switchCamera();
    /*开启/关闭闪光灯,在前置摄像头时开启闪关灯无效*/
    mAlivcLivePusher.setFlash(true); 
    /*焦距调整,即可实现采集画面的缩放功能。缩放范围为[0,getMaxZoom()]。*/
    mAlivcLivePusher.setZoom(5);
    /*手动对焦。手动聚焦需要传入两个参数:1.point 对焦的点(需要对焦的点的坐标);2.autoFocus 是否需要自动对焦,只有本次对焦操作调用该接口时,该参数才生效。后续是否自动对焦沿用上述自动聚焦接口设置值*/
    mAlivcLivePusher.focusCameraAtAdjustedPoint(x, y, true);
    /*设置是否自动对焦*/
    mAlivcLivePusher.setAutoFocus(true);
    /*镜像设置。镜像相关接口有两个,PushMirror推流镜像和PreviewMirror预览镜像。PushMirror设置仅对播放画面生效,PreviewMirror仅对预览画面生效,两者互不影响*/
    mAlivcLivePusher.setPreviewMirror(false);
    mAlivcLivePusher.setPushMirror(false);
    重要

    您摄像头相关接口只能在开始预览之后调用。

  9. 配置外部音视频输入。

    推流SDK支持将外部的音视频源输入进行推流,比如推送一个音视频文件。

    1. 配置外部音视频输入。

      示例代码如下:

      /**
      * 输入自定义音频数据
      * @param data 音频数据byte array
      * @param size
      * @param sampleRate
      * @param channels
      * @param pts 音频数据pts(μs)
      * 此接口不控制时序,需要调用方控制输入音频帧的时序
      */
      mAlivcLivePusher. inputStreamAudioData(byte[] data, int size, int sampleRate, int channels, long pts);
      /**
      * 输入自定义音频数据
      * @param dataPtr 音频数据native内存指针
      * @param size
      * @param sampleRate
      * @param channels
      * @param pts 音频数据pts(μs)
      * 此接口不控制时序,需要调用方控制输入音频帧的时序
      */
      mAlivcLivePusher. inputStreamAudioPtr(long dataPtr, int size, int sampleRate, int channels, long pts);
    2. 插入外部视频数据。

      示例代码如下:

      /**
      * 输入自定义视频流
      *
      * @param data 视频图像byte array
      * @param width 视频图像宽度
      * @param height 视频图像高度
      * @param size 视频图像size
      * @param size 视频图像stride
      * @param pts 视频图像pts(μs)
      * @param rotation 视频图像旋转角度
      * 此接口不控制时序,需要调用方控制输入视频帧的时序
      * 附:调用此接口时需要在config中设置setExternMainStream(true,***)
      */
      mAlivcLivePusher. inputStreamVideoData(byte[] data, int width, int height, int stride, int size, long pts, int rotation);
      /**
      * 输入自定义视频流
      *
      * @param dataptr 视频图像native内存指针
      * @param width 视频图像宽度
      * @param height 视频图像高度
      * @param size 视频图像stride
      * @param size 视频图像size
      * @param pts 视频图像pts(μs)
      * @param rotation 视频图像旋转角度
      * 此接口不控制时序,需要调用方控制输入视频帧的时序
      * 附:调用此接口时需要在config中设置setExternMainStream(true,***)
      */
      mAlivcLivePusher. inputStreamVideoPtr(long dataptr, int width, int height, int stride, int size, long pts, int rotation);
    3. 插入音频数据。

      示例代码如下:

      /**
      * AlivcImageFormat输入的视频图像格式
      * AlivcSoundFormat输入的音频帧格式
      * 其他参数:如输出分辨率,音频采样率,通道数等在config里
      setResolution,setAudioSamepleRate,setAudioChannels里设置
      * 附:输入自定义视频和音频流时,调用inputStreamVideoData,inputStreamAudioData等接口
      */
      mAlivcLivePushConfig.setExternMainStream(true,AlivcImageFormat.IMAGE_FORMAT_YUVNV12,
      AlivcSoundFormat.SOUND_FORMAT_S16);
  10. 动态贴纸。

    推流SDK实现了在直播流中添加动态贴纸效果,使用此功能可实现动态水印效果。

    1. 动态贴纸的制作可参考Demo提供的素材进行简单修改。自己制作动图贴纸的序列帧图片,并打开config.json文件自定义以下参数:

      "du": 2.04,//播放一遍动画持续的时间
      "n": "qizi",//动图的名称,制作动图时文件夹以动图名称命名,每一张图片以动图名称+序号命名,比如qizi0
      "c": 68.0,//动画帧数,即一个完整动画的图片数量
      "kerneframe": 51,//关键帧,即指定哪一张图片为关键帧,比如demo中指定第51帧为关键帧(需确保51帧是存在的)
      "frameArry": [
          {"time":0,"pic":0},
          {"time":0.03,"pic":1},
          {"time":0.06,"pic":2},
          ],
      //动画参数,上述参数即表示第0秒显示第一帧(qizi0),第0.03秒显示第二帧(qizi1)...以此规则填写所有帧的动画
      说明

      其他字段可以直接使用demo提供的config.json文件中的内容,无需修改。

    2. 添加动态贴纸。

      示例代码如下:

      /**
      * 添加动态贴纸
      * @param path 贴纸文件路径,必须含config.json
      * @param x 显示起始x位置(0~1.0f)
      * @param y 显示起始y位置(0~1.0f)
      * @param w 显示宽度(0~1.0f)
      * @param h 显示高度(0~1.0f)
      * @return id 贴纸id,删除贴纸时需设置id
      */
      mAlivcLivePusher.addDynamicsAddons("贴纸路径", 0.2f, 0.2f, 0.2f, 0.2f);
    3. 删除动态贴纸。

      示例代码如下:

      mAlivcLivePusher.removeDynamicsAddons(int id);
  11. 其他接口的使用。

    /*在自定义模式下,用户可以实时调整最小码率和目标码率*/
    mAlivcLivePusher.setTargetVideoBitrate(800);
    mAlivcLivePusher.setMinVideoBitrate(400);
    /*是否支持自动对焦*/
    mAlivcLivePusher.isCameraSupportAutoFocus();
    /*是否支持闪光灯*/
    mAlivcLivePusher.isCameraSupportFlash();
    /*获取是否正在推流的状态*/
    mAlivcLivePusher.isPushing(); 
    /*获取推流地址*/
    mAlivcLivePusher.getPushUrl();
    /*获取推流性能调试信息。推流性能参数具体参数和描述参考API文档或者接口注释*/
    mAlivcLivePusher.getLivePushStatsInfo();
    /*获取版本号*/
    mAlivcLivePusher.getSDKVersion();
    /*设置log级别,根据需求过滤想要的调试信息*/
    mAlivcLivePusher.setLogLevel(AlivcLivePushLogLevelAll);
    /*获取当前sdk状态*/
    AlivcLivePushStats getCurrentStatus();
    /*获取上一个错误码,如无错误返回:ALIVC_COMMON_RETURN_SUCCESS*/
    AlivcLivePushError getLastError();

设置录屏推流(基础版)

推流SDK支持录屏推流。使用录屏推流需在初始化操作、设置预览及开始推流之后进行相关配置。具体操作如下:

  1. 配置录屏模式。

    Android推流SDK支持三种录屏模式,请按需设置。

    录屏模式

    所需配置

    录屏时不开启摄像头

    1. 在config中设置权限请求的返回数据即可。

    录屏时开启摄像头

    说明

    主播端有摄像头预览,同样观众端也有摄像头画面(通过录屏录制进去)

    1. 在config中设置权限请求的返回数据。

    2. 调用StartCamera传入surfaceView。

    录屏时开启摄像头

    说明

    主播端无摄像头预览,观众端有摄像头画面叠加

    1. 在config中设置权限请求的返回数据。

    2. 调用StartCamera无需传入surfaceView。

    3. 调用startCameraMix传入观众端摄像头画面显示位置。

  2. 设置开启录屏权限。

    录屏采用MediaProjection,需要用户请求权限,将权限请求返回的数据通过此接口设置,即开启录屏模式。录屏情况下,默认不开启摄像头。请在推流配置里进行配置,示例代码如下:

    mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData)
  3. 设置摄像头预览。

    在录屏开启成功后,调用开启或关闭摄像头预览接口,示例代码如下:

    mAlivcLivePusher.startCamera(surfaceView);//开启摄像头预览
    mAlivcLivePusher.stopCamera();//关闭摄像头预览
    说明
    • 录屏模式下摄像头预览surfaceView的长宽建议设置成1:1,这样在屏幕旋转时无需调整surfaceview。

    • 若设置的长宽不为1:1,则需要在屏幕旋转时,调整surfaceView的比例后,先stopCamera再startCamera。

    • 如果主播端不需要预览,则surfaceview填为null。

  4. 设置摄像头混流。

    当主播端不需要摄像头预览,观众端需要的情况可开启混流,主要应用于游戏直播,主播不想玩游戏的时候摄像头画面挡住游戏画面,示例代码如下:

    /**
    * @param x 混流显示x初始位置(0~1.0f)
    * @param y 混流显示y初始位置(0~1.0f)
    * @param w 混流显示宽度(0~1.0f)
    * @param h 混流显示高度(0~1.0f)
    * @return
    */
    mAlivcLivePusher.startCameraMix(x, y, w, h);//开启摄像头混流
    mAlivcLivePusher.stopCameraMix();//停止摄像头混流
  5. 设置屏幕旋转。

    录屏模式下,可设置感应的屏幕旋转角度,支持横屏和竖屏录制,示例代码如下:

    mAlivcLivePusher.setScreenOrientation(0);
    说明

    在横竖屏切换时,需要在应用层监听OrientationEventListener事件,并将旋转角度设置到此接口。

  6. 设置隐私。

    当主播在录屏时要进行密码输入等操作时,主播可以开启隐私保护功能,结束操作后可以关闭隐私,示例代码如下:

    mAlivcLivePusher.pauseScreenCapture();//开启隐私保护
    mAlivcLivePusher.resumeScreenCapture();//关闭隐私保护
    说明

    暂停录屏,如果在config中设置了setPausePushImage则观众端会在此接口后显示图片。如果没有,则观众端停留在最后一帧。

设置直播连麦互动(互动版)

直播推流SDK互动版V4.4.4及以上版本提供基于RTC的连麦互动能力,V4.4.5及以上版本提供基于RTC的连麦PK互动能力,用户可以使用推流SDK互动版本完成主播和连麦观众超低延时(300ms以内)互动,直播连麦相关的功能使用,请参见连麦互动开发指南主播PK互动开发指南

注意事项

使用Android推流SDK需要注意以下事项:

事项

说明

混淆规则

检查混淆,确认已将SDK相关包名加入至不混淆名单中。

-keep class com.alivc.** { *;}

接口调用

  • 同步和异步接口都可以正常调用,尽量使用异步接口调用,可以避免对主线程的资源消耗。

  • SDK接口会在发生错误或者调用顺序不对时抛出异常(throws),调用时注意添加try catch处理,否则会造成程序的crash。

  • 接口调用顺序,如下图所示:

    image