跳到主要内容

发布自定义流

SDK 支持在房间中发布自定义视频数据流、本地文件流和网络资源文件流。

自定义视频数据流

您可以通过发布资源方法将自定义视频流发布到房间中,远端用户通过订阅方法进行订阅。支持 YUV 与 Texture ID 两种数据格式。

  1. 创建本地用户发布的音视频流配置 RCRTCVideoStreamConfig,并创建自定义音视频流对象,例如 mOutputStream

    Java
    /** 设置自定义视频的分辨率、帧率、码率。默认 480x640@15 */
    RCRTCVideoStreamConfig.Builder videoConfigBuilder = RCRTCVideoStreamConfig.Builder.create();
    videoConfigBuilder.setVideoResolution(videoResolution);

    /**
    * 创建本地用户发布的视频流对象
    * @param tag 自定义视频流唯一标识,不允许带下划线
    * @param config 自定义视频的配置信息
    * @return 自定义视频流
    */
    RCRTCVideoOutputStream mOutputStream = RCRTCEngine.getInstance().createVideoStream(tag, videoConfigBuilder.build());
  2. 设置自定义视频数据来源。您也可以新建一个 IRCRTCVideoSource 的实现类。IRCRTCVideoSource.IRCVideoConsumer 接口中定义了写入流数据的方法。

    Java
    IRCVideoConsumer videoConsumer;
    mOutputStream.setSource(new IRCRTCVideoSource() {
    @Override
    public void onInit(IRCVideoConsumer observer) {
    videoConsumer = observer;
    }

    @Override
    public void onStart() {
    // 建议在此处初始化自定义视频的采集流程
    }

    @Override
    public void onStop() {
    videoConsumer = null;
    // 建议在此处处理自定义视频采集的停止流程
    }

    @Override
    public void onDispose() {
    // 销毁自定义视频流时,会回调此方法
    }
    });
  3. 调用发布资源方法将自定义视频流发布到房间中:

    Java
    /** 会议模式下发布资源 */
    localUser.publishStream(mOutputStream, new IRCRTCResultCallback() {
    @Override
    public void onSuccess() {
    }

    @Override
    public void onFailed(RTCErrorCode errorCode) {
    }
    });
  4. 成功发布视频资源后,调用 videoConsumer.writeYuvDatavideoConsumer.writeTexture 写入视频流数据。

写入 YUV 数据

发布自定义视频数据流成功后,通过 IRCRTCVideoSource.IRCVideoConsumerwriteYuvData 写入 YUV 数据:

Java
videoConsumer.writeYuvData(byte[] data, int width, int height, int rotation);
参数类型说明
databyte[]NV21 格式的视频数据
widthint视频的实际宽度
heightint视频的实际高度
rotationint旋转角度,一般为 90° 或 270°,取决于设备

写入 Texture 数据

发布自定义视频数据流成功后,通过 IRCRTCVideoSource.IRCVideoConsumerwriteTexture 写入 Texture ID 数据:

Java
videoConsumer.writeTexture(int width, int height, int oesTextureId, float[] transformMatrix, int rotation, long timestamp);
参数类型说明
widthint视频的实际宽度
heightint视频的实际高度
oesTextureIdint纹理 ID,android.opengl.GLES11Ext#GL_TEXTURE_EXTERNAL_OES 类型
transformMatrixfloat[]纹理变换矩阵
rotationint旋转角度,一般为 90° 或 270°,取决于设备
timestamplong时间戳,来源于 SurfaceTexture#getTimestamp()

自定义本地文件或网络视频流

SDK 支持在房间中发布文件流资源,支持本地文件路径或网络视频资源路径。

  1. 通过 RCRTCEnginecreateFileVideoOutputStream 创建本地文件或网络视频流:

    Java
    String filePath = "XXX";
    RCRTCVideoStreamConfig config = RCRTCVideoStreamConfig.Builder.create()
    .setVideoResolution(RCRTCVideoResolution.RESOLUTION_360_640)
    .setVideoFps(RCRTCVideoFps.Fps_24)
    .build();
    RCRTCFileVideoOutputStream fileStream = RCRTCEngine.getInstance().createFileVideoOutputStream(filePath, false, true, "CUSTOMTAG", config);
    参数类型说明
    pathString本地文件路径或网络视频资源路径
    replaceboolean是否以文件中的音频替换麦克风数据。true:以文件音频替换麦克风采集数据发送至对端;false:将文件音频与麦克风数据混音后发送至对端
    playbackboolean文件中的音频是否在本端播放
    tagString自定义视频文件流标识。tag 不能包含 _RongCloudRTC
    configRCRTCVideoStreamConfig自定义视频文件流的配置信息
  2. 调用发布资源方法,将自定义文件流发布到房间中:

    Java
    /** 会议模式下发布资源 */
    localUser.publishStream(fileStream, new IRCRTCResultCallback() {
    @Override
    public void onSuccess() {
    }

    @Override
    public void onFailed(RTCErrorCode errorCode) {
    }
    });