从3.3.0-20230618版本开始支持上报300路roster,如需使用全量roster需要联系小鱼技术支持打开企业开关。具体参考全量ROSTER使用流程
通过参会者事件回调开发者可获取当前会议中的人数, 根据人数可通过调用 requestLayout 实现按需请流, SDK提供了两种获取视频流的方式,用户可在初始化的时候进行设置,默认采用主动推流的方式即方式一,demo提供了方式一的参考。
方式一:请流之后SDK将通过异步回调的方式, 将远端视频裸流(YUV)上报给应用层.
方式二:应用层主动拉流,通过timer的方式主动调用 getVideoFrame 去拉流
布局最佳体验
黑色字体的L标识本地画面,P标识参会者画面。红色字体的Q标识视频质量,P标识优先级。通常来说大画面优先请高分辨率的流, 小窗口请小分辨率的流, 以次来降低机器性能开销, 避免引机器性能导致的crash。
/* 会议信息变化上报 */
virtual void onConfInfoChanged(const SDKConfInfo &info) = 0;
/**
* @brief MeetingWindow::onConfMemberChanged
*
* onConfMemberChanged: 参会人员信息变化回调
* reqAutoLayout: 请求视频流, 参会人员信息变化时, 在此处根据业务场景请求视频流
*
* Speaker: 演讲者模式 (1 + N)
* Gallery: 画廊模式 (对称屏)
* Chairman: 主会场模式 (1 + 1) -> 1(big: chairman主会场) + 1(local)
* Focus: 专注模式 (1 + 1) -> 1 (big: conent) + 1 (as: 讲话者)
* ContentOnly: 内容模式 (1) -> 只显示content
* ContentAndAs: content & as 对称显示
*/
void MeetingWindow::onConfMemberChanged(int num, bool hasContent, QString chirmanUri)
{
adaptor->reqAutoLayout(layoutReqNum, hasContent, chirmanUri.toStdString(),
meetingLayout->currentLayoutMode());
}
/* 返回远端视频流状态信息 */
virtual void onVideoStreamChanged(const XYArray<SDKVideoStreamInfo>& streamArray) = 0;
// demo 示例
/**
* @brief MeetingWindow::onStreamChanged 视频流数据变化
* @param streams 远端视频流
* 在此处能计算出有多少路视频要渲染, UI上根据自己的业务场景去渲染
*/
void MeetingWindow::onStreamChanged(const std::vector<SDKVideoStreamInfo> &streams)
{
// 创建VideoCell
}
/*
* 上报视频流裸数据
* dataSourceId : SDK为没路视频流的分配的资源标志
* 本地预览的sourceId 固定为:LocalPreviewID
* 本地预览的固定帧率为30fps@720p,推流最大帧率也为30fps
*/
virtual void onVideoFrameReady(const char* dataSourceId, const SDKVideoFrame& videoFrame) = 0;
/*
* 获取视频裸数据(SDK会主动推流@link#onVideoFrameReady, 如果需要主动拉流
* 设置@startup#SDKConfigs.enablePushVideo=false)
*/
virtual bool getVideoFrame(const char* sourceId, int sourceKey, SDKVideoFrame& frame) = 0;
// demo 示例
void MeetingWindow::onVideoFrameReady(const QString &dataSourceId, const SDKVideoFrameWrapper &videoFrame)
{
// videoCell->requestRender...
}