跳到主要内容

发布自定义流

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

自定义视频数据流

SDK 支持发布自定义视频流。通过发布资源方法发布到房间中。远端用户可使用订阅方法订阅此自定义视频流。支持 YUV 和 TextureId 格式。

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

    /** 设置自定义视频的分辨率、帧率、码率信息。默认是480x640@15f */
    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 接口中定义了写入流数据的方法。

    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() {
    // 销毁自定义视频Stream时,此方法回被回调
    }
    });
  3. 将发布资源方法发布到房间中。

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

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

写入 yuv 数据

发布自定义视频数据流成功后,通过 IRCRTCVideoSource.IRCVideoConsumer 接口中的 writeYuvData 方法写入 yuv 格式数据。

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

写入 texture 数据

发布自定义视频数据流成功后,通过 IRCRTCVideoSource.IRCVideoConsumer 接口中的 writeTexture 方法写入 TextureId 格式数据。

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 类型
transformMatrixint矩阵
rotationint旋转角度。一般为 90° 或 270° ,取决于设备
timestampint当前时间戳:surfaceTexture.getTimestamp()

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

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

  1. 通过 RCRTCEngine 中的 createFileVideoOutputStream 接口创建本地文件或网络视频流。

    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. 使用发布资源的方法,将自定义文件流发布到房间中。

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

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