虚拟背景

更新时间: 2023/10/19 08:03:41

NERoom SDK 通过人像分割技术,自动识别用户人像,虚化用户周围的真实环境,或者以指定颜色的图片或自定义图像替代真实背景,从而实现设置虚拟背景。在音视频会议或教育场景中,虚拟背景不仅可以保护与会者的隐私,还可以作为主题宣传的背景墙。

功能原理

NERoom SDK 支持的虚拟背景采用自研的深度学习算法,在对当前视频帧做背景分割时利用前一帧的分割结果作为先验信息,同时在 video matting 中利用时序信息解决视频分割中可能出现的闪烁问题,提升分割效果,让您在使用虚拟背景的同时也能享受优质的视频通话体验。

注意事项

  • 建议您在满足以下条件的场景中使用虚拟背景功能:

    • 采用高清摄像设备,避免遮挡摄像头且环境光线均匀。
    • 捕获的视频场景中无冗余物件,用户人像尽量保持上半身在画面内且基本无遮挡。
    • 背景色单一且尽量不与用户着装颜色相同。
  • 开启虚拟背景对手机的性能有一定的要求,为了确保视频的清晰度和流畅度,强烈建议在 GPU 为 A13(例如 iPhone11 pro) 及以上的机型中开启虚拟背景。

  • 若您设置背景图片为自定义本地图片,SDK 会在保证背景图片内容不变形的前提下,对图片进行一定程度上的缩放和裁剪,以适配视频采集分辨率。

  • 暂不支持在 Texture 格式的视频或通过 Push 方法从自定义视频源获取的视频中设置虚拟背景。

配置步骤

  1. 调用addPreviewRoomListener接口,添加预览房间事件监听。

  2. 在成功加入房间后调用 unmuteMyVideo 方法开启本地视频采集。

  3. 调用 enableVirtualBackground 方法开启虚拟背景功能。

    调用该方法时,您需要设置 enabled 参数为 true 开启虚拟背景功能,并设置 backgroundSource参数自定义背景图片的类型。

    场景 配置步骤
    设置背景图片为纯色图片(默认) 1. 设置 backgroundSourceType 参数为 NERoomVirtualBackgroundSourceTypeColor
    2. 设置 color 参数自定义图片颜色,该参数的取值范围为 0x000000 ~ 0xFFFFFF,默认值为 0xFFFFFF,即白色。
    • 纯色图片的格式为 RGB 定义的十六进制整数,不带 # 号。
    • 若 color 值设置无效,SDK 会将背景图片设置为白色图片。
    设置背景图片为自定义本地图片 1. 设置 backgroundSourceType 参数为 NERoomVirtualBackgroundSourceTypeImage
    2. 设置 source 参数为自定义背景图片的本地绝对路径。自定义背景图片仅支持 JPG 和 PNG 格式。
    设置背景虚化 1. 设置 backgroundSourceType 参数为 NERoomVirtualBackgroundSourceTypeBlur
    2. 设置 blurDegree 参数指定虚化程度,具体枚举值如下:
    • 虚化程度低:NERoomBlurDegreeLow(1)。
    • 虚化程度中:NERoomBlurDegreeMedium(2)。
    • 虚化程度高:NERoomBlurDegreeHigh(3)。
  4. 启用该方法后,SDK 会触发虚拟背景启用成功与否的 onRtcVirtualBackgroundSourceEnabled回调。

  5. 若您需要取消虚拟背景,请调用 enableVirtualBackground方法,设置 enabled 参数为 false,关闭虚拟背景功能。

示例代码

以设置虚拟背景为自定义本地图片为例。

    // 房间外预览
    let params =  NEPreviewRoomParams()
    let options = NEPreviewRoomOptions()
    NERoomKit.shared.roomService.previewRoom(params, options: options) { [weak self] code, str, previewRoomContext in
        guard let self = self, let context = previewRoomContext else { return }
        context.addPreviewRoomListener(self)

        let source = NERoomVirtualBackgroundSource()
        source.backgroundSourceType = .image
        source.source = "图片绝对路径"
        let code = context.previewController.enableVirtualBackground(enable: true, backgroundSource: )
        if code == 0 {
            print("虚拟背景开启")
        }
        let canvas = NERoomVideoView()
        canvas.container = xxx
        context.previewController.startPreview(canvas: )
    }


    // 2. 房间内开启虚拟背景
    let context = NERoomKit.shared.roomService.getRoomContext(roomUuid: "房间Id")
    context.addRoomListener(listener: self)
    let source = NERoomVirtualBackgroundSource()
    source.backgroundSourceType = .image
    source.source = "图片绝对路径"
    let code = context.rtcController.enableVirtualBackground(enable: true, backgroundSource: )
    if code == 0 {
        print("虚拟背景开启")
    }
    context.rtcController.unmuteMyVideo()

    /** 
    开启视频 会触发 NEPreviewRoomListener协议的 方法
    reason对应的描述:
    0:  虚拟背景开启成功
    1:自定义背景图片不存在
    2:自定义背景图片的图片格式无效
    3:自定义背景图片的颜色格式无效
    4:该设备不支持使用虚拟背景
    */
    func onRtcVirtualBackgroundSourceEnabled(enable: Bool, reason: Int) {
    }

API 参考

方法 功能描述
enableVirtualBackground 开启或关闭虚拟背景。
onRtcVirtualBackgroundSourceEnabled 是否成功启用虚拟背景的回调通知。
此文档是否对你有帮助?
有帮助
去反馈
  • 功能原理
  • 注意事项
  • 配置步骤
  • 示例代码
  • API 参考