Android

最近更新时间:2019-05-16 14:57:11

基础知识

推流 是指将音视频数据采集编码之后,推送到您指定的视频云平台上,这里涉及大量的音视频基础知识,而且需要长时间的打磨和优化才能达到符合预期的效果。

腾讯视频云 SDK 主要帮您解决在智能手机上的推流问题,它的接口非常简单易用,只需要一个推流 URL 就能驱动:

特别说明

  • 不绑定腾讯云

    SDK 不绑定腾讯云,如果要推流到非腾讯云地址,请在推流前设置 TXLivePushConfig 中的 enableNearestIP 设置为 false。但如果您要推流的地址为腾讯云地址,请务必在推流前将其设置为 true,否则推流质量可能会因为运营商 DNS 不准确而受到影响。

准备工作

代码对接

本篇攻略主要是面向摄像头直播的解决方案,该方案主要用于美女秀场直播、个人直播以及活动直播等场景。

step 1: 添加界面元素

为了能够展示摄像头预览的影像,您需要在您的布局 xml 文件里加入如下一段代码,他会在您的UI上安插一个 TXCloudVideoView 控件,这是我们用来显示摄像头影像的专用控件:

<com.tencent.rtmp.ui.TXCloudVideoView
            android:id="@+id/video_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:visibility="gone"/>

step 2: 创建 Pusher 对象

创建一个 TXLivePusher 对象,我们后面主要用它来完成推流工作。

不过在创建 LivePush 对象之前,还需要您指定一个 LivePushConfig 对象,该对象的用途是决定 LivePush 推流时各个环节的配置参数,比如推流用多大的分辨率、每秒钟要多少帧画面(FPS)以及Gop(表示多少秒一个I帧)等等。

LivePushConfig 在 new 出来之后便已经装配了一些我们反复调过的参数,如果您不需要自己定制这些配置,简单地塞给 LivePush 对象就可以了。如果您有相关领域的经验基础,需要对这些默认配置进行调整,可以阅读进阶篇中的内容。

TXLivePusher mLivePusher = new TXLivePusher(getActivity());
mLivePushConfig = new TXLivePushConfig();
mLivePusher.setConfig(mLivePushConfig);

step 3: 启动推流

经过 step1 和 step2 的准备之后,用下面这段代码就可以启动推流了:

String rtmpUrl = "rtmp://2157.livepush.myqcloud.com/live/xxxxxx";
mLivePusher.startPusher(rtmpUrl);

TXCloudVideoView mCaptureView = (TXCloudVideoView) view.findViewById(R.id.video_view);
mLivePusher.startCameraPreview(mCaptureView);
  • startPusher 的作用是告诉 SDK 音视频流要推到哪个推流URL上去。
  • startCameraPreview 则是将界面元素和 Pusher 对象关联起来,从而能够将手机摄像头采集到的画面渲染到屏幕上。

step 3+: 纯音频推流

如果您的直播场景是声音直播,那么需要更新下推流的配置信息。前面 step1 和 step2 准备步骤不变,使用以下代码设置纯音频推流并启动推流。

// 只有在推流启动前设置启动纯音频推流才会生效,推流过程中设置不会生效。
mLivePushConfig.enablePureAudioPush(true);   // true 为启动纯音频推流,而默认值是 false;
mLivePusher.setConfig(mLivePushConfig);      // 重新设置 config

String rtmpUrl = "rtmp://2157.livepush.myqcloud.com/live/xxxxxx";
mLivePusher.startPusher(rtmpUrl);

如果您启动纯音频推流,但是 rtmp、flv 、hls 格式的播放地址拉不到流。请提工单联系我们。

step 4: 设定清晰度

使用 setVideoQuality 接口的可以设定推流的画面清晰度:

  • 推荐参数设置
应用场景 quality adjustBitrate adjustResolution
秀场直播 VIDEO_QUALITY_HIGH_DEFINITION 或
VIDEO_QUALITY_SUPER_DEFINITION
false false
手游直播 VIDEO_QUALITY_SUPER_DEFINITION true true
连麦(主画面) VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER true true
连麦(小画面) VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER false false
视频通话 VIDEO_QUALITY_REALTIEM_VIDEOCHAT true true
  • 内部数据指标
