畅直播
  • iOS
  • Android : Java
  • macOS
  • Windows
  • Web
  • Flutter
  • 产品简介
    • 概述
    • 发布日志
    • 基本概念
    • 产品优势
    • 应用场景
    • 限制说明
    • 升级指南
  • 计费说明
  • 下载
  • 快速开始
  • 直播推流
  • 直播拉流
  • 基础功能
  • 进阶功能
  • 最佳实践
  • 常用错误码
  • 服务端 API
  • 客户端 API
  • 常见问题

同时推多路流

更新时间:2022-11-01 11:17

1 功能简介

推多路流即 SDK 提供了同时推多路流的能力。

目前 SDK 支持最大推流通道数量为 4 路流,2.14.0 之前版本默认最大推流通道数量为 2 路,如需支持更多推流通道,请联系 ZEGO 技术支持进行特殊编包。

当开发者业务中出现以下情况时,我们推荐使用 SDK 的推多路流的功能:

  • 游戏主播主路流推摄像头画面,第二路流推屏幕采集画面。
  • 户外主播主路流推前置摄像头,第二路流推后置摄像头。

2 示例源码下载

请参考 下载示例源码 获取源码。

相关源码请查看 “/ZegoExpressExample/AdvancedStreaming/src/main/java/im/zego/publishingmultiplestreams” 目录下的文件。

3 前提条件

在实现推多路流功能之前,请确保:

4 使用步骤

  • 推除主路流以外的其他路流无法直接获取摄像头数据。
  • 默认情况下所推的其余路流只能推音频数据,若需要推音视频数据,需要开启自定义视频采集功能。

4.1 创建 ZegoExpressEngine 引擎

请参考 快速开始 - 实现流程 的 “3.1 创建引擎”。

ZegoEngineProfile profile = new ZegoEngineProfile();
profile.appID = appID;
profile.appSign = appSign;
profile.scenario = ZegoScenario.DEFAULT;
profile.application = getApplication();
engine = ZegoExpressEngine.createEngine(profile, null);

4.2 (可选)设置自定义视频采集配置

自定义视频采集配置设置

调用 ZegoCustomVideoCaptureConfig 接口创建自定义视频采集对象,设置属性 bufferType ,向 SDK 提供视频帧数据类型;调用接口 enableCustomVideoCapture 开启自定义视频采集功能。

由于 Android 采集的多样性,SDK 支持多种视频帧数据类型 bufferType ,开发者需告知 SDK 使用的数据类型。

ZegoCustomVideoCaptureConfig videoCaptureConfig = new ZegoCustomVideoCaptureConfig();
// 选择 RAW_DATA 类型视频帧数据
videoCaptureConfig.bufferType = ZegoVideoBufferType.RAW_DATA;

engine.enableCustomVideoCapture(true, videoCaptureConfig, ZegoPublishChannel.MAIN);

4.3 (可选)设置辅助推流器自定义视频采集回调

辅助推流器自定义视频采集回调设置

调用 setCustomVideoCaptureHandler 设置自定义视频采集的通知回调,实现 onStartonStop 自定义采集回调方法。

// 将自身作为自定义视频采集回调对象
sdk.setCustomVideoCaptureHandler(new IZegoCustomVideoCaptureHandler() {
    @Override
    public void onStart(ZegoPublishChannel channel) {
        // 收到回调后,开发者需要执行启动视频采集相关的业务逻辑,例如开启摄像头等
        ...
    }
    @Override
    public void onStop(ZegoPublishChannel channel) {
        // 收到回调后,开发者需要执行停止视频采集相关的业务逻辑,例如关闭摄像头等
        ...
    }
});

4.4 调用辅助推流器方法实现预览和推流

登录房间后,调用开始预览接口 startPreview 或者开始推流接口 startPublishingStream ,触发 4.3 设置辅助推流器自定义视频采集回调onStart。当 onStart 回调触发后,开发者可以开始采集视频帧数据。

当停止推流 stopPublishingStream 且停止预览 stopPreview 后,会触发 4.3 设置辅助推流器自定义视频采集回调onStop 的回调,此时开发者应停止视频数据的采集。

/**
*  启动预览,设置本地预览视图,视图模式采用 SDK 默认的模式,等比缩放填充整个 View
*  如下 preview_view 为 UI 界面上的 SurfaceView/TextureView/SurfaceTexture 对象
*/
engine.startPreview(new ZegoCanvas(preview_view), ZegoPublishChannel.AUX);

/** 开始推流 */
engine.startPublishingStream("stream1", ZegoPublishChannel.AUX);

4.5 (可选)向 SDK 发送采集到视频帧数据

向 SDK 发送采集到视频帧数据

onStart 回调触发之后,开发者可以调用 sendCustomVideoCaptureRawData sendCustomVideoCaptureTextureData 向 SDK 发送采集到的视频数据。

engine.sendCustomVideoCaptureRawData(buffer, data.length, param, System.currentTimeMillis(), ZegoPublishChannel.AUX);

engine.sendCustomVideoCaptureTextureData(textureID, width, height, System.currentTimeMillis(), egoPublishChannel.AUX);

4.6 设置非主路推流事件回调

调用辅助推流器的 setEventHandler 接口为辅助推流器设置事件回调,以接收辅助推流器“推流状态改变回调”、“推流质量回调”、“推流首帧回调”等通知。

engine.setEventHandler(new IZegoEventHandler(){

    // 重写的其他回调
    ...

    @Override
    public void onPublisherStateUpdate(String streamID, ZegoPublisherState state, int errorCode, JSONObject extendedData){
        // 进行对应的推流动作结果的逻辑
        ...
    }
    @Override
    public void onPublisherQualityUpdate(String streamID, ZegoPublishStreamQuality quality){
        // 进行对应的推流中途流质量相关显示等业务逻辑
        ...
    }
    @Override
    public void onPublisherCapturedVideoFirstFrame(ZegoPublishChannel channel){
        // SDK 第一次收到到视频数据的通知
        ...
    }
    @Override
    public void onPublisherVideoSizeChanged(int width, int height, ZegoPublishChannel channel){
        // 开发者可以在此回调里去掉显示视频的 UI 遮罩空间等逻辑
    }
    @Override
    public void onPublisherRelayCDNStateUpdate(String streamID, ArrayList<ZegoStreamRelayCDNInfo> infoList){
        // 流转推到 CDN 的通知
    }

    // 重写的其他回调
    ...

});

5 API 参考列表

方法 描述
startPublishingStream 创建辅助推流器
stopPublishingStream 销毁辅助推流器

6 常见问题

  1. onStart 什么时候会回调?

    当开启了自定义视频采集的情况下,SDK 开始推流 startPublishingStream 或启动预览 startPreview 的时候会触发。

  2. 是否支持同时推 4 路以上的流?

    为了配合实时信令功能,该版本默认最大推流通道数量为 4 路,但 2.14.0 之前版本默认最大推流通道数量为 2 路。如需支持更多推流通道,请联系 ZEGO 技术支持进行特殊编包。