自定义视频采集
自定义视频采集的功能指的是由开发者自定义向 NERTC SDK 提供自定义的视频输入源数据,并由 NERTC SDK 进行编码推流的功能。
功能描述
一般情况下,App 采用默认设备采集视频数据,通常是本设备的摄像头模块。但在部分场景下可能需要使用自定义的视频源,例如:
- 由第三方美颜 SDK 负责视频数据采集和视频数据的前处理,NERTC 负责视频数据编码和云端推流。
- 某些视频采集设备被系统独占。为避免与其它业务产生冲突,需要灵活的设备管理策略。例如,直播到过程中需要录制短视频。
- 需要使用外部视频源,即非摄像头采集的数据,例如播放本地视频文件、屏幕共享、游戏直播等。
基于以上场景,NERTC SDK 支持开发者使用自定义的视频源,以实现业务场景中的相关需求。本文将介绍如何实现自定义视频采集功能。
Android
注意事项
自定义视频采集场景中,您需要自行管理视频数据的采集和处理。
实现方法
NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。Push 方式下,SDK 会根据设置的视频 Profile 对数据源进行裁剪或缩放,来达到发送目标分辨率,同时视频的帧率由数据源自身控制。
参考如下步骤,在您的项目中通过 Push 方式实现自定义视频源功能:
- 在 enableLocalVideo 前通过调用 setExternalVideoSource 指定外部视频采集设备。
- 指定外部采集设备后,开发者自行管理视频数据采集和处理。
完成视频数据处理后,再通过 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 方式实现自定义视频源功能:
- 在
enableVideo
前通过调用 setExternalVideoSource: 指定外部视频采集设备。 - 指定外部采集设备后,开发者自行管理视频数据采集和处理。
完成视频数据处理后,再通过 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 方式实现自定义视频源功能:
- 通过调用 setDevice 指定特定
kNERtcExternalVideoDeviceID
外部视频采集设备,并且需要调用 setExternalVideoSource 且设置为true,然后通过 enableLocalVideo 启动设备。 如果已经开启了摄像头采集,会自动切换到外部设备采集,不需要再次调用enableLocalVideo
。 - 指定外部采集设备后,开发者自行管理视频数据采集和处理。
完成视频数据处理后,再通过 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
自定义视频采集功能支持的数据源包括:
- 通过 navigator.mediaDevices.getUserMedia 接口获取的实时音视频数据。
- 本地或者云端的音视频文件。
- webAudio、canvas 生成的音视频数据源。
- 自定义美颜库或前处理库。
实现方法
参考如下步骤,在您的项目中实现自定义视频采集:
在创建音视频流 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()
});


此文档对你是否有帮助