quality adjustBitrate adjustResolution 码率范围 分辨率范围
STANDARD true true 300kbps - 800kbps 270 * 480 - 360 * 640
STANDARD true false 300kbps - 800kbps 360 * 640
STANDARD true false 800kbps 360 * 640
HIGH true true 600kbps - 1500kbps 360 * 640 - 540 * 960
HIGH true false 600kbps - 1500kbps 540 * 960
HIGH false false 1200kbps 540 * 960
SUPER true true 600kbps - 1800kbps 360 * 640 - 720 * 1280
SUPER true false 600kbps - 1800kbps 720 * 1280
SUPER false false 1800kbps 720 * 1280
MAIN_PUBLISHER true true 600kbps - 1500kbps 360 * 640 - 540 * 960
SUB_PUBLISHER false false 350kbps 320 * 480
VIDEOCHAT true true 200kbps - 800kbps 190 * 320 - 360 * 640

step 5: 美颜滤镜

  • 美颜
    setBeautyFilter 接口可以设置美颜风格、磨皮程度、美白级别和红润级别,配合 540 * 960 分辨率(setVideoQuality - VIDEO_QUALITY_HIGH_DEFINITION),可以达到最佳的画质效果:

    //style             磨皮风格:  0:光滑  1:自然  2:朦胧
    //beautyLevel       磨皮等级: 取值为 0-9.取值为 0 时代表关闭美颜效果.默认值: 0,即关闭美颜效果.
    //whiteningLevel    美白等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.
    //ruddyLevel        红润等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果. 
    //
    public boolean setBeautyFilter(int style, int beautyLevel, int whiteningLevel, int ruddyLevel);
  • 滤镜
    setFilter 接口可以设置滤镜效果,滤镜本身是一张直方图文件,我们设计师团队提供了八种素材,默认打包在了 Demo 中,您可以随意使用,不用担心版权问题。

    setSpecialRatio 接口则可以设置滤镜的程度,从0到1,越大滤镜效果越明显,默认取值0.5。

    Bitmap bmp = null;
    bmp = decodeResource(getResources(), R.drawable.langman);
    if (mLivePusher != null) {
         mLivePusher.setFilter(bmp);
    }

    说明:

    如果要自定义滤镜,一定要用 PNG 格式的图片,不要用 JPG

  • 曝光
    setExposureCompensation 可以调节曝光值,这个调整项在 iOS 端是没有的(我们使用了系统的自动曝光)。但是 Android 机型差异太大,很多千元机的自动曝光效果实在一般,所以我们推荐在您的 UI 界面上提供一个自动曝光的操作滑竿,让主播可以自己调节曝光值大小。

    说明:

    setExposureCompensation 的参数为-1到1的浮点数: 0表示不调整, -1是将曝光降到最低, 1表示是将曝光加强到最高。

step 6: 控制摄像头

  • 切换前置或后置摄像头
    默认是使用前置摄像头(可以通过修改 TXLivePushConfig 的配置函数 setFrontCamera 来修改这个默认值),调用一次 switchCamera 切换一次,注意切换摄像头前必须保证 TXLivePushConfig 和 TXLivePusher 对象都已经初始化。

    // 默认是前置摄像头
    mLivePusher.switchCamera();
  • 打开或关闭闪光灯
    只有后置摄像头才可以打开闪光灯,另外该接口需要在启动预览之后调用

    //mFlashTurnOn为true表示打开,否则表示关闭
    if (!mLivePusher.turnOnFlashLight(mFlashTurnOn)) {
          Toast.makeText(getActivity().getApplicationContext(),
              "打开闪光灯失败:绝大部分手机不支持前置闪光灯!", Toast.LENGTH_SHORT).show();
    }
  • 摄像头自动或手动对焦
    大部分后置摄像头才支持对焦,SDK 支持两种对焦模式:手动对焦自动对焦
    自动对焦是系统提供的能力,但有些机型并不支持自动对焦。手动对焦和自动对焦是互斥的,开启自动对焦后,手动对焦将不生效。
    SDK 默认配置是手动对焦,您可以通过 TXLivePushConfig 的配置函数 setTouchFocus 接口进行切换:

    mLivePushConfig.setTouchFocus(mTouchFocus);
    mLivePusher.setConfig(mLivePushConfig);
  • 设置镜像效果
    主播一般是采用前置摄像头进行直播。所以对比主播端预览画面和观众端的画面,会发现左右颠倒。这个跟我们照镜子的原理是一样的。如果您想要让画面保持一致,需要设置播放端水平镜像。

    // 需在 mLivePusher.setConfig(mLivePushConfig); 之后调用
    mLivePusher.setMirror(true);

