Skip to main content
SDK 2.0.0. Desktop differs from mobile: TRTC / Agora on Windows usually deliver CPU buffers (I420 / YUV), not OpenGL textureId. Hook Facebetter in the vendor’s custom preprocess callback, run ImageFrame::CreateWithI420 (or NV12) → ProcessImage, then write planes back. Shares the same C++ API as Linux. Basics: Implement Beauty. Room join / publish belong in the vendor’s docs.

Shared contract

Shared: process I420 and write planes back

Create the engine:
Credentials: Subscription, Auth & License.

TRTC (Tencent)

Windows / desktop C++: custom preprocess uses Buffer, not Texture. Newer SDKs use enableLocalVideoCustomProcess + setLocalVideoCustomProcessCallback (older setLocalVideoProcessCallback is deprecated — check your version). Use pixel format I420 and buffer type Buffer. In onProcessVideoFrame, process srcFrame and fill dstFrame.
Tencent docs: mobile can use Texture; PC supports Buffer only. Do not follow the Android Texture_2D path on Windows.

Agora

Hook: IRtcEngine::registerVideoFrameObserver (C++ Video SDK 4.x). Windows typically yields YUV420 / I420.
  1. Return PROCESS_MODE_READ_WRITE from getVideoFrameProcessMode
  2. In onCaptureVideoFrame, run ProcessI420InPlace on yBuffer / uBuffer / vBuffer
  3. Return true so the SDK keeps the frame
Unregister before destroying IRtcEngine, then engine.reset().

LiveKit

On desktop, the usual pattern is a custom video source: capture / process yourself, then push frames into LiveKit (C++ client or your bridge) — not the mobile VideoProcessor texture callback. Recommended pipeline:
  1. Capture frames (camera / DXGI / etc.)
  2. CreateWithI420 / CreateWithRGBAProcessImage
  3. Wrap the output as a LiveKit / WebRTC frame and push into VideoSource / RTCVideoSource
Exact type names vary by LiveKit client version — see LiveKit docs for custom tracks. Facebetter only covers step 2.

Troubleshooting