由于使用习惯,Linux在中国受欢迎程度远不如windows,相应的软件也比较少,尤其是音视频类的软件,但是,这并不代表就完全没有。下面介绍一款强大的音视频即时通讯平台给大家,它就是——Anychat for Linux SDK。
AnyChat是一套跨平台的音、视频即时通讯解决方案,基于先进的H.264视频编码标准、AAC音频编码标准与P2P技术,支持Windows、Linux、Mobile、Android、iOS、Mac等操作系统平台,提供客户端SDK、服务器端SDK,可与第三方平台紧密集成。
AnyChat for Linux基于LinuxKernel 2.6.x研发,提供标准C、C++语言开发接口。
AnyChat for Linux可与其它平台的AnyChat互联互通,连接同一个服务器程序,有关服务器的SDK可参考AnyChat Platform Core SDK开发包。
下面是客户端部分代码:
#include "anychat.h" #include <stdlib.h> #include <stdio.h> CAnyChat::CAnyChat() { m_dwRemoteUserId = -1; } CAnyChat::~CAnyChat() { } // void CAnyChat::OpenRemoteUserStream(void) { if(m_dwRemoteUserId !=(DWORD)-1) // already opned remoteuser stream return; DWORD dwUserNum = 0; BRAC_GetOnlineUser(NULL,dwUserNum); if(dwUserNum == 0) return; LPDWORD lpUserList = (LPDWORD)malloc(sizeof(DWORD)* dwUserNum); if(!lpUserList) return; BRAC_GetOnlineUser(lpUserList,dwUserNum); for(int i=0;i<(int)dwUserNum; i++) { m_dwRemoteUserId =lpUserList[i]; BRAC_UserCameraControl(m_dwRemoteUserId, TRUE); BRAC_UserSpeakControl(m_dwRemoteUserId, TRUE); break; } } // 连接服务器消息 void CAnyChat::OnAnyChatConnectMessage(BOOL bSuccess) { fprintf(stdout,"On Connect:bSuccess(%d)\r\n",(int)bSuccess); } // 用户登陆消息 void CAnyChat::OnAnyChatLoginMessage(DWORD dwUserId, DWORD dwErrorCode) { fprintf(stdout,"On Login:dwUserId(%d), ErrorCode:%d\r\n",(int)dwUserId,dwErrorCode); } // 用户进入房间消息 void CAnyChat::OnAnyChatEnterRoomMessage(DWORD dwRoomId, DWORDdwErrorCode) { fprintf(stdout,"On EnterRoom(dwRoomId=%d,dwErrorCode=%d)\r\n",dwRoomId,dwErrorCode); if(dwErrorCode == 0) { BRAC_UserCameraControl(-1,TRUE); BRAC_UserSpeakControl(-1,TRUE); } } // 房间在线用户消息 void CAnyChat::OnAnyChatOnlineUserMessage(DWORD dwUserNum, DWORD dwRoomId) { fprintf(stdout,"Onlineuser(dwUserNum=%d,dwRoomId=%d)\r\n",dwUserNum,dwRoomId); OpenRemoteUserStream(); } // 用户打开/关闭音频设备设备消息 void CAnyChat::OnAnyChatMicStateChgMessage(DWORD dwUserId, BOOL bOpenMic) { } // 用户进入/退出房间消息 void CAnyChat::OnAnyChatUserAtRoomMessage(DWORD dwUserId, BOOL bEnter) { fprintf(stdout,"OnUserAtRoom(dwUserId=%d, bEnter=%d)\r\n",(int)dwUserId,(int)bEnter); if(dwUserId == m_dwRemoteUserId&& !bEnter) m_dwRemoteUserId = -1; OpenRemoteUserStream(); } //网络断开消息 void CAnyChat::OnAnyChatLinkCloseMessage(DWORD dwErrorCode) { fprintf(stdout,"On LinkClose(reason=%d)\r\n",dwErrorCode); m_dwRemoteUserId = -1; } // 用户摄像头状态改变消息 void CAnyChat::OnAnyChatCameraStateChgMessage(DWORD dwUserId, DWORDdwState) { } // 用户聊天模式改变消息 void CAnyChat::OnAnyChatChatModeChgMessage(DWORD dwUserId, BOOLbPublicChat) { } // 用户活动状态发生变化消息 void CAnyChat::OnAnyChatActiveStateChgMessage(DWORD dwUserId, DWORDdwState) { } // P2P连接状态变化消息 void CAnyChat::OnAnyChatP2PConnectStateMessage(DWORD dwUserId, DWORDdwState) { fprintf(stdout,"On P2PConnect State Change(dwUserId=%d, dwState=%d)\r\n",(int)dwUserId,dwState); } // 用户私聊请求消息 void CAnyChat::OnAnyChatPrivateRequestMessage(DWORD dwUserId, DWORDdwRequestId) { } // 用户私聊请求回复消息 void CAnyChat::OnAnyChatPrivateEchoMessage(DWORD dwUserId, DWORDdwErrorCode) { } // 用户退出私聊消息 void CAnyChat::OnAnyChatPrivateExitMessage(DWORD dwUserId, DWORDdwErrorCode) { } // SDK警告消息 void CAnyChat::OnAnyChatSDKWarningMessage(DWORD dwErrorCode, DWORDdwReserved) { } // 视频数据回调 void CAnyChat::OnAnyChatVideoDataCallBack(DWORD dwUserid, LPVOID lpBuf,DWORD dwLen, LPBITMAPINFOHEADER lpbmiHeader) { } // 音频数据回调 void CAnyChat::OnAnyChatAudioDataCallBack(DWORD dwUserid, LPVOID lpBuf,DWORD dwLen, LPWAVEFORMATEX lpWaveFormatEx) { } // 发送文字的回调函数 void