step 7: 设置 Logo 水印

最近相关政策规定,直播的视频必须要打上水印,所以这个之前看起来并不是特别起眼的功能现在要重点说一下:
腾讯视频云目前支持两种水印设置方式:一种是在推流 SDK 进行设置,原理是在 SDK 内部进行视频编码前就给画面打上水印。另一种方式是在云端打水印,也就是云端对视频进行解析并添加水印 Logo。

这里我们特别建议您使用 SDK 添加水印,因为在云端打水印有三个明显的问题:
(1)这是一种很耗云端机器的服务,而且不是免费的,会拉高您的费用成本;
(2)在云端打水印对于推流期间切换分辨率等情况的兼容并不理想,会有很多花屏的问题发生。
(3)在云端打水印会引入额外的 3s 以上的视频延迟,这是转码服务所引入的。

SDK 所要求的水印图片格式为 png,因为 png 这种图片格式有透明度信息,因而能够更好地处理锯齿等问题。(您可千万别把 jpg 图片在 Windows 下改个后缀名就塞进去了,专业的png图标都是需要由专业的美工设计师处理的)

//设置视频水印
mLivePushConfig.setWatermark(BitmapFactory.decodeResource(getResources(),R.drawable.watermark), 10, 10);
//后面两个参数分别是水印位置的 X 轴坐标和 Y 轴坐标
mLivePusher.setConfig(mLivePushConfig);

如果您需要对水印图片的位置做机型适配,那么您需要调用水印归一化接口。

//设置视频水印
mLivePushConfig.setWatermark(mBitmap, 0.02f, 0.05f, 0.2f);
//参数分别是水印图片的 Bitmap、水印位置的 X 轴坐标,水印位置的 Y 轴坐标,水印宽度。后面三个参数取值范围是[0, 1]
//后面两个参数分别是水印位置的X轴坐标和 Y 轴坐标
mLivePusher.setConfig(mLivePushConfig);

step 8: 硬件编码

TXLivePushConfig 中的 setHardwareAcceleration 设置接口可以开启或关闭硬件编码。

if (mHWVideoEncode){
    if (mLivePushConfig != null) {
        if(Build.VERSION.SDK_INT < 18){
            Toast.makeText(getApplicationContext(), "硬件加速失败,当前手机 API 级别过低(最低 18)", 
                Toast.LENGTH_SHORT).show();
            mHWVideoEncode = false;
        }
    }
}

mLivePushConfig.setHardwareAcceleration(mHWVideoEncode ? 
    TXLiveConstants.ENCODE_VIDEO_HARDWARE : TXLiveConstants.ENCODE_VIDEO_SOFTWARE);
mLivePusher.setConfig(mLivePushConfig);  

// 如果您不清楚要何时开启硬件加速, 建议设置为 ENCODE_VIDEO_AUTO
// 默认是启用软件编码, 但手机 CPU 使用率超过 80% 或者帧率 <= 10, SDK 内部会自动切换为硬件编码

mHWVideoEncode 有以下选项。

硬件加速选项 含义
ENCODE_VIDEO_HARDWARE 开启硬件加速
ENCODE_VIDEO_SOFTWARE 禁用硬件加速,默认禁用硬件加速
ENCODE_VIDEO_AUTO 自动选择是否启用硬件加速
  • 兼容性评估
    Android 手机目前对硬件加速的支持已较前两年有明显的进步,目前支持度还是不错的,但仍有个别机型有兼容性问题,目前 RTMP SDK 通过一个内部的黑名单进行控制,避免在部分兼容性差的机型上出现问题。如果您使用硬件编码失败,SDK 内部会自动切换为软件编码。

  • 效果差异
    开启硬件加速后手机耗电量会有明显降低,机身温度也会比较理想,但画面大幅运动时马赛克感会比软编码要明显很多,而且越是早起的低端机,马赛克越是严重。所以如果您是对画质要求很高的客户,不推荐开启硬件加速。

  • 推荐的设计
    我们在 setVideoQuality 的高清档(推荐档位)和标清档均推荐使用软件编码,如果您担心 CPU 和发热问题,可以做一个简单的保护逻辑:

    如果发现推流的 FPS ( 通过 TXLivePushListener 的 NET_STATUS_VIDEO_FPS 事件可以获知 ) 持续过低,比如半分钟内持续低于 10 帧/秒,表示 CPU 负载过重,则切换为硬编码。

