收发多路视频
简介
Pano SDK 支持同时发送多路视频,适用于一些特殊设备或特殊场景,例如:双师课堂、医学会诊、娃娃机,等。
注意:如果应用在同一时刻只需发送一路视频,例如,手机的前后置摄像头切换,则无需参考此文档。
各端 SDK 相关接口,请查看下列介绍:
Windows (C++)
获取视频采集设备及本地预览
请参考 快速接入 文档的章节:获取视频采集设备 和 本地预览。
如需收发多路视频,请忽略快速接入文档中的 操作视频 章节,改为根据本文档来操作视频。
获取视频流管理器及注册回调
通过 RtcEngine
实例的 getVideoStreamManager
方法获取视频流管理器(VideoStreamManager)。
通过 VideoStreamManager
实例的 setCallback
方法设置视频流管理器的回调。
完整的回调事件列表,请 点此查看。
创建视频流
- 通过
VideoStreamManager
实例的createVideoStream
方法创建视频流,该方法需要传入两个参数。deviceId
参数为设备ID,可以通过前述 获取视频采集设备 部分获取设备ID。streamId
创建成功后此参数返回相应的视频流ID。
- 通过
VideoStreamManager
实例的getCaptureDevice
方法获取当前视频流使用的采集设备,setCaptureDevice
方法更新视频流的采集设备。 - 通过
VideoStreamManager
实例的destroyVideoStream
方法销毁一个视频流。
发送视频流
- 通过
VideoStreamManager
实例的startVideo
方法发送视频流。
该方法有两个重载方法,参数类型不同,一个传入显示窗口和RenderConfig
,一个传入数据接收槽和VideoProfileType
。 - 通过
VideoStreamManager
实例的stopVideo
方法停止发送视频流。
其他用户开启视频流的通知
- 当其他用户通过
VideoStreamManager
发送视频流,会触发VideoStreamManager::Callback
的onUserVideoStart
通知。 - 当其他用户通过
VideoStreamManager
停止发送视频流,会触发VideoStreamManager::Callback
的onUserVideoStop
通知。
订阅其他用户的视频流
- 收到其他用户开启视频流的通知后,可以通过
VideoStreamManager
实例的subscribeVideo
方法订阅其视频流。
subscribeVideo
有两个重载方法,参数类型不同,一个传入显示窗口和VideoConfig
,一个传入数据接收槽和VideoProfileType
。 - 订阅其他用户的视频流后,会触发
VideoStreamManager::Callback
的onUserVideoSubscribe
通知,其中的result
参数表示订阅结果,Success
表示订阅成功。 - 通过
VideoStreamManager
实例的unsubscribeVideo
方法取消订阅视频流。
视频流首帧通知
当自己发送或收到其他用户视频流首帧时,会触发 VideoStreamManager::Callback
的 onFirstVideoFrameRendered
通知,其中返回 userId
和 streamId
。
macOS (Objective-C)
获取视频采集设备
通过 PanoRtcEngineKit
的 - enumerateDevices:
方法枚举设备,type
参数传入 kPanoDeviceVideoCamera
表示摄像设备。
将返回 PanoRtcDeviceInfo
数组,每个元素包含属性: deviceId
(设备ID)和 deviceName
(设备名称)。
本地预览
通过 PanoRtcEngineKit
的 - startPreview:withView:config:
或 - startPreview:withDelegate:profile:
方法开启视频预览。前者随带渲染视图,后者随带外置渲染器。
获取视频流管理器及注册回调
通过 PanoRtcEngineKit
实例的 - videoStreamManager
方法获取视频流管理器(PanoRtcVideoStreamManager)。
通过 PanoRtcVideoStreamManager
实例的 - setDelegate:
方法设置视频流管理器的回调对象。
完整的回调事件列表,请 点此查看。
创建视频流
- 通过
PanoRtcVideoStreamManager
实例的- createVideoStream:
方法创建视频流,该方法需要传入deviceId
参数(设备ID,可以通过前述 获取视频采集设备 部分获取),如果创建成功,将返回相应的视频流ID。 - 通过
PanoRtcVideoStreamManager
实例的- getCaptureDevice:
方法获取当前视频流使用的采集设备,- setCaptureDevice:stream:
方法更新视频流的采集设备。 - 通过
PanoRtcVideoStreamManager
实例的- destroyVideoStream:
方法销毁一个视频流。
发送视频流
- 通过
PanoRtcVideoStreamManager
实例的- startVideo:view:config:
或- startVideo:delegate:profile:
方法发送视频流。前者随带渲染视图,后者随带外置渲染器。 - 通过
PanoRtcVideoStreamManager
实例的- stopVideo:
方法停止发送视频流。
其他用户开启视频流的通知
- 当其他用户通过
PanoRtcVideoStreamManager
发送视频流,会触发PanoRtcVideoStreamDelegate
的- onUserVideoStart:stream:maxProfile:
通知。 - 当其他用户通过
PanoRtcVideoStreamManager
停止发送视频流,会触发PanoRtcVideoStreamDelegate
的- onUserVideoStop:stream:
通知。
订阅其他用户的视频流
- 收到其他用户开启视频流的通知后,可以通过
PanoRtcVideoStreamManager
实例的- subscribeVideo:stream:view:config:
或- subscribeVideo:stream:delegate:profile:
方法订阅其视频流。前者随带渲染视图,后者随带外置渲染器。 - 订阅其他用户的视频流后,会触发
PanoRtcVideoStreamDelegate
的- onUserVideoSubscribe:stream:result:
通知,其中的result
参数表示订阅结果,kPanoSubscribeSuccess
表示订阅成功。 - 通过
PanoRtcVideoStreamManager
实例的- unsubscribeVideo:stream:
方法取消订阅视频流。
视频流首帧通知
当自己发送或收到其他用户视频流首帧时,会触发 PanoRtcVideoStreamDelegate
的 - onFirstVideoFrameRendered:stream:
通知,其中返回 userId
和 streamId
。
iOS (Objective-C)
注意事项
iOS 需要 13+ 的系统版本,以及较新的硬件才支持前后摄像头同时采集,可以通过 PanoRtcEngineKit
实例的 - isMultiCameraCaptureSupported
方法判断是否支持。
获取视频采集设备
通过 PanoRtcEngineKit
实例的 - getCameraDeviceId:
方法获取设备 deviceId
。
其他环节
除了上述两个步骤外,iOS 收发多路视频的其他环节和 macOS 是一致的,请参考 macOS 相应小节的内容(从 本地预览 到 视频流首帧通知)。
Android (Java)
获取视频采集设备
通过 RtcEngine
实例的 getVideoDeviceManager
方法获取视频设备管理器(RtcVideoDeviceManager
),再通过其 getCaptureDeviceList
方法获取视频采集设备列表,将返回 RtcDeviceInfo
列表,每个元素包含属性: deviceId
(设备ID)和 deviceName
(设备名称)。
RtcDeviceInfo[] videoDevices = mRtcEngine.getVideoDeviceManager().getCaptureDeviceList();
还可以通过
RtcVideoDeviceManager
的setDeviceOrientation
方法设置视频设备的初始方位,setMirrorCorrection
方法设置视频设备的镜像纠正以满足特殊场景的需求。
获取视频流管理器及注册回调
通过 RtcEngine
实例的 getVideoStreamManager
方法获取视频流管理器(RtcVideoStreamManager)。
通过 RtcVideoStreamManager
实例的 setCallback
方法设置视频流管理器的回调。
完整的回调事件列表,请 点此查看。
创建视频流
- 通过
RtcVideoStreamManager
实例的createVideoStream
方法创建视频流,该方法需要传入deviceId
参数(设备ID,可以通过前述 获取视频采集设备 部分获取),如果创建成功,将返回相应的视频流ID。 - 通过
RtcVideoStreamManager
实例的getCaptureDevice
方法获取当前视频流使用的采集设备,setCaptureDevice
方法更新视频流的采集设备。 - 通过
RtcVideoStreamManager
实例的destroyVideoStream
方法销毁一个视频流。
发送视频流
- 通过
RtcVideoStreamManager
实例的startVideo
方法发送视频流,stopVideo
方法停止发送视频流。 - 通过
RtcVideoStreamManager
实例的setLocalVideoRender(int streamId, IVideoRender render)
方法设置本地用户的视频画布。
关于视频画布
render
的用法示例,请 点此查看。
其他用户开启视频流的通知
- 当其他用户通过
RtcVideoStreamManager
发送视频流,会触发RtcVideoStreamManager::Callback
的onUserVideoStart
通知。 - 当其他用户通过
RtcVideoStreamManager
停止发送视频流,会触发RtcVideoStreamManager::Callback
的onUserVideoStop
通知。
订阅其他用户的视频流
- 收到其他用户开启视频流的通知后,可以通过
RtcVideoStreamManager
实例的subscribeVideo
方法订阅其视频流,unsubscribeVideo
方法取消订阅视频流。 - 通过
RtcVideoStreamManager
实例的setRemoteVideoRender
方法设置远端用户的视频画布。
视频流首帧通知
当自己发送或收到其他用户视频流首帧时,会触发 RtcVideoStreamManager.Callback
的 onFirstVideoFrameRendered
通知,其中返回 userId
和 streamId
。
Web
获取视频采集设备及本地预览
请参考 快速接入 文档的章节:获取摄像头列表 和 本地预览。
如需收发多路视频,请忽略快速接入文档中的 操作视频 章节,根据本文档来操作视频。
获取视频流管理器及注册回调
通过 RtcEngine
实例的 getVideoStreamManager()
方法获取视频流管理器(下文称之为 streamMgr
)。
通过 streamMgr
实例的 on
方法设置视频流管理器的回调,例如:
let streamMgr = rtcEngine.getVideoStreamManager()
streamMgr.on(PanoRtc.RtcEngine.Events.getLocalVideo, eventObj => {
// 自己视频流开启成功的通知
const streamId = eventObj.data.streamId
const videoTag = eventObj.data.videoTag
// ...显示video element...
});
streamMgr.on(PanoRtc.RtcEngine.Events.userVideoStart, eventObj => {
// 其他用户开启视频流的通知
const userId = eventObj.userId
const streamId = eventObj.streamId
});
streamMgr.on(PanoRtc.RtcEngine.Events.userVideoStop, eventObj => {
// 其他用户关闭视频流的通知
const userId = eventObj.userId
const streamId = eventObj.streamId
});
streamMgr.on(PanoRtc.RtcEngine.Events.userVideoMute, eventObj => {
// 其他用户暂停视频流的通知
const userId = eventObj.userId
const streamId = eventObj.streamId
});
streamMgr.on(PanoRtc.RtcEngine.Events.userVideoUnmute, eventObj => {
// 其他用户恢复视频流的通知
const userId = eventObj.userId
const streamId = eventObj.streamId
});
streamMgr.on(PanoRtc.RtcEngine.Events.userVideoReceived, eventObj => {
// 收到其他用户视频流的通知
const userId = eventObj.data.userId
const streamId = eventObj.data.streamId
const videoTag = eventObj.data.videoTag
// ...显示其他用户的video element...
});
创建视频流
- 通过
streamMgr
实例的createVideoStream(deviceId)
方法创建视频流,该方法需要传入deviceId
参数(设备ID,可以通过前述 获取视频采集设备 部分获取),如果创建成功,将返回相应的视频流ID (streamId
)。 - 通过
streamMgr
实例的getCaptureDevice(streamId)
方法获取当前视频流使用的采集设备,setCaptureDevice(streamId, deviceId)
方法更新视频流的采集设备。 - 通过
streamMgr
实例的destroyVideoStream(streamId)
方法销毁一个视频流。
发送视频流
- 通过
streamMgr
实例的startVideo(streamId, videoProfileType)
方法发送视频流。streamId: number // 视频流ID videoProfileType: VideoProfileType // 发送分辨率,默认值 VideoProfileType.HD720P
startVideo
成功会触发getLocalVideo
事件,可以用于本地显示所发送的视频。 - 通过
streamMgr
实例的stopVideo(streamId)
方法停止发送视频流。
其他用户开启视频流的通知
- 当其他用户通过
streamMgr
对象发送视频流,本地streamMgr
对象会触发userVideoStart
事件通知。 - 当其他用户通过
streamMgr
对象停止发送视频流,本地streamMgr
对象会触发userVideoStop
事件通知。
订阅其他用户的视频流
- 收到其他用户开启视频流的通知后,可以通过
streamMgr
实例的subscribeVideo(params)
方法订阅其视频流。其中参数params
对象包含三个属性:
{
userId: string,
streamId: number,
quality: VideoProfileType
}
- 订阅成功后,会触发
userVideoReceived
事件,包含属性:
{
userId: string // 用户ID
streamId: number // 视频流ID
videoTag: HTMLVideoElement // 播放对方视频流的`<video>`元素,
}
- 通过
streamMgr
实例的unsubscribeVideo(params)
方法取消订阅视频流。其中参数params
对象包含属性:
{
userId: string,
streamId: number
}
Electron
获取视频采集设备及本地预览
请参考 快速接入 文档的章节:获取视频采集设备 和 本地预览。
如需收发多路视频,请忽略快速接入文档中的 操作视频 章节,改为根据本文档来操作视频。
获取视频流管理器及注册回调
通过 RtcEngine
实例的 videoStreamMgr()
方法获取视频流管理器(下文称之为 streamMgr
)。
通过 streamMgr
实例的 on
方法设置视频流管理器的回调,例如:
this.streamMgr.on('videoStartResult', (streamId, result) => {
// 自己视频流开启成功与否的通知
});
this.streamMgr.on('videoCaptureStateChanged', (streamId, deviceId, captureState) => {
// 视频流采集状态变化的通知
})
this.streamMgr.on('userVideoStart', (userId, streamId, maxProfile) => {
// 其他用户开启视频流的通知
// maxProfile: 表示该用户的最大可发送分辨率
});
this.streamMgr.on('userVideoStop', (userId, streamId) => {
// 其他用户关闭视频流的通知
});
this.streamMgr.on('userVideoMute', (userId, streamId) => {
// 其他用户暂停视频流的通知
});
this.streamMgr.on('userVideoUnmute', (userId, streamId) => {
// 其他用户恢复视频流的通知
});
this.streamMgr.on('userVideoSubscribe', (userId, streamId, result) => {
// 订阅其他用户视频流的结果通知
});
this.streamMgr.on('firstVideoFrameRendered', (userId, streamId) => {
// 第一个视频帧渲染的通知
});
this.streamMgr.on('videoSnapshotCompleted', (userId, streamId, succeed, fileName) => {
// 用户视频快照完成的通知
});
创建视频流
- 通过
streamMgr
实例的createVideoStream(deviceId)
方法创建视频流,该方法需要传入deviceId
参数(设备ID,可以通过前述 获取视频采集设备 部分获取),如果创建成功,将返回相应的视频流ID (streamId
)。 - 通过
streamMgr
实例的getCaptureDevice(streamId)
方法获取当前视频流使用的采集设备,setCaptureDevice(streamId, deviceId)
方法更新视频流的采集设备。 - 通过
streamMgr
实例的destroyVideoStream(streamId)
方法销毁一个视频流。
发送视频流
- 通过
streamMgr
实例的startVideo(streamId, view, options)
方法发送视频流。view
表示用于显示视频的 DOM 元素options
表示渲染配置参数:{ profile: VideoProfileType.HD720P, // 发送分辨率,默认值 VideoProfileType.Low mirror: true // 是否镜像,默认值 false }
- 通过
streamMgr
实例的stopVideo(streamId)
方法停止发送视频流。
其他用户开启视频流的通知
- 当其他用户通过
streamMgr
发送视频流,会触发userVideoStart
通知。 - 当其他用户通过
streamMgr
停止发送视频流,会触发userVideoStop
通知。
订阅其他用户的视频流
- 收到其他用户开启视频流的通知后,可以通过
streamMgr
实例的subscribeVideo(userId, streamId, view, options)
方法订阅其视频流。
view
和options
参数含义与 发送视频流 的相同。 - 订阅其他用户的视频流后,会触发
userVideoSubscribe
通知,其中的result
参数表示订阅结果,OK
表示订阅成功。 - 通过
streamMgr
实例的unsubscribeVideo(userId, streamId)
方法取消订阅视频流。
视频流首帧通知
当自己发送或收到其他用户视频流首帧时,会触发 firstVideoFrameRendered
通知,其中返回 userId
和 streamId
。