互动直播 2.0
自定义视频采集
更新时间: 2022/09/08 22:56:57
NERTC SDK 提供自定义视频采集功能,帮助您向 SDK 提供自定义的视频输入源数据,并由 SDK 进行编码推流。本文档为您介绍如何通过 setExternalVideoSource
和 pushExternalVideoFrame
方法实现自定义视频采集功能。
功能描述
一般情况下,App 采用默认设备采集视频数据,通常是本设备的摄像头模块。但在部分场景下可能需要使用自定义的视频源,例如:
- 由第三方美颜 SDK 负责视频数据采集和视频数据的前处理,NERTC 负责视频数据编码和云端推流。
- 某些视频采集设备被系统独占。为避免与其它业务产生冲突,需要灵活的设备管理策略。例如,直播过程中需要录制短视频。
- 需要使用外部视频源,即非摄像头采集的数据,例如播放本地视频文件、屏幕共享、游戏直播等。
基于以上场景,NERTC SDK 支持使用自定义的视频源,以实现您在实际业务场景中的相关需求。
注意事项
自定义视频采集场景中,您需要自行管理视频数据的采集和处理。
实现方法
NERTC SDK 目前提供 Push 数据源的方式实现自定义的视频源。Push 方式下,SDK 会根据设置的视频 Profile 对数据源进行裁剪或缩放,来达到发送目标分辨率,同时视频的帧率由数据源自身控制。
参考如下步骤,在您的项目中通过 Push 方式实现自定义视频源功能:
- 调用
setExternalVideoSource
方法开启外部视频源数据输入;调用此方法时,您需要设置enable
参数为true
,并设置streamType
为kNERtcVideoStreamTypeMain
(主流) 或kNERtcVideoStreamTypeSub
(辅流)。 - 调用
enableLocalVideo
方法开启本地视频采集;调用此方法时,您需要设置enable
参数为true
,并设置streamType
为kNERtcVideoStreamTypeMain
(主流) 或kNERtcVideoStreamTypeSub
(辅流)。 - 指定外部采集设备后,您需要自行管理视频数据采集和处理。
- 完成视频数据处理后,请再调用
pushExternalVideoFrame
方法将视频数据发送给 SDK 进行后续操作;调用此方法时,您需要通过frame
参数传入外部视频帧的数据信息,并设置streamType
为kNERtcVideoStreamTypeMain
(主流) 或kNERtcVideoStreamTypeSub
(辅流)。- 外部视频源数据的输入通道、本地视频采集通道与外部视频源数据的推送通道必须同为主流或者辅流通道,否则 SDK 会报错。
- 为满足实际使用需求,您可以在将视频数据发送回 SDK 前,通过 NERtcVideoFrame 修改视频数据。比如,设置 rotation 为 180,使视频帧顺时针旋转 180 度。
示例代码
//以开启主流外部视频输入为例
NERtcEx.getInstance().setExternalVideoSource(true,kNERtcVideoStreamTypeMain); //设置使用自定义数据源
NERtcEx.getInstance().enableLocalVideo(true,kNERtcVideoStreamTypeMain)//开始视频
NERtcEx.getInstance().pushExternalVideoFrame(videoFrame,kNERtcVideoStreamTypeMain); //推送自定义数据
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); //开启视频推流
}
}
API 参考
方法 | 功能描述 |
---|---|
enableLocalVideo |
开启或关闭本地视频采集。 |
setExternalVideoSource |
开启外部视频源数据输入。 |
pushExternalVideoFrame |
推送外部视频数据帧。 |
此文档是否对你有帮助?
有帮助
我要吐槽