step 9: 本地录制

使用 startRecord 接口可以启动本地录制,录制格式为 MP4,通过 videoFilePath 可以指定 MP4 文件的存放路径。

  • 录制过程中请勿动态切换分辨率和软硬编,可能导致生成的视频异常。
  • 如果是云端录制,只需要在推流 URL 后面拼接 &record=mp4 即可,详情请参考 云端录制
  • 通过 setVideoRecordListener 接口,可以设置 TXRecordCommon.ITXVideoRecordListener 监听器给 TXLivePusher ,从而获取录制相关的事件通知。
// 启动录制:返回 0 开始录制成功;-1 表示正在录制,这次启动录制忽略;-2 表示还未开始推流,这次启动录制失败
public int startRecord(final String videoFilePath) 
// 结束录制
public void stopRecord() 
//
// 视频录制回调
public interface ITXVideoRecordListener {
        void onRecordEvent(final int event, final Bundle param);
        void onRecordProgress(long milliSecond);
        void onRecordComplete(TXRecordResult result);
}

step 10: 后台推流

常规模式下,App 一旦切到后台,摄像头的采集能力就被 Android 系统停掉了,这就意味着 SDK 不能再继续采集并编码出音视频数据。如果我们什么都不做,那么故事将按照如下的剧本发展下去:

  • 阶段一(切后台开始 -> 之后的 10 秒内)- CDN 因为没有数据所以无法向观众提供视频流,观众看到画面卡主。
  • 阶段二(10 秒 -> 70 秒内)- 观众端的播放器因为持续收不到直播流而直接退出,直播间已经人去楼空。
  • 阶段三(70 秒以后)- 推流的 RTMP 链路被服务器直接断掉,主播需要重新开启直播才能继续。
    主播可能只是短暂接个紧急电话而已,但各云商的安全保护措施会让主播的直播被迫提前结束。

我们可以采用如下方案规避:

  • 10.1、设置 pauseImg
    在开始推流前,使用 TXLivePushConfig 的 setPauseImg 接口设置一张等待图片,图片含义推荐为“主播暂时离开一下下,稍后回来”。

      mLivePushConfig.setPauseImg(300,5);
      // 300 为后台播放暂停图片的最长持续时间,单位是秒
      // 10 为后台播放暂停图片的帧率,最小值为 5,最大值为 20
      Bitmap bitmap = decodeResource(getResources(), R.drawable.pause_publish);
      mLivePushConfig.setPauseImg(bitmap);
      // 设置推流暂停时,后台播放的暂停图片, 图片最大尺寸不能超过 1920*1920.
      mLivePusher.setConfig(mLivePushConfig);  
  • 10.2、设置setPauseFlag
    在开始推流前,使用 TXLivePushConfig 的 setPauseFlag 接口设置切后台 pause 推流时需要停止哪些采集,停止视频采集则会推送 pauseImg 设置的默认图,停止音频采集则会推送静音数据。

    setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO|PAUSE_FLAG_PAUSE_AUDIO);//表示同时停止视频和音频采集,并且推送填充用的音视频流;

    setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO);//表示停止摄像头采集视频画面,但保持麦克风继续采集声音,用于主播更衣等场景;

  • 10.3、切后台处理
    推流中,如果 App 被切了后台,调用 TXLivePusher 中的 pausePush 接口函数,之后,SDK 虽然采集不到摄像头的画面了,但可以用您刚才设置的 PauseImg 持续推流。

    // activity 的 onStop 生命周期函数
    @Override
    public void onStop(){
      super.onStop();
      mCaptureView.onPause();  // mCaptureView 是摄像头的图像渲染view
      mLivePusher.pausePusher(); // 通知 SDK 进入“后台推流模式”了
    }
  • 10.4、切前台处理
    等待 App 切回前台之后,调用 TXLivePusher 的 resumePush 接口函数,之后,SDK 会继续采集摄像头的画面进行推流。

    // activity 的 onStop 生命周期函数
    @Override
    public void onResume() {
      super.onResume();
      mCaptureView.onResume();     // mCaptureView 是摄像头的图像渲染view
      mLivePusher.resumePusher();  // 通知 SDK 重回前台推流
    }

