本文详细说明Android端推流SDK API接口、SDK的基本使用流程,以及相关功能的使用示例。

Android推流SDK功能列表

  • 支持RTMP推流协议
  • 使用视频H.264编码以及音频AAC编码
  • 支持码控、分辨率、显示模式等自定义配置
  • 支持多种摄像头相关操作
  • 支持实时美颜和自定义美颜效果调节
  • 支持增、删动态贴纸实现动态水印效果
  • 支持录屏直播
  • 支持自定义YUV、PCM等外部音视频输入
  • 支持多路混流功能
  • 支持纯音视频推流以及后台推流
  • 支持背景音乐及其相关操作
  • 支持视频截图功能
  • 支持自动重连、异常处理

推流主要接口类列表

说明
AlivcLivePushConfig 推流初始配置
AlivcLivePusher 推流功能类
AlivcLivePusherErrorListener 错误回调
AlivcLivePusherNetworkListener 网络相关通知回调
AlivcLivePusherInfoListener 推流相关信息回调
AlivcLivePusherBGMListener 背景音乐回调
AlivcLivePushCustomFilter 自定义滤镜回调
AlivcLivePushCustomDetect 自定义人脸检测回调
AlivcSnapshotListener 截图回调

配置推流参数

SDK的基本使用流程为:配置推流参数并创建推流预览视图后,即可开始推流。您可以使用AlivcLivePushConfig配置推流参数,每个参数有一个对应的默认值。关于默认值和参数范围,请参见V4.2.1接口说明(Android)或注释。

