SOP TRTC SDK 仪表盘 Android TRTC 发送自定义采集的视频数据 Android TRTC 发送自定义采集音频解决方案 Android TRTC 实现横屏视频通话 iOS端 TRTC 发送自定义采集视频解决方案 iOS端 TRTC 发送自定义采集音频解决方案 APNS推送 脏字过滤 TXLiteAVSDK中使用 AVAudioSession 问题总结 AndroidStudio编译SDK报错 RoomService部署验证 Xcode编译SDK报错 iOS编译库冲突问题 iOS端移动直播自定义采集实现 iOS端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端TXLiteAVSDK与IMSDK 3.x集成冲突报错问题 Android端LiteIM sdk升级IM4.x版本报错问题 移动直播iOS 12兼容问题 如何实现好的画质 如何计算PCM音量大小 使用播放器播放视频有黑边 直播拉流播放失败 直播拉流端卡顿现象 短视频上传失败 移动直播SDK对接第三方美颜库 移动直播连麦解决方案 Android移动直播推自定义采集的视频数据 Android移动直播推自定义采集的声音数据 Android直播播放如何获取YUV数据 Android直播播放如何自定义渲染 实时音视频画面黑屏 实时音视频订阅流显示 iOS 12默认新编译系统下文件名冲突问题 TXLiteAVSDK指标监控 进阶:小程序实时音视频参数透传 移动直播 Android 9.0 无法拉流问题 移动直播推流事件回调 移动直播拉流事件回调 短视频实现视频缩略图列表转GIF功能 roomService加入群组时报错invalid group id NTP时间戳转换 提示Role not exists 角色不存在 如何播放背景音乐 iOS端短视频添音频相关问题总结 Web同步终端离线推送TIMOfflinePushInfo说明文档 web端自定义消息发送 web端同步终端的已读回执 web端对群组内用户禁言操作 TRTC v2混流接口setMixTranscodingConfig使用指引

移动直播推流事件回调?

发布日期:2018年10月30日 更新日期:2018年10月30日 贡献者:yyuanchen

场景

主播开启直播过程中,可能会遇到以下情况,如推流一直不成功、因网络波动导致断流了。App 一般都会在 UI 上通过一些提示语来提示主播。我们移动直播 SDK 有完整的事件回调,开发者可以根据不同事件回调来提示主播。

解决方案

Android

1、实现 ITXLivePushListener 接口 并实现 onPushEvent()onNetStatus() 方法

2、在onPushEvent()监听推流事件

@Override
public void onPushEvent(int event, Bundle param) {

    String msg = param.getString(TXLiveConstants.EVT_DESCRIPTION);
    String pushEventLog = "receive event: " + event + ", " + msg;
    Log.d(TAG, pushEventLog);

    //错误还是要明确的报一下
    if (event < 0) {
        Toast.makeText(getApplicationContext(), param.getString(TXLiveConstants.EVT_DESCRIPTION), Toast.LENGTH_SHORT).show();
        if(event == TXLiveConstants.PUSH_ERR_OPEN_CAMERA_FAIL || event == TXLiveConstants.PUSH_ERR_OPEN_MIC_FAIL){
            // 打开摄像头或麦克风失败,停止推流
            stopPublishRtmp();
        }
    }

    if (event == TXLiveConstants.PUSH_ERR_NET_DISCONNECT || event == TXLiveConstants.PUSH_ERR_INVALID_ADDRESS) {
        // 推流请求被后台拒绝, 获取获取不到服务器地址,停止推流
        stopPublishRtmp();
    }

    else if (event == TXLiveConstants.PUSH_WARNING_HW_ACCELERATION_FAIL) {
        // 提示使用硬件编码失败, 切换为软编
        Toast.makeText(getApplicationContext(), param.getString(TXLiveConstants.EVT_DESCRIPTION), Toast.LENGTH_SHORT).show();
        mLivePushConfig.setHardwareAcceleration(TXLiveConstants.ENCODE_VIDEO_SOFTWARE);
        mBtnHWEncode.setBackgroundResource(R.drawable.quick2);
        mLivePusher.setConfig(mLivePushConfig);
        mHWVideoEncode = false;
    }
    else if (event == TXLiveConstants.PUSH_ERR_SCREEN_CAPTURE_UNSURPORT) {
        // 该设置不支持录屏推流,停止推流
        stopPublishRtmp();
    }
    else if (event == TXLiveConstants.PUSH_ERR_SCREEN_CAPTURE_START_FAILED) {
        // 获取屏幕画面失败,停止录屏推流
        stopPublishRtmp();
    } else if (event == TXLiveConstants.PUSH_EVT_CHANGE_RESOLUTION) {
        // 分辨率改变(开启动态分辨率才会收到)
        Log.d(TAG, "change resolution to " + param.getInt(TXLiveConstants.EVT_PARAM2) + ", bitrate to" + param.getInt(TXLiveConstants.EVT_PARAM1));
    } else if (event == TXLiveConstants.PUSH_EVT_CHANGE_BITRATE) {
        // 码率改变(开启动态码率才会收到)
        Log.d(TAG, "change bitrate to" + param.getInt(TXLiveConstants.EVT_PARAM1));
    } else if (event == TXLiveConstants.PUSH_WARNING_NET_BUSY) {
        // 警告级别,提示主播网络不给力
    } else if (event == TXLiveConstants.PUSH_EVT_START_VIDEO_ENCODER) {
        // 输出编码方式(硬编还是软编)
        int encType = param.getInt(TXLiveConstants.EVT_PARAM1);
        mHWVideoEncode = (encType == 1);
        mBtnHWEncode.getBackground().setAlpha(mHWVideoEncode ? 255 : 100);
    }
}