step 10+: 后台推摄像头采集数据

如果希望主播在切后台或者跳转其他界面,播放端还能看到主播摄像头采集的画面, 按照以下配置即可。
1、step 10.1 和 step 10.2 无需设置。
2、在 step 10.3 中,注释 mLivePusher.pausePusher() 该方法。
3、在 step 10.4 中,注释 mLivePusher.resumePusher() 该方法。

注意:使用该功能注意保护主播隐私。

step 11: 网络质量提示

  • 如果主播网络质量不好,我们应该怎么做?
  • 主动降低清晰度来确保流畅性? 这样观众端的感受就是模糊和马赛克。
  • 主动丢掉一部分视频帧,以确保画面还能持续有一定的清晰度?这样观众端的感受就是持续卡顿。
  • 以上都是我们不想要的?那怎么办?
  • “既然马儿跑得快,又让马儿不吃草。” 我们都知道,这是不可能的事情。

通过 TXLivePushListener 里的 onPlayEvent 可以捕获 PUSH_WARNING_NET_BUSY 事件,它代表当前主播的网络已经非常糟糕,出现此事件即代表观众端会出现卡顿。

此时可以提示主播 “您当前的网络状况不佳,推荐您离 Wi-Fi 近一点,尽量不要让 Wi-Fi 穿墙”

step 12: 横屏推流

有时候用户在直播的时候需要更广的视角,则拍摄的时候需要“横屏持握”,这个时候其实是期望观看端能看到横屏画面,就需要做横屏推流,下面两幅示意图分别描述了横竖屏持握进行横竖屏推流在观众端看到的效果:

  • 调整观众端表现
    通过对 LivePushConfig 中的 setHomeOrientation 设置项进行配置,此接口提供了手机旋转了 0,90,180,270 度 四个参数供设置旋转角度。调整后的结果可以用播放器 Demo 查看以确认是否符合预期。

    // 竖屏状态, 手机 Home 键在正下方。   旋转 0 度
    mLivePushConfig.setHomeOrientation(TXLiveConstants.VIDEO_ANGLE_HOME_DOWN); 
    // 横屏状态,手机 Home 键在右手方。   旋转 270 度
    mLivePushConfig.setHomeOrientation(TXLiveConstants.VIDEO_ANGLE_HOME_RIGHT); 
  • 调整主播端表现
    观众端的画面表现符合预期以后,剩下要做的就是调整主播端的预览画面,这时可以通过 TXLivePusher 中的 setRenderRotation 接口,来旋转主播端看到的画面旋转方向,它决定主播端看到的视频宽高比是 16:9 还是 6:19

    // 竖屏状态,本地渲染相对正方向的角度为0。
    mLivePusher.setRenderRotation(0);
    // 横屏状态,本地渲染相对正方向的角度为90。
    mLivePusher.setRenderRotation(90);
  • Activity自动旋转
    Android 系统的 Activity 本身支持跟随手机的重力感应进行旋转(设置 android:configChanges),CODE演示了如何做到下面这种重力感应效果:

step 13: 背景混音

SDK 1.6.1 开始支持背景混音,支持主播带耳机和不带耳机两种场景,您可以通过 TXLivePusher 中的如下这组接口实现背景混音功能:

接口 说明
playBGM 通过 path 传入一首歌曲,小直播 Demo中我们是从iOS的本地媒体库中获取音乐文件
stopBGM 停止播放背景音乐
pauseBGM 暂停播放背景音乐
resumeBGM 继续播放背景音乐
setMicVolume 设置混音时麦克风的音量大小,推荐在 UI 上实现相应的一个滑动条,由主播自己设置
setBGMVolume 设置混音时背景音乐的音量大小,推荐在 UI 上实现相应的一个滑动条,由主播自己设置

step 14: 结束推流

用于推流的 TXLivePusher 和用于显示影像的 TXCloudVideoView 无法多实例并行运转,在结束推流时必须进行清理,否则会导致下次直播时无法正常使用对应功能。

