多窗口渲染
简介
某些应用场景下,开发者需要将同一个视频画面渲染到不同的窗口中。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
