在前两节课,我们将推流端与播放端合并为一对一音视频聊天功能并解决了关键的回声问题,在此基础上,我们可以进一步改进实现多对多的视频会议功能。
1.备份demo9并修改demo9为demo10。
2.打开工程文件,修改mfc为四分屏画面。
界面左下角为推送端界面,包括:摄像头预览区、推流地址文本框和推流按钮,其余三个为播放端界面,包括:拉流预览区、拉流地址文本框和拉流按钮。
3.添加相应功能
推流端代码fmle.cpp基本不用改动,fmlp.cpp及fmlp.h需要微调以适应复用功能。修改主对话框代码使播放端增加到三个并传递相关参数到fmlp内部以作识别用:
myFmlp1 = new fmlp();
myFmlp1->btnID = IDC_playBtn;
myFmlp1->videoID = IDC_remotePIC;
myFmlp1->start(playURL, 640, 480);
myFmlp2 = new fmlp();
myFmlp2->btnID = IDC_playBtn2;
myFmlp2->videoID = IDC_remotePIC2;
myFmlp2->start(playURL, 640, 480);
myFmlp3 = new fmlp();
myFmlp3->btnID = IDC_playBtn3;
myFmlp3->videoID = IDC_remotePIC3;
myFmlp3->start(playURL, 640, 480);
3.给播放按钮添加相应的控制程序:
void CflashMeetingDlg::OnBnClickedplaybtn()
{
myWnd->GetDlgItem(IDC_playURL)->GetWindowText(playURL);
if (playURL.GetLength() == 0){
MessageBox(L"地址不能为空");
return;
}
if (!myFmlp1->isRunning){
myFmlp1->ifConn(playURL, 640, 480);
}
else{
myFmlp1->isRunning = false;
myFmlp1->isAuPlaying = false;
}
}
void CflashMeetingDlg::OnBnClickedplaybtn2()
{
myWnd->GetDlgItem(IDC_playURL2)->GetWindowText(playURL2);
if (playURL2.GetLength() == 0){
MessageBox(L"地址不能为空");
return;
}
if (!myFmlp2->isRunning){
myFmlp2->ifConn(playURL2, 640, 480);
}
else{
myFmlp2->isRunning = false;
myFmlp2->isAuPlaying = false;
}
}
void CflashMeetingDlg::OnBnClickedplaybtn3()
{
myWnd->GetDlgItem(IDC_playURL3)->GetWindowText(playURL3);
if (playURL3.GetLength() == 0){
MessageBox(L"地址不能为空");
return;
}
if (!myFmlp3->isRunning){
myFmlp3->ifConn(playURL3, 640, 480);
}
else{
myFmlp3->isRunning = false;
myFmlp3->isAuPlaying = false;
}
}
4.调试运行,效果如下:
在正常情况下,互联网应用延时不会超过500ms,回声抑制效果良好,在此基础上可以进一步完善拓展成一个可商用的视频会议软件。