Pano开发者中心
  • 开发者中心
  • 下载中心

›高级功能(RTC)

新手入门

  • 简介
  • 名词解释
  • 创建第一个应用

规则说明

  • Channel ID命名规则
  • 权限控制
  • 计费说明
  • 频道最大时长说明
  • 每月一万分钟免费说明
  • 布局参数说明
  • 水印

场景方案

    教育行业

    • 1vN互动小班课
    • 互动直播大班课

快速接入

  • 简介
  • 音视频

    • Windows (C++)
    • iOS (Objective-C)
    • Android (Java)
    • Web
    • Electron
    • Flutter
    • React Native
    • Unity

    白板

    • Windows (C++)
    • iOS (Objective-C)
    • Android (Java)
    • Web
    • Electron
    • Flutter
    • React Native

高级功能(RTC)

  • 简介
  • 屏幕共享
  • 分组讨论
  • 状态回调
  • 设备诊断
  • 音量指示
  • 控制声音
  • 声卡操作
  • 混音/伴音
  • 混响
  • 耳返
  • 变声
  • 美颜
  • 音视频数据回调
  • 音视频外部采集
  • 收发多路视频
  • 多窗口渲染
  • 性能检测
  • 截图
  • 反馈

高级功能(RTS)

  • 简介
  • 白板

    • Windows (C++)
    • iOS (Objective-C)
    • Android (Java)
    • Web
    • Flutter

    标注

    • 视频标注
    • 共享标注
    • 外部标注

    消息

    • 消息服务

    远程控制

    • 远程控制

操作实践

  • 切换大小屏

RESTful API

  • 基本格式
  • 生成Token
  • 频道管理
  • 云端录制
  • CDN推流
  • 文档转码
  • 消息服务
  • 服务端消息通知

SDK API

  • SDK接口说明
  • Windows (C++)
  • macOS/iOS (Objective-C)
  • Android (Java)
  • Web SDK (IE专用版)
  • Web SDK

    • 浏览器兼容性
    • RtcEngine
    • GroupManager
    • RtcWhiteboard
    • RtsService
    • RtcMessage
    • Annotation
    • Constants

更新记录

  • 简介
  • Windows
  • macOS
  • iOS
  • Android
  • Electron
  • Flutter
  • React Native
  • Unity
  • Web(全功能SDK)
  • Web(RTS SDK)
  • Web(IE专用音视频SDK)

帮助

  • FAQ
  • 更多帮助

收发多路视频

简介

Pano SDK 支持同时发送多路视频,适用于一些特殊设备或特殊场景,例如:双师课堂、医学会诊、娃娃机,等。

注意:如果应用在同一时刻只需发送一路视频,例如,手机的前后置摄像头切换,则无需参考此文档。

各端 SDK 相关接口,请查看下列介绍:

  • Windows (C++)
  • macOS (Objective-C)
  • iOS (Objective-C)
  • Android (Java)
  • Web
  • Electron

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。

Last updated on 2022/2/10
← 音视频外部采集多窗口渲染 →
  • 简介
  • Windows (C++)
    • 获取视频采集设备及本地预览
    • 获取视频流管理器及注册回调
    • 创建视频流
    • 发送视频流
    • 其他用户开启视频流的通知
    • 订阅其他用户的视频流
    • 视频流首帧通知
  • macOS (Objective-C)
    • 获取视频采集设备
    • 本地预览
    • 获取视频流管理器及注册回调
    • 创建视频流
    • 发送视频流
    • 其他用户开启视频流的通知
    • 订阅其他用户的视频流
    • 视频流首帧通知
  • iOS (Objective-C)
    • 注意事项
    • 获取视频采集设备
    • 其他环节
  • Android (Java)
    • 获取视频采集设备
    • 获取视频流管理器及注册回调
    • 创建视频流
    • 发送视频流
    • 其他用户开启视频流的通知
    • 订阅其他用户的视频流
    • 视频流首帧通知
  • Web
    • 获取视频采集设备及本地预览
    • 获取视频流管理器及注册回调
    • 创建视频流
    • 发送视频流
    • 其他用户开启视频流的通知
    • 订阅其他用户的视频流
  • Electron
    • 获取视频采集设备及本地预览
    • 获取视频流管理器及注册回调
    • 创建视频流
    • 发送视频流
    • 其他用户开启视频流的通知
    • 订阅其他用户的视频流
    • 视频流首帧通知
浙ICP备20002645号 ©2019-2022 Pano拍乐云