For the complete documentation index, see llms.txt. This page is also available as Markdown.

自定义帧源

实现 IVisionFrameSource,将自定义视频管线发布到 Convai,包括 Y 翻转要求、生命周期状态模式和自动发现规则。

实现 IVisionFrameSource 要发布任何自定义视频管线——视频文件、自定义渲染纹理或屏幕捕获工具——而无需修改发布层。一旦你的组件出现在场景中, ConvaiVisionPublisher 就会自动发现并开始流式传输。

接口契约

IVisionFrameSource 是通过以下方式进行视频流传输所需的最小契约 ConvaiVisionPublisher 以及通过以下方式进行实时画面显示 VisionDebugPreview.

public interface IVisionFrameSource
{
    bool IsCapturing { get; }
    long FrameCount { get; }
    (int Width, int Height) FrameDimensions { get; }
    float TargetFrameRate { get; }
    string SourceId { get; }
    RenderTexture CurrentRenderTexture { get; }
    bool IsFrameReady { get; }
    event Action FrameReady;
    void StartCapture();
    void StopCapture();
}

你的实现必须是一个 MonoBehaviour. ConvaiVisionPublisher 使用以下方式发现帧源 GetComponent 是位于 GetComponentsInChildren,而它们只能用于 Unity 组件。

Y 轴翻转要求

CurrentRenderTexture 必须为 自上而下的方向 (Y 轴相对于 Unity 默认的自下而上进行了翻转)。LiveKit 和标准视频格式都期望图像顶部的 Y=0。跳过这一步会导致接收端画面上下颠倒。

使用以下方式应用翻转: Graphics.Blit 调用,在将你的源纹理写入输出时 RenderTexture:

scale.y = -1 是位于 offset.y = 1 这两个参数合在一起会翻转垂直轴。将 _outputRtCurrentRenderTexture.

最小实现

以下骨架实现了所有必需成员,并正确处理了 FrameReady 。请将 CaptureFrame 方法填入你的实际捕获逻辑。

FrameReady 必须在 Unity 主线程. ConvaiVisionPublisher 是位于 VisionDebugPreview 都假设所有 IVisionFrameSource 回调都在主线程执行。如果你的捕获逻辑运行在后台线程上,请使用在 中检查的标志将事件触发切回主线程, Update如上面的骨架所示。

公开生命周期状态

实现 IVisionFrameSourceStatusProvider 以及 IVisionFrameSource ,以公开更丰富的生命周期状态——权限流程、延迟初始化或结构化错误信息。这样发布器就可以在不轮询的情况下响应就绪状态的变化。

自动发现

一旦你的组件出现在场景中, ConvaiVisionPublisher 会按以下顺序自动发现它:

  1. 来源 Inspector 中的字段(显式赋值)。

  2. GetComponent<CameraVisionFrameSource>() 在同一个 GameObject 上(内置优先级)。

  3. GetComponentsInChildren<MonoBehaviour>(true) ——首先是在 IVisionFrameSource 在同一个 GameObject 或子对象上找到的。

如果在步骤 3 中找到多个帧源,发布器会记录警告并选择第一个。显式分配 来源 字段以避免歧义。

下一步

Vision 调试预览Vision 脚本 API

最后更新于

这有帮助吗?