您还可以根据需求修改对应的属性值。如需在推流过程中实时修改参数,参见AlivcLivePusher提供的属性和方法。

  1. 基本推流配置。示例代码如下所示。
    AlivcLivePushConfig mAlivcLivePushConfig = new
    AlivcLivePushConfig();//初始化推流配置类
    mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);//分辨率540P,最大支持720P
    mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_20); //建议用户使用20fps
    mAlivcLivePushConfig.setEnableBitrateControl(true); // 打开码率自适应,默认为true
    mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
    // 默认为竖屏,可设置home键向左或向右横屏
    mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AlivcAudioAACProfileEnum.AAC_LC);//设置音频编码模式
    mAlivcLivePushConfig.setEnableBitrateControl(true);// 打开码率自适应,默认为true
    示例说明:
    • 以上参数配置有默认值,建议采用默认值,即您可以进行简单初始化,不做配置。
    • 综合手机性能和网络带宽要求,建议您将分辨率设置为540P(主流移动直播App基本都采用540P)。
    • 关闭自适应码率后,码率将固定在初始码率,不会在设定的目标码率和最小码率之间自适应调整。如果网络情况不稳定,可能造成播放卡顿,请慎用。
  2. 码率控制配置。SDK提供三种推流模式供开发者选择,您可按照下列模式修改AlivcQualityModeEnum参数。
    • QM_RESOLUTION_FIRST:清晰度优先模式。SDK内部会对码率参数进行配置,优先保障推流视频的清晰度。
    • QM_FLUENCY_FIRST:流畅度优先模式。SDK内部会对码率参数进行配置,优先保障推流视频的流畅度。
    • QM_CUSTOM:自定义模式。SDK会根据开发者设置的码率进行配置。
    示例代码:
    • 清晰度优先或流畅度优先模式,示例代码如下所示。
      mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST);//清晰度优先
      示例说明:选择清晰度优先或流畅度优先模式时,不需设置初始码率、最小码率和目标码率(initialVideoBitrate、minVideoBitrate、targetVideoBitrate)。SDK内部策略会自动保障在网络抖动情况下优先考虑视频清晰度或流畅度。
    • 自定义模式,示例代码如下所示。
      mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_CUSTOM);
      mAlivcLivePushConfig.setTargetVideoBitrate(1000); //目标码率1000Kbps
      mAlivcLivePushConfig.setMinVideoBitrate(300); //最小码率300Kbps
      mAlivcLivePushConfig.setInitialVideoBitrate(800); //初始码率800Kbps
      示例说明:设置为自定义模式时,您需要自己定义初始码率、最小码率和目标码率。
      • 初始码率:开始直播时的码率。
      • 最小码率:当网络较差时,码率会逐步减低到最小码率,以减少视频的卡顿。
      • 目标码率:当网络较好时,码率会逐步提高到目标码率,以提高视频清晰度。
      自定义模式建议参数:

      画质优先

      分辨率 初始码率 initialVideoBitrate 最小码率 minVideoBitrate 目标码率 targetVideoBitrate
      360P 600 300 1000
      480P 800 300 1200
      540P 1000 600 1400
      720P 1500 600 2000

      流畅度优先

      分辨率 初始码率 initialVideoBitrate 最小码率 minVideoBitrate 目标码率 targetVideoBitrate
      360P 400 200 600
      480P 600 300 800
      540P 800 300 1000
      720P 1000 300 1200
  3. 分辨率自适应配置。开启动态调整推流分辨率功能后,当网络较差时会自动降低分辨率以提高视频的流畅度和清晰度。某些播放器可能不支持动态分辨率,如果您需要使用动态分辨率功能,建议使用阿里云播放器。示例代码如下所示。
    mAlivcLivePushConfig.setEnableAutoResolution(true); // 打开分辨率自适应,默认为false
    示例说明:AlivcQualityModeEnum只有在清晰度优先或流畅度优先时才会生效,自定义模式时分辨率自适应无效。
  4. 美颜功能配置。
    1. 集成美颜功能需要引入美颜库,可以通过aar方式引入。在工程build.gradle中添加如下代码。
      com.aliyun.maliang.android:queen:1.3.0.1_beta-aliyunlive-pro
      还可以集成demo中的如下模块:
      文件或文件夹 功能描述
      beauty 美颜基础抽象类
      beautyui 美颜基础UI控件
      queenbeauty Queen美颜组件
      Imageutil 美颜Imageutil
    2. 需要在代码中设置两个回调。
      /**
      * 人脸识别回调
      **/
      mAlivcLivePusher.setCustomDetect(new AlivcLivePushCustomDetect() {
          @Override
          public void customDetectCreate() {
              Log.d(TAG, "customDetectCreate start");
              initBeautyManager();
              Log.d(TAG, "customDetectCreate end");
          }
      
          @Override
          public long customDetectProcess(long data, int width, int height, int rotation, int format, long extra) {
              Log.d(TAG, "customDetectProcess start: data ptr:" + data + ",width:" + width + ",height:" + height + "," + format + "," + rotation);
      
              if (mBeautyManager != null) {
                  mBeautyManager.onDrawFrame(data, BeautyImageFormat.kNV21, width, height, 0, mCameraId);
                  Log.d(TAG, "keria: " + mCameraId);
              }
              Log.d(TAG, "customDetectProcess end");
      
              return 0;
          }
      
          @Override
          public void customDetectDestroy() {
              Log.d(TAG, "customDetectDestroy start");
              destroyBeautyManager();
              Log.d(TAG, "customDetectDestroy end");
          }
      });
      
      /**
      * 美颜回调
      **/
      
      mAlivcLivePusher.setCustomFilter(new AlivcLivePushCustomFilter() {
          @Override
          public void customFilterCreate() {
              Log.d(TAG, "customFilterCreate start");
      
              initBeautyManager();
      
              Log.d(TAG, "customFilterCreate end");
          }
      
          @Override
          public void customFilterUpdateParam(float fSkinSmooth, float fWhiten, float fWholeFacePink, float fThinFaceHorizontal, float fCheekPink, float fShortenFaceVertical, float fBigEye) {
      
          }
      
          @Override
          public void customFilterSwitch(boolean on) {
      
          }
      
          @Override
          public int customFilterProcess(int inputTexture, int textureWidth, int textureHeight, long extra) {
              Log.d(TAG, "customFilterProcess start: textureId" + inputTexture + ",width:" + textureWidth + ",height:" + textureHeight);
      
              int ret = mBeautyManager != null ? mBeautyManager.onTextureInput(inputTexture, textureWidth, textureHeight) : inputTexture;
      
              Log.d(TAG, "customFilterProcess end, textureId:" + ret);
              Log.d(TAG, "keria1: " + mCameraId);
      
              return ret;
          }
      
          @Override
          public void customFilterDestroy() {
              destroyBeautyManager();
          }
      });
      示例说明:如果您有接入第三方美颜库的需求,可设置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即可。
    3. 图片推流配置。为了更好的用户体验,SDK提供了后台图片推流和码率过低时进行图片推流的设置。当SDK退至后台时默认暂停推流视频,只推流音频,此时可以设置图片来进行图片推流和音频推流。例如,在图片上提醒用户“主播离开片刻,稍后回来”。示例代码如下所示。
      mAlivcLivePushConfig.setPausePushImage("退后台png图片路径");//设置用户后台推流的图片
      另外,当网络较差时您可以根据自己的需求设置推流一张静态图片。设置图片后,SDK检测到当前码率较低时,会推流此图片,避免视频流卡顿。示例代码如下所示。
      mAlivcLivePushConfig.setNetworkPoorPushImage("网络差png图片路径");//设置网络较差时推流的图片
    4. 水印配置。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值等比缩放。
      • 要实现文字水印,可以先将文字转换为图片,再使用此接口添加水印。
    5. 预览显示模式配置。
      mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);
      示例说明:
      • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL:预览显示时,铺满窗口。当视频比例和窗口比例不一致时,预览会有变形。
      • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT:预览显示时,保持视频比例。当视频比例与窗口比例不一致时,预览会有黑边。
      • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL:预览显示时,剪切视频以适配窗口比例。当视频比例和窗口比例不一致时,预览会裁剪视频。
      这三种预览显示模式不影响推流。

