Home - Arcloud/LiveRecorder-Android GitHub Wiki

当虹云Android推流SDK主页

杭州当虹科技股份有限公司的Android平台推流SDK主要提供了本地音视频录制推流,能够实现较低的性能开销达到较好推流体验。本参考文档将对该SDK的主要函数及使用进行详细的描述,以便开发者能够参考该文档进行快速的开发。本文档中提到的所有接口和定义都是针对java语言。

1.SDK特性

  • 支持RTMP协议
  • 支持H.264和AAC编码
  • 支持自适应网络质量动态切换码率推流
  • 支持美颜、滤镜、动态贴纸、互动道具
  • 支持前置摄像头镜像
  • 支持低延时直播
  • 支持弱网优化
  • 支持卡顿优化
  • 支持多分辨率编码
  • 支持纯音频推流
  • 支持后台推流
  • 支持前后置摄像头,以及动态切换
  • 支持自动/手动对焦
  • 支持Mute/Unmute
  • 支持闪光灯操作
  • 支持数据源回调接口,外部可自定义滤镜特效。

2.鉴权

在使用SDK功能前,要通过鉴权验证。

2.1.鉴权逻辑

  • 安装app后,是无鉴权信息,需要去更新鉴权信息。但是第一次运行时,允许运行SDK功能。此时会更新鉴权信息,直到更新成功。在没更新成功前,属于试用阶段(比如试用5天)。可能由于网络原因,在试用n天内,一直无法更新鉴权信息,这个阶段会给予权限运行加水印方式;试用n天后,还是无更新成功,则直接禁止运行。
  • 成功更新鉴权信息后,一切鉴权结果根据最新鉴权信息查询得到。鉴权会定期去更新鉴权信息。

2.2. 调用方式

Int ret = mCameraRecorder.initRecorder(mVideoPushAddress,this,accessKey,secret,appKey); 鉴权返回值可以分为如下三个状态: 禁止:禁止SDK运行。 允许:只有返回值是0才是这种状态,也是唯一。 允许+水印:像这种状态属于提醒状态,让用户知道目前该SDK过期了、无鉴权信息。

3.快速集成

3.1 首先需要开发者或公司在当虹云后台进行注册账号,然后按照指定的方式获取AccessKey/Secret;

3.2 拷贝so库和jar包

  • 将SDK中libs目录下所有的so文件拷贝到工程目录下libs/armeabi目录下,将SDK中jar目录下所有的jar文件拷贝到libs根目录下,如何所示:

  • 在程序启动时候将加载so库文件,参考samplecode中的LoadLibraray ()函数。

3.3 拷贝ini文件

  • 打开SDK中assets目录下ArcPlugin.ini,并做如下修改 :

    下图红色标记处为samplecode的包名,请将它改为工程自己的包名。

  • 修改完成后将此ArcPlugin.ini文件拷贝到工程目录下assets目录下。

  • 在程序启动时候将ArcPlgin.ini文件拷贝到程序安装目录下,参考samplecode中的copyPluginIni()函 数。

3.4 APP 需要给 SDK 开一些权限,权限配置文件为 AndroidManifest.xml,权限项如下:

    		<uses-feature android:name="android.hardware.camera" />
     		<uses-feature android:name="android.hardware.autofocus" />
    		<uses-feature android:name="android.hardware.audio.low_latency" />	
        	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        	<uses-permission android:name="android.permission.CAMERA" />
        	<uses-permission android:name="android.permission.FLASHLIGHT" />
        	<uses-permission android:name="android.permission.RECORD_AUDIO" />
        	<uses-permission android:name="android.permission.INTERNET" />
        	<uses-permission android:name="android.permission.WRITE_SDCARD" />
        	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        	<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
        	<uses-permission android:name="android.permission.GET_TASKS" />
        	<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY" />
        	<uses-permission android:name="android.permission.READ_PHONE_STATE" />
        	<uses-permission android:name="android.permission.READ_LOGS" />
        	<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        	<uses-permission android:name="android.permission.VIBRATE" />
        	<uses-permission android:name="android.permission.WAKE_LOCK" />
    		<uses-permission android:name="android.permission.WRITE_SETTINGS" />
    		<service android:name="com.arcvideo.live_session.LiveSessionService" />

3.5 LiveRecorder 的主要接口调用和时序如下:

3.5.1 初始化

