自定义视频采集

功能描述

自定义视频采集的功能指的是由开发者自定义向 NERTC SDK 提供自定义的视频输入源数据,并由 NERTC SDK 进行编码推流的功能。 实时音视频传输过程中,NERTC SDK 在以下场景中,开发者可能会发现默认的视频模块无法满足开发需求:

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

Android

实现方法

自定义视频采集

NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。其中:

Push 方式

参考如下步骤,在你的项目中使用 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); //开启视频推流
    }
}

同时我们的 SDK demo中提供了自定义视频采集的示例代码,您可以前往下载参考使用

API参考

方法 功能描述
enableLocalVideo 开启/关闭本地视频采集以及发送
setExternalVideoSource 是否使用外部视频源(请在调用 enableVideo 或 startPreview 之前调用此 API)
pushExternalVideoFrame 推送外部视频帧该方法主动将视频帧数据用 NERtcVideoFrame 类封装后传递给 SDK
NERtcVideoFrame 视频数据格式

开发注意事项

iOS

实现方法

自定义视频采集

NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。其中:

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

Push 方式

参考如下步骤,在你的项目中使用 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]; // 推送自定义数据

API参考

方法 功能描述
setExternalVideoSource: 配置外部视频源
pushExternalVideoFrame: 推送外部视频帧

开发注意事项

  1. 自定义视频采集和渲染场景中,需要开发者具有采集或渲染视频的能力;
  2. 自定义视频采集场景中,你需要自行管理视频数据的采集和处理;

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); //设置选择的设备

同时我们的 SDK demo中提供了自定义视频采集的示例代码,您可以前往下载参考使用

API参考

方法 功能描述
setDevice 设置视频设备
setExternalVideoSource 开启或关闭外部视频源数据输入
enableLocalVideo 开启或关闭本地视频采集和渲染
pushExternalVideoFrame 推送外部视频源数据输入

开发注意事项

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()
});