自定义视频采集
更新时间: 2024/09/18 16:26:13
NERTC SDK 提供自定义视频采集功能,帮助您向 SDK 提供自定义的视频输入源数据,并由 SDK 进行编码推流。本文档为您介绍如何通过 SetExternalVideoSource
和 PushExternalVideoFrame
方法实现自定义视频采集功能。
功能描述
一般情况下,App 采用默认设备采集视频数据,通常是本设备的摄像头模块。但在部分场景下可能需要使用自定义的视频源,例如:
- 由第三方美颜 SDK 负责视频数据采集和视频数据的前处理,NERTC 负责视频数据编码和云端推流。
- 某些视频采集设备被系统独占。为避免与其它业务产生冲突,需要灵活的设备管理策略。例如,直播过程中需要录制短视频。
- 需要使用外部视频源,即非摄像头采集的数据,例如播放本地视频文件、屏幕共享、游戏直播等。
基于以上场景,NERTC SDK 支持使用自定义的视频源,以实现您在实际业务场景中的相关需求。
注意事项
自定义视频采集场景中,您需要自行管理视频数据的采集和处理。
配置步骤
NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。Push 方式下,SDK 会根据设置的视频 Profile 对数据源进行裁剪或缩放,来达到发送目标分辨率,同时视频的帧率由数据源自身控制。
参考如下步骤,在您的项目中通过 Push 方式实现自定义视频源功能:
- 调用
SetExternalVideoSource
方法,设置enabled
参数为true
开启外部视频源数据输入。 - 调用
EnableLocalVideo
方法,设置enabled
参数为true
开启本地视频采集。如果已经开启了本地视频采集,会自动切换到外部设备采集,不需要再次调用
EnableLocalVideo
方法。 - 指定外部采集设备后,您需要自行管理视频数据采集和处理。
- 完成视频数据处理后,请再调用
PushExternalVideoFrame
方法,通过frame
参数传入外部视频帧的数据信息,将视频数据发送给 SDK 进行后续操作。为满足实际使用需求,您可以在将视频数据发送回 SDK 前,通过
RtcExternalVideoFrame
修改视频数据。比如,设置rotation
为 180,使视频帧顺时针旋转 180 度。
示例代码
C++//开始外部视频数据
private void setExternalVideoSource()
{
//开启外部视频输入
int result = rtcEngine.SetExternalVideoSource(true);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
//打开视频
rtcEngine.EnableLocalVideo(true);
}
private void pushExternalVideoFrame()
{
IntPtr buffer = IntPtr.Zero; //视频帧指针,需要传入实际数据
uint frameWidth = 0;//需要实际图片宽度
uint frameHeight = 0; //需要实际图片高度
RtcVideoRotation rotation = RtcVideoRotation.kNERtcVideoRotation0;//需要传入图像实际的旋转角度
ulong frameTimestamp = 0;//需要传入实际视频帧时间戳
var frame = new RtcExternalVideoFrame
{
format = RtcVideoType.kNERtcVideoTypeI420,//以I420为例
buffer = buffer,
width = frameWidth,
height = frameHeight,
timestamp = frameTimestamp,
rotation = rotation
};
int result = rtcEngine.PushExternalVideoFrame(frame);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
//失败
}
}
API 参考
方法 | 功能描述 |
---|---|
SetDevice |
指定特定外部视频采集设备 |
EnableLocalVideo |
开启或关闭本地视频采集 |
SetExternalVideoSource |
开启外部视频源数据输入 |
PushExternalVideoFrame |
推送外部视频数据帧 |
此文档是否对你有帮助?