推流初始化主要包括推流引擎初始化、录制参数的设置、CameraSurfaceView的初始化、推流监听回调等方面,具体集成步骤如下:

  • 初始化cameraRecord引擎,如下代码:
      mCameraRecorder = new CameraRecord(this);
  • 通过getSupportPreviewSize()取得手机支持的分辨率列表,然后选择其中一个分辨率设置到录制属性中,注意:cameraConfig中的录制分辨率必须设置为手机支持的分辨率,如果设置错误,会导致下面预览失败或者花屏等错误。如下代码:
      mSupportSizes = mCameraRecorder.getSupportPreviewSize();
      mOptimalPreviewSize = getOptimalPreviewSize(mSupportSizes, VIDEO_WIDTH, VIDEO_HEIGHT);
      mCameraConfig.setVideoWidth(mOptimalPreviewSize.width);
      mCameraConfig.setVideoHeight(mOptimalPreviewSize.height);
      mCameraConfig.setVideoBitRate((int)(mOptimalPreviewSize.width * mOptimalPreviewSize, height * 2));
  • 初始化CameraSurfaceView,并设置到推流引擎中,如下代码:
      mSurfaceView = (CameraSurfaceView) findViewById(R.id.continuousCapture_surfaceView);
      Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
      mSurfaceView.init(this, mCameraRecorder.getCameraManager(), mCameraConfig, mWindowWidth, mWindowHeight);
      mCameraRecorder.setCameraSurfaceView(mSurfaceView);
  • 设置录制参数,如前置后置,显示模式,自动对焦,缩放,水印等,如下代码:
      CameraRecorder.SetCameraFacingType(mCameraFacing);
      mCameraRecorder.setCameraDisplayMode(CameraTypes.FILL_IN);
      mCameraRecorder.enableAutoFoucs(true);
      mCameraRecorder.enableZoom(true);
      mCameraRecorder.setWaterMark(bitmap,CameraTypes.RIGHT_TOP);
  • 设置监听回调,如下代码:
      mCameraRecorder.setNotifyListener(this);
3.5.2 预览

预览主要包括开启摄像头、设置CameraSurfaceView为可见、设置美颜模式等,这些步骤,需要在初始化成功后执行,如果初始化出现异常则会导致预览失败。

  • 打开预览,请在OnResume函数中执行,如下代码:
      mSurfaceView.setVisibility(View.VISIBLE);
      mCameraRecorder.openCamera(mCameraConfig);
  • 设置美颜,设置美颜模式需要在预览成功之后,请用isCameraSurfaceCreated()函数得到当前CameraSurfaceView的状态,当为true时表明预览成功,此时可以设置美颜模式;反之,当为false时表明预览失败,此时不能设置美颜模式,打开美颜模式调用如下代码如下:
      if (mCameraRecorder.isCameraSurfaceCreated()) { 
      mCameraRecorder.enableFaceBeauty(true);
      }

美颜打开后可以调用如下接口设置美颜磨皮和美白的级别:

mCameraRecorder.setFaceSkinSoftenLevel(level);//磨皮
mCameraRecorder.setFaceBrightLevel(level) //美白
3.5.3录制

录制主要包括初始化编码器、设置编码参数、设置录制地址、开始/停止录制等步骤,这些步骤需要在预览成功后才能执行,如果预览尚未成功就开始录制,则会出现录制失败的问题,具体集成步骤如下。

  • 初始化编码器,如下代码:
    • 如果使用者需要人为指定与Camera preview分辨率不一样的其它小分辨率的视屏输出,则可以先调用mCameraRecorder.setLiveRecordEncodeResolution(width,height, bitrate)接口进行设置,然后再调用mCameraRecorder.initEncoder(),详细使用说明请参见setLiveRecordEncodeResolution函数接口说明;比如Camera preview分辨率为1280x720,使用者希望编码输出为640x360,则需要先调用mCameraRecorder.setLiveRecordEncodeResolution(640, 360,600000),然后再调用mCameraRecorder.initEncoder();
    • 如果使用者不需要额外指定输出分辨率,则可以直接调用mCameraRecorder.initEncoder()接口,这种情况下编码输出的分辨率与Camera preview分辨率一致,比如preview分辨率为1280x720,则编码输出也为1280x720.
    • 设置编码参数,主要包括对推送、音频、视频这三个方面的编码设置,注意:编码参数请参照我们samplecode中的参数,如下代码:
mCameraRecorder.setClipInfo(CameraTypes.RECORD_FILE_TYPE_TCP,0,mCameraConfig.getVideoWidth(),mCameraConfig.getVideoHeight(), 0, 0, true,true);  
mCameraRecorder.setAudioInfo(CameraTypes.RECORD_CODEC_TYPE_AAC,0, 1, 16, 0, 44100, 64000);  
mCameraRecorder.setVideoInfo(CameraTypes.RECORD_CODEC_TYPE_H264,,mCameraConfig.getVideoWidth(),mCameraConfig.getVideoHeight(),mCameraConfig.getVideoFrameRate(),mCameraConfig.getVideoBitRate(),0);
  • 设置录制地址,如下代码:
mCameraRecorder.initRecorder(mRtmpAdress);
  • 开始录制,如下代码:
mCameraRecorder.startRecord();
  • 停止录制:如下代码:
mCameraRecorder.stopRecord();

推流编码分辨率码率对照表

16:9推流分辨率及建议码率对照

分辨率 建议码率(bps)
1280x720 >= 1800000
960x540 >=1200000
854x480 >=900000
800x450 >=800000
640x360 >=560000

4:3推流分辨率及建议码率对照

分辨率 建议码率(bps)
640x480 >=700000
960x540 >=500000

3:2推流分辨率及建议码率对照

分辨率 建议码率(bps)
720x480 >=800000