iOS

1、实现 ITXLivePushListener 代理 并实现 onPushEvent()onNetStatus() 方法

2、在onPushEvent()监听推流事件

// RTMP 推流事件通知
#pragma - TXLivePushListener

- (void)onPushEvent:(int)EvtID withParam:(NSDictionary *)param; {
    NSDictionary *dict = param;

    dispatch_async(dispatch_get_main_queue(), ^{
        if (EvtID == PUSH_ERR_NET_DISCONNECT || EvtID == PUSH_ERR_INVALID_ADDRESS) {
            [self clickPublish:_btnPublish];
        } else if (EvtID == PUSH_WARNING_HW_ACCELERATION_FAIL) {
            _txLivePublisher.config.enableHWAcceleration = false;
            [_btnHardware setImage:[UIImage imageNamed:@"quick2"] forState:UIControlStateNormal];
        } else if (EvtID == PUSH_ERR_OPEN_CAMERA_FAIL) {
            [self stopRtmp];
            [_btnPublish setImage:[UIImage imageNamed:@"start"] forState:UIControlStateNormal];
            _publish_switch = NO;
            [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
            [self toastTip:@"获取摄像头权限失败,请前往隐私-相机设置里面打开应用权限"];
        } else if (EvtID == PUSH_ERR_OPEN_MIC_FAIL) {
            [self stopRtmp];
            [_btnPublish setImage:[UIImage imageNamed:@"start"] forState:UIControlStateNormal];
            _publish_switch = NO;
            [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
            [self toastTip:@"获取麦克风权限失败,请前往隐私-麦克风设置里面打开应用权限"];
        } else if (EvtID == PUSH_EVT_CONNECT_SUCC) {
            BOOL isWifi = [AFNetworkReachabilityManager sharedManager].reachableViaWiFi;
            if (!isWifi) {
                __weak __typeof(self) weakSelf = self;
                [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
                    if (weakSelf.pushUrl.length == 0) {
                        return;
                    }
                    if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
                        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@""
                                                                                       message:@"您要切换到WiFi再推流吗?"
                                                                                preferredStyle:UIAlertControllerStyleAlert];
                        [alert addAction:[UIAlertAction actionWithTitle:@"是" style:UIAlertActionStyleDefault handler:^(UIAlertAction *_Nonnull action) {
                            [alert dismissViewControllerAnimated:YES completion:nil];
                            [weakSelf.txLivePublisher stopPush];
                            [weakSelf.txLivePublisher startPush:weakSelf.pushUrl];
                        }]];
                        [alert addAction:[UIAlertAction actionWithTitle:@"否" style:UIAlertActionStyleCancel handler:^(UIAlertAction *_Nonnull action) {
                            [alert dismissViewControllerAnimated:YES completion:nil];
                        }]];
                        [weakSelf presentViewController:alert animated:YES completion:nil];
                    }
                }];
            }
        } else if (EvtID == PUSH_WARNING_NET_BUSY) {
            [_notification displayNotificationWithMessage:@"您当前的网络环境不佳,请尽快更换网络保证正常直播" forDuration:5];
        }
}

原理

使用移动直播 SDK 推流成功, SDK 回调事件如下:

使用移动直播 SDK 推流成功,但是过段时间因网络波动,SDK 重连三次依然无法重新推流。SDK 回调事件如下:

移动直播 SDK 中推流对象 TXLivePusher 的内部原理,如下图

其他

如果您想了解更多的事件处理,见移动直播官网的事件处理文档

如果您想查看 SDK 中完整的事件回调, 见文档

results matching ""

    No results matching ""