视频会议过程说明

视频会议过程说明
1.视频会议建立需要建立实时任务
2.实时任务有4个组成部分
2.1共享对象  QY_SHARED_OBJ,用来统一管理音频源,视频源,音频压缩,视频压缩
包含音频源CAP_procInfo_recordSound
视频源CAP_procInfo_bmpCommon
音频压缩COMPRESS_AUDIO
视频压缩COMPRESS_VIDEO
2.2播放对象QY_PLAYER,统一管理音频播放和视频播放
音频播放mcThreadProc_playAudio
视频播放 openGL直接绘制
2.3QMC_TASK_INFO 用来提供实时任务的状态管理,和话筒列表等为各线程提供共享数据的结构
话筒列表DLG_TALK_videoConference,用于存储所有参会人的音视频编码参数
2.4内存任务TASK_transferAv,用来管理解码线程
3. iTaskId, 用来标识每个任务
4. 发起会议的调用  doCmd_startAvCall
4.1.如果是组的话,sendConfReq(null, hMgr, pMgrVar.addr.idInfo, 0, (ushort)level, conf_iFourcc, usMaxSpeakers);
发送请求到mcu, 由mcu发起会议,后发送请求到客户端。客户端调用dlgTalk_procTask_transferAvInfo来接收会议
4.2如果不是组,
4.2.1 if (0!=qyFuncs.getNewSharedObjUsr_localAv(pProcInfo, hMgr, Consts.CONST_qyWndContentType_talker, &iIndex_sharedObj, &iIndex_sharedObjUsr, &bFirstUsr))
取一个iIndex_shareObj
4.2.2 startLocalAudioRecorder
启动录音
4.2.3 openLocalVideo
打开摄像头
4.2.4 iTaskId = qyFuncs.newTaskId(pDb, pQyMc.cfg.db.iDbType);
取得一个taskId
4.2.5 if (0!=qyFuncs.procSendAvInfo(ref mainActivity.var_common.ctxCaller,pMisCnt, hMgr, true, Consts.CONST_imTaskType_transferAvInfo, ref pProcInfo.av.localAv.videoCaptureProcInfo.compressVideo, ref pProcInfo.av.localAv.recordSoundProcInfo.compressAudio, iIndex_sharedObj, iIndex_sharedObjUsr, null, null, &iTaskId, ref pMgrVar.addr, ref pst)) goto errLabel;
发送会议请求到对方
5.接收会议的消息处理
5.1mainWnd_OnQyPostComm
5.2mainWnd_procMsgInput_transferAvInfo
5.3 index_taskInfo = qyFuncs.newTaskInfoIndex(mainActivity.var_common.ctxCaller, pProcInfo, Consts.CONST_taskDataType_conf, null, pMsgInput.iTaskId, "mainWnd_procMsgInput_transferAvInfo");
获取一个新的QMC_TASK_INFO
5.4 gui_procMsgInput(ref pMsgInput);
6.接收会议的处理函数
dlgTalk_procTask_transferAvInfo
6.1                                int level_real = getAvLevelByWh(iWidth_pic_real, iHeight_pic_real);
 根据接收的分辨率决定采用对应的视频分辨率
6.2
   iIndex_capBmp = qyFuncs.newCapProcInfoBmpIndex(pProcInfo, iIndex_sharedObj);
    获取一个视频压缩对象
6.3    iIndex_capAudio = qyFuncs.newCapProcInfoAudioIndex(pProcInfo, iIndex_sharedObj);
          获取一个音频压缩对象
6.4             if (0 == startLocalAudioRecorder(pProcInfo.cfg.policy.audio.uiRecordType, null, capDevDesc, iIndex_sharedObj, ref pAudioCompressor))
     启动录音
6.5       int tmpiRet = qyFuncs.openLocalVideo(pProcInfo, uiCamCapType, displayName, hDlgTalk, Consts.CONST_qyWndContentType_talker, ref videoCompressor, iIndex_sharedObj);
                                                      打开摄像头
6.6 TASK_transferAv task = new TASK_transferAv();
                                生成一个内存任务对象
6.7 if (0 != pProcInfo.processQ_media.qPostMsg(task, 0))
                                    加入实时任务队列
6.8if (0 != qyFuncs.postMsgTask2Mgr_mc(mainActivity.var_common.ctxCaller, pMisCnt, Consts.CONST_misMsgType_task, 0, Consts.CONST_qyCmd_sendMedia, tStartTran, uiTranNo, 0, pMsgTask->iTaskId, pMsgTask->uiTaskType, (byte*)&transferAvReplyInfo, (uint)lenInBytes, idInfo_logicalPeer.ui64Id, pMsgTask->idInfo_taskSender.ui64Id, pMsgTask->idInfo_taskReceiver.ui64Id, pMsgTask->idInfo_taskSender.ui64Id, uiChannelType, null, false)) goto errLabel;
发送会议响应

7.

                                                                       













回复
去登录