互动直播 2.0
Android
动态与公告
更新日志(V4.6)
更新日志(V5)
活动与公告
【活动】内容安全检测限时补贴活动
新手接入指南
产品简介
产品介绍
功能特性
产品优势
应用场景
基本概念
使用限制
体验 Demo
下载 SDK 和 示例代码
升级指南
快速开始
接入流程
创建应用
开通服务
集成 SDK
实现互动直播
Token 鉴权
高级 Token 鉴权
基础功能
设置音频属性
设置视频属性
设置通话音量
屏幕共享
音频共享
监测发言者音量
通话中质量监测
进阶功能
音频管理
客户端音频录制
原始音频数据
美声变声与混响
耳返
自定义音频采集与渲染
音效与伴音
设置音频订阅优先级
音频裸流传输
视频管理
视频截图
水印
云信美颜
第三方美颜
自定义视频采集
视频图像畸变矫正
虚拟背景
视频裸流传输
设备管理
视频设备管理
音频设备管理
媒体补充增强信息
旁路推流
旁路推流
旁路推流画面布局
媒体流管理
跨房间媒体流转发
媒体流加密
视频流回退
AI 融合功能
AI 超分
AI 降噪
最佳实践
音视频参数配置推荐
客户端 API
Android API 参考
错误码
服务端 API
控制台指南
常见问题处理
FAQ
错题集
服务协议

自定义视频采集

更新时间: 2022/09/08 22:56:57

NERTC SDK 提供自定义视频采集功能,帮助您向 SDK 提供自定义的视频输入源数据,并由 SDK 进行编码推流。本文档为您介绍如何通过 setExternalVideoSourcepushExternalVideoFrame 方法实现自定义视频采集功能。

功能描述

一般情况下,App 采用默认设备采集视频数据,通常是本设备的摄像头模块。但在部分场景下可能需要使用自定义的视频源,例如:

  • 由第三方美颜 SDK 负责视频数据采集和视频数据的前处理,NERTC 负责视频数据编码和云端推流。
  • 某些视频采集设备被系统独占。为避免与其它业务产生冲突,需要灵活的设备管理策略。例如,直播过程中需要录制短视频。
  • 需要使用外部视频源,即非摄像头采集的数据,例如播放本地视频文件、屏幕共享、游戏直播等。

基于以上场景,NERTC SDK 支持使用自定义的视频源,以实现您在实际业务场景中的相关需求。

注意事项

自定义视频采集场景中,您需要自行管理视频数据的采集和处理。

实现方法

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

参考如下步骤,在您的项目中通过 Push 方式实现自定义视频源功能:

  1. 调用 setExternalVideoSource 方法开启外部视频源数据输入;调用此方法时,您需要设置 enable 参数为 true,并设置 streamTypekNERtcVideoStreamTypeMain(主流) 或 kNERtcVideoStreamTypeSub(辅流)。
  2. 调用 enableLocalVideo 方法开启本地视频采集;调用此方法时,您需要设置 enable 参数为 true,并设置 streamTypekNERtcVideoStreamTypeMain(主流) 或 kNERtcVideoStreamTypeSub(辅流)。
  3. 指定外部采集设备后,您需要自行管理视频数据采集和处理。
  4. 完成视频数据处理后,请再调用 pushExternalVideoFrame 方法将视频数据发送给 SDK 进行后续操作;调用此方法时,您需要通过 frame 参数传入外部视频帧的数据信息,并设置 streamTypekNERtcVideoStreamTypeMain(主流) 或 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 推送外部视频数据帧。
此文档是否对你有帮助?
有帮助
我要吐槽
  • 功能描述
  • 注意事项
  • 实现方法
  • 示例代码
  • API 参考