//结束推流并进行清理
public void stopRtmpPublish() {
    mLivePusher.stopCameraPreview(true); //停止摄像头预览
    mLivePusher.stopPusher();            //停止推流
    mLivePusher.setPushListener(null);   //解绑 listener
}

发送消息

此功能可以在推流端将一些自定义 message 随着音视频线路直接下发到观众端,适用场景例如:
  • 冲顶大会:推流端将题目下发到观众端,可以做到“音-画-题”完美同步。
  • 秀场直播:推流端将歌词下发到观众端,可以在播放端实时绘制出歌词特效,因而不受视频编码的降质影响。
  • 在线教育:推流端将激光笔涂鸦操作下发到观众端,可以在播放端实时地划圈划线。
//Android 示例代码
mTXLivePusher.sendMessage(questionInfo.getBytes("UTF-8"));

播放端使用 TXLivePlayer 的 onPlayEvent (PLAY_EVT_GET_MESSAGE) 可以用来接收消息。具体参考播放文档

事件处理

1. 事件监听

SDK 通过 TXLivePushListener 代理来监听推流相关的事件,注意 TXLivePushListener 只能监听得到 PUSH_ 前缀的推流事件。

2. 常规事件

一次成功的推流都会通知的事件,比如收到 1003 就意味着摄像头的画面会开始渲染了

事件 ID 数值 含义说明
PUSH_EVT_CONNECT_SUCC 1001 已经成功连接到腾讯云推流服务器
PUSH_EVT_PUSH_BEGIN 1002 与服务器握手完毕,一切正常,准备开始推流
PUSH_EVT_OPEN_CAMERA_SUCC 1003 推流器已成功打开摄像头(Android 部分手机这个过程需要1-2秒)
PUSH_EVT_CHANGE_RESOLUTION 1005 推流动态调整分辨率
PUSH_EVT_CHANGE_BITRATE 1006 推流动态调整码率

3. 错误通知

SDK发现了一些严重问题,推流无法继续了,比如用户禁用了 App 的 Camera 权限导致摄像头打不开。

事件 ID 数值 含义说明
PUSH_ERR_OPEN_CAMERA_FAIL -1301 打开摄像头失败
PUSH_ERR_OPEN_MIC_FAIL -1302 打开麦克风失败
PUSH_ERR_VIDEO_ENCODE_FAIL -1303 视频编码失败
PUSH_ERR_AUDIO_ENCODE_FAIL -1304 音频编码失败
PUSH_ERR_UNSUPPORTED_RESOLUTION -1305 不支持的视频分辨率
PUSH_ERR_UNSUPPORTED_SAMPLERATE -1306 不支持的音频采样率
PUSH_ERR_NET_DISCONNECT -1307 网络断连,且经三次抢救无效,可以放弃治疗,更多重试请自行重启推流

4. 警告事件

SDK 发现了一些问题,但这并不意味着无可救药,很多 WARNING 都会触发一些重试性的保护逻辑或者恢复逻辑,而且有很大概率能够恢复,所以,千万不要“小题大做”哦。

  • WARNING_NET_BUSY
    主播网络不给力。如果您需要 UI 提示,这个 warning 相对比较有用(step10)。

  • WARNING_SERVER_DISCONNECT
    推流请求被后台拒绝了。出现这个问题一般是由于推流地址里的 txSecret 计算错了,或者是推流地址被其他人占用了(一个推流 URL 同时只能有一个端推流)。

事件ID 数值 含义说明
PUSH_WARNING_NET_BUSY 1101 网络状况不佳:上行带宽太小,上传数据受阻
PUSH_WARNING_RECONNECT 1102 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃)
PUSH_WARNING_HW_ACCELERATION_FAIL 1103 硬编码启动失败,采用软编码
PUSH_WARNING_DNS_FAIL 3001 RTMP -DNS 解析失败(会触发重试流程)
PUSH_WARNING_SEVER_CONN_FAIL 3002 RTMP 服务器连接失败(会触发重试流程)
PUSH_WARNING_SHAKE_FAIL 3003 RTMP 服务器握手失败(会触发重试流程)
PUSH_WARNING_SERVER_DISCONNECT 3004 RTMP 服务器主动断开连接(会触发重试流程)

全部事件定义请参阅头文件“TXLiveConstants.java”