自定义视频采集
功能描述
自定义视频采集的功能指的是由开发者自定义向 NERTC SDK 提供自定义的视频输入源数据,并由 NERTC SDK 进行编码推流的功能。 实时音视频传输过程中,NERTC SDK 在以下场景中,开发者可能会发现默认的视频模块无法满足开发需求:
- app 中已有自己的视频模块。
- 希望使用非 Camera采集的视频源,例如本地视频文件播放、屏幕分享、游戏直播等。
- 需要使用自定义的美颜库有或前处理库。
- 某些视频采集设备被系统独占。为避免与其它业务产生冲突,需要灵活的设备管理策略。例如,直播到过程中需要录制短视频。
基于以上场景,NERTC SDK 支持开发者使用自定义的视频源,以实现业务场景中的相关需求。本文将介绍如何实现自定义视频采集功能。
Android
实现方法
自定义视频采集
NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。其中:
- Push 方式下,SDK 会根据设置的视频 Profile 对数据源进行裁剪或缩放,来达到发送目标分辨率,同时视频的帧率由数据源自身控制
Push 方式
参考如下步骤,在你的项目中使用 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); //开启视频推流
}
}
同时我们的 SDK demo中提供了自定义视频采集的示例代码,您可以前往下载参考使用
API参考
方法 | 功能描述 |
---|---|
enableLocalVideo | 开启/关闭本地视频采集以及发送 |
setExternalVideoSource | 是否使用外部视频源(请在调用 enableVideo 或 startPreview 之前调用此 API) |
pushExternalVideoFrame | 推送外部视频帧该方法主动将视频帧数据用 NERtcVideoFrame 类封装后传递给 SDK |
NERtcVideoFrame | 视频数据格式 |
开发注意事项
自定义视频采集和渲染场景中,需要开发者具有采集或渲染视频的能力:
自定义视频采集场景中,你需要自行管理视频数据的采集和处理。
iOS
实现方法
自定义视频采集
NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。其中:
Push 方式下,SDK 会根据设置的视频 Profile 对数据源进行裁剪或缩放,来达到发送目标分辨率,同时视频的帧率由数据源自身控制。
Push 方式
参考如下步骤,在你的项目中使用 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]; // 推送自定义数据
API参考
方法 | 功能描述 |
---|---|
setExternalVideoSource: | 配置外部视频源 |
pushExternalVideoFrame: | 推送外部视频帧 |
开发注意事项
- 自定义视频采集和渲染场景中,需要开发者具有采集或渲染视频的能力;
- 自定义视频采集场景中,你需要自行管理视频数据的采集和处理;
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); //设置选择的设备
同时我们的 SDK demo中提供了自定义视频采集的示例代码,您可以前往下载参考使用
API参考
方法 | 功能描述 |
---|---|
setDevice | 设置视频设备 |
setExternalVideoSource | 开启或关闭外部视频源数据输入 |
enableLocalVideo | 开启或关闭本地视频采集和渲染 |
pushExternalVideoFrame | 推送外部视频源数据输入 |
开发注意事项
- 自定义视频采集和渲染场景中,需要开发者具有采集或渲染视频的能力,开发者需要自行管理视频数据的采集和处理。
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()
});


此文档对你是否有帮助

