多窗口渲染
简介
某些应用场景下,开发者需要将同一个视频画面渲染到不同的窗口中。Pano SDK 支持多窗口渲染。
各端 SDK 相关接口,请查看下列介绍:
Windows (C++)
SDK处理渲染
如果需要SDK处理多窗口渲染,首先,在调用以下接口时,将 window
参数传空(nullptr
):
- 发送本地视频:
RtcEngine
的startVideo(void *window, const VideoConfig &config)
- 订阅其他用户的视频:
RtcEngine
的subscribeVideo(uint64_t userId, void *window, const VideoConfig &config)
- (多路视频场景)发送本地视频:
VideoStreamManager
的startVideo(int streamId, void *window, const VideoConfig &config)
- (多路视频场景)订阅其他用户的视频:
VideoStreamManager
的subscribeVideo(uint64_t userId, int streamId, void *window, const VideoConfig &config)
然后,通过 RtcEngine
对象的 getVideoRenderManager
方法获取视频渲染管理器(VideoRenderManager
)。
- 通过其
bindRender(uint64_t userId, int streamId, void *window, const RenderConfig &config)
方法为指定的视频流添加渲染窗口 - 通过其
unbindRender(uint64_t userId, int streamId, void *window)
方法移除指定视频流的渲染窗口 - 通过其
updateRenderConfig(uint64_t userId, int streamId, void *window, const RenderConfig &config)
方法更改视频渲染设置
注意:默认的
streamId
为0
。所以,如果开发者没有多路视频场景,调用bindRender
、unbindRender
、updateRenderConfig
方法时,请将streamId
传入0
。
应用层自行渲染
如果需要应用层自行处理多窗口渲染,请通过以下接口设置视频数据接收槽(RtcRenderSink
),通过其 onRenderData (void *buffer, int length, MediaFormat &fmt)
回调接收视频渲染数据(YUV I420),请注意根据回调的 VideoFormat
进行处理:
- 发送本地视频:
RtcEngine
的startVideo(RtcRenderSink *sink, VideoProfileType profileType)
- 订阅其他用户的视频:
RtcEngine
的subscribeVideo(uint64_t userId, RtcRenderSink *sink, VideoProfileType profileType)
- (多路视频场景)发送本地视频:
VideoStreamManager
的startVideo(int streamId, RtcRenderSink *sink, VideoProfileType profileType)
- (多路视频场景)订阅其他用户的视频:
VideoStreamManager
的subscribeVideo(uint64_t userId, int streamId, RtcRenderSink *sink, VideoProfileType profileType)
macOS/iOS (Objective-C)
SDK处理渲染
如果需要SDK处理多窗口渲染,首先,在调用以下接口时,将 view
参数传空(nil
):
- 发送本地视频:
PanoRtcEngineKit
的- startVideoWithView:config:
- 订阅其他用户的视频:
PanoRtcEngineKit
的- subscribeVideo:withView:config:
- (多路视频场景)发送本地视频:
PanoRtcVideoStreamManager
的- startVideo:view:config:
- (多路视频场景)订阅其他用户的视频:
PanoRtcVideoStreamManager
的- subscribeVideo:stream:view:config:
然后,通过 PanoRtcEngineKit
对象的 videoRenderManager
属性获取视频渲染管理器(PanoRtcVideoRenderManager
)。
- 通过其
- bindRender:streamId:view:config:
方法为指定的视频流添加渲染窗口 - 通过其
- unbindRender:streamId:view:
方法移除指定视频流的渲染窗口 - 通过其
- updateRenderConfig:streamId:view:config:
方法更改视频渲染设置
注意:默认的
streamId
为0
。所以,如果开发者没有多路视频场景,调用bindRender
、unbindRender
、updateRenderConfig
方法时,请将streamId
传入0
。
应用层自行渲染
如果需要应用层自行处理多窗口渲染,请通过以下接口设置PanoRtcRenderDelegate
,通过其 - onRenderVideoData:withLength:format:timestamp:
回调接收视频渲染数据(YUV I420),请注意根据回调的 PanoRtcVideoFormat
进行处理:
- 发送本地视频:
PanoRtcEngineKit
的- startVideoWithDelegate:profile:
- 订阅其他用户的视频:
PanoRtcEngineKit
的- subscribeVideo:withDelegate:profile:
- (多路视频场景)发送本地视频:
PanoRtcVideoStreamManager
的- startVideo:delegate:profile:
- (多路视频场景)订阅其他用户的视频:
PanoRtcVideoStreamManager
的- subscribeVideo:stream:delegate:profile:
Web
开发者可以自定义多个 <video>
元素,当收到以下回调返回的 videoTag
时:
- 发送本地视频成功的通知:
getLocalVideo
- 收到其他用户视频的通知:
userVideoReceived
将回调的 videoTag
的 srcObject
属性传递给自定义 <video>
元素的 srcObject
属性,例如:
myVideo1.srcObject = videoTag.srcObject
myVideo2.srcObject = videoTag.srcObject