点击免费下载源码
视频聊天系统作为一种新型的通信和交流工具,突破了地域的限制,可以提供更为便捷、灵活、全面的音、视频信息的传递和服务,具有极其广泛的发展前景。
介绍了采用JAVA编程开发视频聊天系统的一套比较常用的解决方案。文字聊天采用TCP模式;语音视频聊天采用UDP模式,在客户端之间点对点的进行。在该方案中,通过函数库VFW来实现视频捕获、影像压缩以及影像播放。微软公司提供的专门用于视频捕获开发的工具包VFW,为在Windows操作系统中实现视频捕获提供了标准的接口,从而大大降低了程序的开发难度。在视频传输方面,则通过组建视频帧,将位图形式的视频帧压缩成帧格式的Mpeg4流,传输到客户端后,解压并显示影像。同时,在本方案中,采用了线程来实现语音录制和语音回放,最终实现了通过服务器中转的文字聊天、点对点的语音视频聊天。
点击免费下载源码
该系统采用的是Server/Client结构,拓扑图如下:
该系统分为服务器端和客户端,完成了文字聊天和语音视频聊天,使用上只有文字聊天时才会通过服务器端,而对于语音视频聊天就只需要对整个在线客户端两两之间进行点对点的视频聊天。而在语音视频时包括了视频捕获、视频压缩、解压缩、语音录制、语音回放以及视频传输等。整个系统的功能模块图如图:
文字聊天流程图:
语音视频聊天流程图:
TCP套接字的使用:
ChatServer服务器运行时,利用一个CSocket对象CSocketServer启动服务器,用函数gethostname来获得服务器端主机名和IP,同时在服务器对话框中显示服务器IP,并将分配的固定端口号8123显示在对话框中。用一个list列表显示在线用户,随时更新用户登录情况,用一个edit box显示客户端的聊天内容以及系统提示消息。每一个ChatClient客户端启动时,利用服务器内定的用户号和密码来登录。在整个系统中,利用链表来处理所有的用户信息:当有用户登录时,在链表尾部加入该用户信息;当用户下线时,在该链表中删除用户,并提示所有用户,该用户下线。在对链表进行操作的同时,要更新list列表中的信息。
ChatClient客户端两两间进行文字聊天时,发送信息的处理函数如下:
void CChatClientDlg::OnChatBtSend() //发送信息按键
{
if( !m_bConnect)
{
SetMessageBox("请连接服务器!\r\n");
return ;
}
CString str;
CString szUserName;
CMesg msg;
GetDlgItemText(IDC_MESSAGE,str);
GetDlgItemText(IDC_USERNAME,szUserName);
if( str.GetLength() <= 0 )
{
SetMessageBox("请输入想要发送的信息!\r\n");
return ;
}
if ( szUserName.GetLength() <= 0)
{
SetMessageBox("请选择说话对象!\r\n");
return ;
}
//消息封装
msg.m_szCommand.Format("Message");
msg.m_szRecObject.Format(szUserName);
msg.m_szText.Format(str);
m_csClient->SendM(&msg);
AddReceiver(szUserName , true);
AddChatMessage(str);
}
UDP套接字的使用
利用VFW接口,视频捕获可以分为以下几个步骤:
(1) 建立视频采集窗口:该窗口用来接收视频捕捉驱动程序传来的数据和消息。
(2) 连接视频驱动程序:将建立的视频捕捉窗口与视频设备驱动程序相连。
(3) 视频捕获初始化。
(4) 视频捕捉设置:VFW下视频捕捉参数的设置可以通过调用函数或弹出对话框的形式来实现。一般视频驱动程序允许设置的参数包括视频源选择、视频格式、视频显示格式等。
(5) 设置回调函数:通过回调函数来通知程序视频事件的发生,比如捕捉一帧图像成功的消息,捕捉出错的消息等。
(6) 结束捕捉:结束捕捉是应该有一些清除工作。如释放分配的内存,断开捕捉窗口与视频捕捉驱动程序的连接,清除视频捕捉窗口等。
窗口类为捕获数字视频流及其相关操作提供了很大的方便,灵活编写其中的回调函数可满足实时视频传输的需要,例如应用程序可直接从缓冲中取得数字视频并对其进行压缩编码后实时地传到远端的客户端。
在VC++中,采用VFW技术,客户端通过capSetCallbackOnFrame()注册回调函数,当采集卡采集到一幅图像后,系统就会自动调用回调函数,然后再回调函数中使用ICSeqCompressFrame()函数进行压缩。然后再通过Winsock将压缩后的数据发送到另一客户端。该客户端接收完一帧以后,交给ICDecompress()解压,最后用SetDIBitsToDevice()将图像显示出来。
点击免费下载源码