推流器的使用

AlivcLivePusher为推流SDK的核心类,提供摄像头预览、推流回调、推流控制、推流过程中的参数调节等功能。
说明
  • 接口的调用需要对接口抛出的异常进行处理,添加try catch处理操作。
  • 接口调用的顺序必须按照说明的顺序调用,否则会因调用顺序不正确而出现异常。
通过下文,您可以了解如何使用推流核心接口。
  1. 初始化。在配置好推流参数后,可以使用推流SDK的init方法进行初始化。示例代码如下所示。
    AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher();
    mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);
    示例说明:AlivcLivePusher目前不支持多实例,所以一个init必须对应有一个destory。
  2. 注册推流回调。推流回调分为三种:Info、Error、Network。
    • 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 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) {
          //调整帧率通知
      }
    });
    /**
    * 设置网络通知事件
    *
    * @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
    onReconnectFail(AlivcLivePusher pusher) {
          //重连失败通知
      }
      @Override
      public void
    onReconnectSucceed(AlivcLivePusher pusher) {
          //重连成功通知
      }
      @Override
      public void
    onSendDataTimeout(AlivcLivePusher pusher) {
          //发送数据超时通知
      }
      @Override
      public void
    onConnectFail(AlivcLivePusher pusher) {
          //连接失败通知
      }
    });
    /**
    * 设置背景音乐播放通知事件
    *
    * @param pushBGMListener 通知监听器
    */
    mAlivcLivePusher.setLivePushBGMListener(new AlivcLivePushBGMListener() {
      @Override
      public void onStarted() {
          //播放开始通知
      }
      @Override
      public void onStoped() {
          //播放停止通知
      }
      @Override
      public void onPaused() {
          //播放暂停通知
      }
      @Override
      public void onResumed() {
          //播放恢复通知
      }
      /**
       * 播放进度事件
       *
       * @param progress 播放进度
       */
      @Override
      public void onProgress(final long
    progress, final long duration) {
      @Override
      public void onCompleted() {
          //播放结束通知
      }
      @Override
      public void onDownloadTimeout() {
          //播放器超时事件,在这里处理播放器重连并且seek到播放位置
      }
      @Override
      public void onOpenFailed() {
          //流无效通知,在这里提示流不可访问
      }
    });
  3. 开始预览。livePusher对象初始化完成之后,可以进行开始预览操作。预览时需要传入摄像头预览的显示SurfaceView。示例代码如下所示。
    mAlivcLivePusher.startPreview(mSurfaceView)//开始预览,也可根据需求调用异步接口startPreviewAysnc来实现
  4. 开始推流。预览成功后才可以开始推流,因此需监听onPreviewStarted回调,在回调里面添加如下代码。
    mAlivcLivePusher.startPush(mPushUrl);
    示例说明:
    • 推流SDK同时提供了异步方法,可调用startPushAysnc来实现。
    • 推流SDK支持RTMP的推流地址,阿里云推流地址获取请参见推流地址和播放地址
    • 使用正确的推流地址开始推流后,可用播放器(阿里云播放器、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. 摄像头相关操作。您只能在开始预览之后调用摄像头相关操作,包括推流状态、暂停状态、重连状态等,可操作摄像头切换、闪关灯、焦距、变焦和镜像设置等。未开始预览状态下调用如下接口无效。示例代码如下所示。
    /*切换前后摄像头*/
    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);
  8. 外部音视频输入。推流SDK支持将外部的音视频源输入进行推流,比如推送一个音视频文件。
    • 在推流配置里面进行外部音视频输入配置,示例代码如下所示。
      /**
      * AlivcImageFormat输入的视频图像格式
      * AlivcSoundFormat输入的音频帧格式
      * 其他参数:如输出分辨率,音频采样率,通道数等在config里
      setResolution,setAudioSamepleRate,setAudioChannels里设置
      * 附:输入自定义视频和音频流时,调用inputStreamVideoData,inputStreamAudioData等接口。
      */
      mAlivcLivePushConfig.setExternMainStream(true,AlivcImageFormat.IMAGE_FORMAT_YUVNV12,
      AlivcSoundFormat.SOUND_FORMAT_S16);
    • 插入外部视频数据,示例代码如下所示。
      /**
      *  输入自定义视频流
      *
      * @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);
    • 插入音频数据,示例代码如下所示。
      /**
      * 输入自定义音频数据
      * @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);
  9. 动态贴纸。SDK实现了在直播流中添加动态贴纸效果,使用此功能可实现动态水印效果。
    • 动态贴纸的制作可参考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提供的json文件中的内容,无需修改。
    • 添加动态贴纸,示例代码如下:
      /**
      * 添加动态贴纸
      * @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);
    • 删除动态贴纸,示例代码如下:
      mAlivcLivePusher.removeDynamicsAddons(int id);
  10. 其他接口的使用。
    /*在自定义模式下,用户可以实时调整最小码率和目标码率。*/
    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();

录屏功能

  • 配置录屏模式
    录屏有以下三种模式可以选择:
    • 录屏时不开启摄像头:在config中设置权限请求的返回数据即可。
    • 录屏时开启摄像头,主播端有摄像头预览,同样观众端也有摄像头画面(通过录屏录制进去)。
      1. 在config中设置权限请求的返回数据。
      2. 调用StartCamera传入surfaceView。
    • 录屏时开启摄像头,主播端无摄像头预览,观众端有摄像头画面叠加。
      1. 在config中设置权限请求的返回数据。
      2. 调用StartCamera无需传入surfaceView。
      3. 调用startCameraMix传入观众端摄像头画面显示位置。
  • 设置开启录屏权
    录屏采用MediaProjection,需要用户请求权限,将权限请求返回的数据通过此接口设置,即开启录屏模式。录屏情况下,默认不开启摄像头。请在推流配置里面进行配置,示例代码如下所示。
    mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData)
  • 摄像头预览
    在录屏开启成功后,调用开启或关闭摄像头预览接口,示例代码如下所示。
    mAlivcLivePusher.startCamera(surfaceView);//开启摄像头预览
    mAlivcLivePusher.stopCamera();//关闭摄像头预览
    示例说明:
    • 录屏模式下摄像头预览surfaceView的长宽建议设置成1:1,这样在屏幕旋转时无需调整surfaceview。
    • 若设置的长宽不为1:1,则需要在屏幕旋转时,调整surfaceView的比例后,先stopCamera再startCamera。
    • 如果主播端不需要预览,则surfaceview填为null。
  • 摄像头混流
    当主播端不需要摄像头预览,观众端需要的情况可开启混流,主要应用于游戏直播,主播不想玩游戏的时候摄像头画面挡住游戏画面,示例代码如下所示。
    /**
    * @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();//停止摄像头混流
  • 设置屏幕旋转
    录屏模式下,可设置感应的屏幕旋转角度,支持横屏和竖屏录制,示例代码如下所示。
    mAlivcLivePusher.setScreenOrientation(0);
    示例说明:在横竖屏切换时,需要在应用层监听OrientationEventListener事件,并将旋转角度设置到此接口。
  • 隐私设置
    当主播在录屏时要进行密码输入等操作时,主播可以开启隐私保护功能,结束操作后可以关闭隐私,示例代码如下所示。
    mAlivcLivePusher.pauseScreenCapture();//开启隐私保护
    mAlivcLivePusher.resumeScreenCapture();//关闭隐私保护
    示例说明:暂停录屏,如果在config中设置了setPausePushImage则观众端会在此接口后显示图片。如果没有,则观众端停留在最后一帧。

注意事项

  • 混淆规则说明
    检查混淆,确认已将SDK相关包名加入至不混淆名单中。
    -keep class com.alivc.** { *;}
  • 接口调用
    • 同步和异步接口都可以正常调用,尽量使用异步接口调用,可以避免对主线程的资源消耗。
    • SDK接口会在发生错误或者调用顺序不对时抛出异常(throws),调用时注意添加try catch处理,否则会造成程序的crash。
    • 接口调用顺序,如下图所示:调用顺序
  • 功能限制说明
    • 您只能在推流之前设置横竖屏模式,不支持在直播的过程中实时切换。
    • 在推流设定为横屏模式时,需设定界面为不允许自动旋转。
    • 在硬编模式下,考虑编码器兼容问题分辨率会使用16的倍数,如设定为540P,则输出的分辨率为544*960,在设置播放器视图大小时需按输出分辨率等比缩放,避免黑边等问题。
  • 关于历史版本升级说明

    请将推流SDK升级至最新版,版本升级详情请参见V4.0.2升级至V4.1.0及以上迁移说明

    注意 升级时需注意集成最新的播放器SDK。