文档反馈
文档反馈

自定义视频采集

自定义视频采集的功能指的是由开发者自定义向 NERTC SDK 提供自定义的视频输入源数据,并由 NERTC SDK 进行编码推流的功能。

功能描述

一般情况下,App 采用默认设备采集视频数据,通常是本设备的摄像头模块。但在部分场景下可能需要使用自定义的视频源,例如:

基于以上场景,NERTC SDK 支持开发者使用自定义的视频源,以实现业务场景中的相关需求。本文将介绍如何实现自定义视频采集功能。

Android

注意事项

自定义视频采集场景中,您需要自行管理视频数据的采集和处理。

实现方法

NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。Push 方式下,SDK 会根据设置的视频 Profile 对数据源进行裁剪或缩放,来达到发送目标分辨率,同时视频的帧率由数据源自身控制。

参考如下步骤,在您的项目中通过 Push 方式实现自定义视频源功能:

  1. enableLocalVideo 前通过调用 setExternalVideoSource 指定外部视频采集设备。
  2. 指定外部采集设备后,开发者自行管理视频数据采集和处理。
  3. 完成视频数据处理后,再通过 pushExternalVideoFrame 发送给 SDK 进行后续操作。

    为满足实际使用需求,您可以在将视频数据发送回 SDK 前,通过 NERtcVideoFrame 修改视频数据。比如,设置 rotation 为 180,使视频帧顺时针旋转 180 度。

示例代码

NERtcEx.getInstance().setExternalVideoSource(true); //设置使用自定义数据源
NERtcEx.getInstance().enableLocalVideo(true)//开始视频
NERtcEx.getInstance().pushExternalVideoFrame(videoFrame); //推送自定义数据

private void changeExternalVideo(boolean external) {
    if (external) {
        NERtcEx.getInstance().enableLocalVideo(false); //先结束原先视频
        NERtcEx.getInstance().setExternalVideoSource(true); //设置成外部视频
        if (mExternalVideoType == 2) {
            mExternalVideoSource = new ExternalTextureVideoSource(mExternalVideoPath, this);
        } else {
            mExternalVideoSource = new ExternalYuvVideoSource(mExternalVideoType, mExternalVideoPath,
                    mExternalVideoWidth, mExternalVideoHeight, mExternalVideoFps, mExternalVideoRotation);
        }
        NERtcEx.getInstance().enableLocalVideo(true); //开启视频推流
        mExternalVideoSource.start(); //向SDK发送外部数据
    } else {
        if (mExternalVideoSource != null) { //停止向SDK发送外部数据
            mExternalVideoSource.stop();
            mExternalVideoSource = null;
        }
        NERtcEx.getInstance().enableLocalVideo(false); //关闭视频推流
        NERtcEx.getInstance().setExternalVideoSource(false); //设置成内部相机
        NERtcEx.getInstance().enableLocalVideo(true); //开启视频推流
    }
}

iOS

注意事项

自定义视频采集场景中,您需要自行管理视频数据的采集和处理。

实现方法

NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。Push 方式下,SDK 会根据设置的视频 Profile 对数据源进行裁剪或缩放,来达到发送目标分辨率,同时视频的帧率由数据源自身控制。

参考如下步骤,在您的项目中使用 Push 方式实现自定义视频源功能:

  1. enableVideo 前通过调用 setExternalVideoSource: 指定外部视频采集设备。
  2. 指定外部采集设备后,开发者自行管理视频数据采集和处理。
  3. 完成视频数据处理后,再通过 pushExternalVideoFrame: 发送给 SDK 进行后续操作。

    为满足实际使用需求,您可以在将视频数据发送回 SDK 前,通过 NERtcVideoFrame 修改视频数据。比如,设置 rotation 为 180,使视频帧顺时针旋转 180 度。

示例代码

    NERtcEngine *coreEngine = [NERtcEngine sharedEngine];
    [coreEngine setExternalVideoSource:YES];    // 设置使用自定义数据源
    [coreEngine enableLocalAudio:YES];
    [coreEngine enableLocalVideo:YES];          // 开始视频
    NERtcEngineContext *context = [[NERtcEngineContext alloc] init];
    context.engineDelegate = self;
    context.appKey = @"<#请输入您的AppKey#>";
    [coreEngine setupEngineWithContext:context];

    ////

    [NERtcEngine.sharedEngine pushExternalVideoFrame:frame]; // 推送自定义数据

Windows/macOS

开发注意事项

自定义视频采集场景中,您需要自行管理视频数据的采集和处理。

实现方法

参考如下步骤,在您的项目中使用 Push 方式实现自定义视频源功能:

  1. 通过调用 setDevice 指定特定 kNERtcExternalVideoDeviceID 外部视频采集设备,并且需要调用 setExternalVideoSource 且设置为true,然后通过 enableLocalVideo 启动设备。 如果已经开启了摄像头采集,会自动切换到外部设备采集,不需要再次调用 enableLocalVideo
  2. 指定外部采集设备后,开发者自行管理视频数据采集和处理。
  3. 完成视频数据处理后,再通过 pushExternalVideoFrame 发送给 SDK 进行后续操作。

    为满足实际使用需求,您可以在将视频数据发送回 SDK 前,通过 NERtcVideoFrame 修改视频数据。比如,设置 rotation 为 180,使视频帧顺时针旋转 180 度。

示例代码

video_device_manager->setDevice(kNERtcExternalVideoDeviceID); //设置为外部设备采集
rtc_engine_->setExternalVideoSource(true); //设置使用自定义数据源
rtc_engine_->enableLocalVideo(true)//开始视频(如果原先已经开启了视频,则不需要调用)
rtc_engine_->pushExternalVideoFrame(videoFrame); //推送自定义数据


//切换回摄像头采集
rtc_engine_->setExternalVideoSource(false); //设置关闭自定义数据源
video_device_manager->setDevice(cameraDeviceID); //设置选择的设备

Web

自定义视频采集功能支持的数据源包括:

实现方法

参考如下步骤,在您的项目中实现自定义视频采集:

在创建音视频流 createStream 时,通过 audioSource 指定自定义的音频源,通过 videoSource 指定自定义的视频源。

示例代码

navigator.mediaDevices.getUserMedia(
    {video: true, audio: true}
).then(function(mediaStream){
    var audioSource = mediaStream.getAudioTracks()[0];
    var videoSource = mediaStream.getVideoTracks()[0];
    rtc.localStream = WebRTC2.createStream({
        video: true,
        audio: true,
        audioSource: videoSource,
        videoSource: videoSource
    });
    rtc.localStream.init()
});
×

反馈成功

非常感谢您的反馈,我们会继续努力做得更好。