切换大小屏
简介
请先查看 快速接入 了解音视频通话的基本操作逻辑后,再查看本文。
在音视频通话过程中,通常涉及不同用户的界面切换,以一个点对点的音视频通话为例,常见的显示方式例如:
- 启动应用后,大画面显示自己的画面;
- 其他用户加入后,将对方显示到大画面,将自己的画面切换到右上角的小画面;
- 可以点击画面,将自己和对方的画面位置互换。
相应的应用逻辑例如:
- 自己先加入频道,加入前不进行本地预览,直接加入频道;
加入频道成功后,开始发送本地视频,发送成功后显示本地画面到大画面。 - 对方后加入频道,对方加入后把本地画面切换到右上角的小画面;
对方开启视频后,按大画面订阅其视频,收到视频后,显示到大画面。 - 点击自己的小画面后,将自己的画面切换到大画面;
同时按照小画面重新订阅对方视频以节约流量和性能,收到视频后,显示到小画面;
再次点击小画面,则再次互换。
针对以上场景,我们结合各端 SDK 接口介绍如何实现:
Windows (C++)
请先查看 页面顶部 假设的应用逻辑,以下内容基于该假设。
假设大画面是一个名为 largeView 的充满全屏的 UI 视图,小画面是一个名为 smallView 的宽90、高160的 UI 视图。
环节1:大画面显示自己的画面
- 自己调用
joinChannel方法加入频道; - 加入频道会收到
onChannelJoinConfirm通知,其中QResult为OK表示加入成功; - 加入成功后调用
startVideo方法,window参数(渲染窗口)传入largeView来显示自己的画面。
环节2:大画面显示对方的画面
- 对方加入频道会触发
onUserJoinIndication通知,会返回对方的userId,此时调用startVideo方法,window参数传入smallView将自己的画面切换到小画面显示; - 对方开启视频后会触发
onUserVideoStart通知,会返回对方的userId和最高视频档位maxProfile,此时调用subscribeVideo方法订阅其视频,window参数传入largeView来显示对方的画面,config参数的profileType属性设置为对方的maxProfile。
环节3:切换双方画面
- 当点击自己的小画面时,先调用
startVideo方法,window参数传入largeView将自己的画面切换到大画面; - 再调用
subscribeVideo方法重新订阅对方视频(不需要先取消订阅),userId参数传入对方账号,window参数传入smallView将对方画面设置到小画面显示,config参数的profileType属性设置为Low;
同理,如果再次点击小画面:
- 先调用
startVideo方法,window参数传入smallView将自己的画面切换到小画面; - 再调用
subscribeVideo方法重新订阅对方视频(不需要先取消订阅),userId参数传入对方账号,window参数传入largeView将对方画面设置到大画面显示,config参数的profileType属性设置为对方的maxProfile。
iOS (Objective-C)
请先查看 页面顶部 假设的应用逻辑,以下内容基于该假设。
假设大画面是一个名为 largeView 的充满全屏的 UIView,小画面是一个名为 smallView 的宽90、高160的 UIView。
环节1:大画面显示自己的画面
- 自己调用
- joinChannelWithToken:channelId:userId:config:方法加入频道; - 加入频道会收到
- onChannelJoinConfirm:通知,其中PanoResult为kPanoResultOK表示加入成功; - 加入成功后调用
- startVideoWithView:config:方法,view参数传入largeView来显示自己的画面。
环节2:大画面显示对方的画面
- 对方加入频道会触发
- onUserJoinIndication:withName:通知,会返回对方的userId,此时调用- startVideoWithView:config:方法,view参数传入smallView将自己的画面切换到小画面显示; - 对方开启视频后会触发
- onUserVideoStart:withMaxProfile:通知,会返回对方的userId和最高视频档位maxProfile,此时调用- subscribeVideo:withView:config:方法订阅其视频,view参数传入largeView来显示对方的画面,config参数的profileType属性设置为对方的maxProfile。
环节3:切换双方画面
- 当点击自己的小画面时,先调用
- startVideoWithView:config:方法,view参数传入largeView将自己的画面切换到大画面; - 再调用
- subscribeVideo:withView:config:方法重新订阅对方视频(不需要先取消订阅),userId参数传入对方账号,view参数传入smallView将对方画面设置到小画面显示,config参数的profileType属性设置为kPanoProfileLow;
同理,如果再次点击小画面:
- 先调用
- startVideoWithView:config:方法,view参数传入smallView将自己的画面切换到小画面; - 再调用
- subscribeVideo:withView:config:方法重新订阅对方视频(不需要先取消订阅),userId参数传入对方账号,view参数传入largeView将对方画面设置到大画面显示,config参数的profileType属性设置为对方的maxProfile。
Android (Java)
请先查看 页面顶部 假设的应用逻辑,以下内容基于该假设。
Android SDK 使用的画布类型为 com.pano.rtc.api.RtcView,可以动态创建,也可以通过 XML 文件静态配置。
RtcView外面必须包裹一层Layout(建议使用ConstraintLayout),而且RtcView自身宽高需要设置为wrap_content。- 更多详细信息,可以 点此查看。
假设大画面名为 large_view,其父级 Layout 充满全屏;小画面名为 small_view,其父级 Layout 宽90dp、高160dp。
环节1:大画面显示自己的画面
- 自己调用
joinChannel方法 加入频道; - 加入频道会收到
onChannelJoinConfirm通知,其中result为OK表示加入成功; - 加入成功后调用
setLocalVideoRender方法传入large_view来设置本地画布; - 再调用
startVideo方法开启视频,即可通过large_view显示自己的画面。
环节2:大画面显示对方的画面
- 对方加入频道会触发
onUserJoinIndication通知,此时调用setLocalVideoRender方法传入small_view将自己的画面切换到小画面。 - 对方开启视频会触发
onUserVideoStart通知,其中返回对方的userId和最高视频档位maxProfile; - 此时调用
setRemoteVideoRender方法传入对方的userId和large_view设置将对方画面显示到大画面; - 然后调用
subscribeVideo方法传入对方的userId和maxProfile来订阅其视频。
环节3:切换双方画面
- 当点击自己的小画面时,先调用
setLocalVideoRender传入large_view将自己的画面切换到大画面; - 再调用
setRemoteVideoRender方法传入对方的userId和small_view将对方的画面切换到小画面; - 最后调用
subscribeVideo方法(不需要先取消订阅)传入对方的userId,profileType设置为Low来订阅对方的小画面。
同理,如果再次点击小画面:
- 先调用
setLocalVideoRender传入small_view将自己的画面切换到小画面; - 再调用
setRemoteVideoRender方法传入对方的userId和large_view将对方的画面切换到大画面; - 最后调用
subscribeVideo方法(不需要先取消订阅)传入对方的userId,profileType设置为对方的maxProfile来订阅对方的大画面。
Web
请先查看 页面顶部 假设的应用逻辑,以下内容基于该假设。
假设大画面是一个名为 largeView 的 DIV(宽1280px,高720px),小画面是一个名为 smallView 的 DIV(宽320px,高180px),所有回调信息使用 data 参数接收。
环节1:大画面显示自己的画面
- 自己调用
joinChannel方法加入频道; - 加入频道会收到
joinChannelConfirm通知,其中result为'success'表示加入成功; - 加入成功后调用
startVideo()方法发送本地视频,发送成功后会触发getLocalVideo通知,通过appendChild方法将返回的data.data.videoTag添加到largeView中。
环节2:大画面显示对方的画面
- 对方加入频道会触发
userJoin通知,此时将自己的画面从largeView中移除并添加到smallView中,设置自己的画面宽高,例如通过videoTag.setAttribute('style', 'width: 100%; height: 100%;');设置自己画面的videoTag适应容器的宽高。 - 对方开启视频会触发
userVideoStart通知,其中data.userId返回对方账号,此时调用subscribeVideo方法订阅其视频,quality参数设置为PanoRtc.Constants.VideoProfileType.HD720P,userId参数设置为对方账号; - 订阅成功后,会触发
userVideoReceived通知,此时通过userVideoReceived通知返回的data.data.videoTag获取对方的视频并添加到largeView中。
环节3:切换双方画面
- 点击自己的小画面时,先将
largeView置空,然后将自己的画面从smallView中移除并添加到largeView中,设置自己的画面宽高适应容器宽高; - 重新调用
subscribeVideo方法订阅对方视频(不需要先取消订阅),quality参数设置为PanoRtc.Constants.VideoProfileType.Low表示180P; - 重新订阅后,对方视频的
videoTag分辨率会自动发生变化,将其添加到smallView中即可。
同理,如果再次点击小画面:
- 先将
smallView置空,然后将自己的画面从largeView中移除并添加到smallView中,设置自己的画面宽高适应容器宽高; - 重新调用
subscribeVideo方法订阅对方视频(不需要先取消订阅),quality参数设置为PanoRtc.Constants.VideoProfileType.HD720P; - 重新订阅后,对方视频的
videoTag分辨率会自动发生变化,将其添加到largeView中即可。
