




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
音视频开发流程音视频即时通讯是目前最为时尚、流行的通讯方式。可以实现一对一、一对多、多对多的通讯。而各种各样的即时通讯软件也层出不穷;服务提供商越来越丰富的通讯服务功能。随着社会的发展与网络技术的进步,音视频即时通讯的运用日益广泛。下面列举音视频聊天开发的简单流程:一、 开发环境的搭建1. 首先,虚拟机安装linux系统,我选取的是最新的Ubuntu14.04-32bit ;2. 然后,到QT官网/downloads,下载最新的linux版本QT5.3.2,如下所示:3. 最后,到AnyChat官网/download.html,下载最新的linux版本的SDK,这里我们选取32bit,如下图所示:二、 软件功能在这里,我只需要如下几个功能即可:1. 能够打开本地音视频;2. 能够获取在线用户列表;3. 能够请求在线用户音视频,实现视频聊天;4. 能够发送文字聊天。三、 真正的开始需求确定之后,我们就开始创建我们的工程啦!1. 现在我们打开QT5软件,创建一个新工程,首先就是布局我们的UI,如下图所示;然后我们给我们的UI写上对象名字,如下所示:2. 添加工程依赖性(包括anychat sdk依赖文件的添加)QT软件配置头文件和库文件有两种方法:2.1 可以手动在.pro为后缀的文件里面进行添加;2.2 可以右键工程项目,然后添加相应的文件和库,此方法会自动修改.pro文件,如下左右两图所示(左图为手动添加,右图为添加后的pro文件,也可以按右图修改pro文件):其中INCLUDEPATH为头文件包含路径,这里添加anychat sdk目录;LIBS为依赖库文件,这里添加anychatcore动态库;$PWD表示pro文件当前目录;当然也可以使用绝对路径,直接填写路径和文件名即可,按左图方法添加绝对正确。我的anychat sdk文件如下所示:3. 接下来我们需要编写具体功能的实现;3.1 初始化因为我们要使用anychat sdk,因此我们在程序初始化的时候对sdk初始化;SDK初始化参数设置,其中,对于视频,我们设置为BRAC_FUNC_VIDEO_CBDATA,为视频数据回调方式,后续需要我们实现视频数据的处理,这里主要是渲染显示;对于音频,我们设置为BRAC_FUNC_AUDIO_AUTOPLAY,使用SDK自动播放模式,我们不用做任何处理。/设置SDK核心组件所在目录(注:demo程序只是设置为当前目录,项目中需要设置为实际路径) QString szCoreSDKPath; szCoreSDKPath = QCoreApplication:applicationDirPath(); /获取当前应用程序路径 (strrchr(char*)szCoreSDKPath.toStdString().c_str(),/)1 = 0; BRAC_SetSDKOption(BRAC_SO_CORESDK_PATH, (char*)szCoreSDKPath.toStdString().c_str(), strlen(char*)szCoreSDKPath.toStdString().c_str();/ 根据BRAC_InitSDK的第二个参数:dwFuncMode,来告诉SDK该如何处理相关的任务(详情请参考开发文档) DWORD dwFuncMode = BRAC_FUNC_VIDEO_CBDATA/*BRAC_FUNC_VIDEO_AUTODISP*/ | BRAC_FUNC_AUDIO_AUTOPLAY | BRAC_FUNC_CHKDEPENDMODULE | BRAC_FUNC_AUDIO_VOLUMECALC | BRAC_FUNC_NET_SUPPORTUPNP | BRAC_FUNC_FIREWALL_OPEN |BRAC_FUNC_AUDIO_AUTOVOLUME | BRAC_FUNC_AUDIO_VOLUMECALC | BRAC_FUNC_CONFIG_LOCALINI; BRAC_InitSDK(HWND*)this-winId(), dwFuncMode); BRAC_SetVideoDataCallBack(BRAC_PIX_FMT_RGB32,VideoData_CallBack, this);/设置视频数据回调 BRAC_SetAudioDataCallBack(AudioData_CallBack, this); /设置声音数据回调 BRAC_SetNotifyMessageCallBack(NotifyMessage_CallBack,this); /设置异步消息回调 BRAC_SetTextMessageCallBack(TextMessage_CallBack,this); /设置消息发送回调在BRAC_InitSDK函数之后我们又调用了四个API接口,分别设置视频回调、声音回调(这里实际不用设置,我们采用自动播放模式)、系统消息回调、文字信息回调(文字聊天);至此初始化完毕!3.2 编写登录服务器接口void Widget:HelloChatLogin() BRAC_Connect(,8906); /连接服务器 :connect to server BRAC_Login(HelloChat, , 0); /登陆服务器 :loging to server这里为了方便,服务器地址、端口号、用户名、密码都写进来了;当我们登录成功之后,就可以继续往下啦。3.3 进入相应的房间/单击进入房间事件void Widget:on_EnterRoom_Btn_clicked() QString roomId = ui-RoomId_lineEdit-text(); /房间号 QString pwd = ; /密码 BRAC_EnterRoom(roomId.toInt(), (LPCTSTR)pwd.toStdString().c_str() , 0); /进入房间RoomId_lineEdit就是我们的ui控件,我们在编辑控件填写相应的房号即可;3.4 刷新在线用户列表void Widget:HelloChatRefreshUserList() /先清空列表 ui-UserlistWidget-clear(); memset(m_iUserID,-1,sizeof(MAX_USER_NUM); /获取在线用户人数 DWORD dwUserNum = 0; BRAC_GetOnlineUser(NULL, dwUserNum); if(!dwUserNum) return ; /获取在线用户ID列表 LPDWORD lpdwUserList = (LPDWORD)malloc(sizeof(DWORD) *dwUserNum); BRAC_GetOnlineUser(lpdwUserList, dwUserNum);/获取在线用户id /重新入列 for(int i = 0; i UserlistWidget-insertItem(i,cUserName); /对应的用户名添加到列表中 else break; free(lpdwUserList);int m_iUserIDMAX_USER_NUM; /其他用户ID号int m_SelfId; /自己的ID我单独写了一个接口,实现由用户进入房间和离开房间时会刷新列表;3.5 打开本地音视频/ 收到消息:客户端进入房间 wParam (INT)表示所进入房间的ID号,/ lParam (INT)表示是否进入房间:0成功进入,否则/ 为出错代码long Widget:OnGVClientEnterRoom(WPARAM wParam, LPARAM lParam) QString logstr; int roomid = (int)wParam; if(lParam = 0) /自己成功进入房间,然后打开视频和音频 logstr.sprintf(#INFO# success enter room:%d,user ,roomid); /Open Local Camera BRAC_UserCameraControl(-1,TRUE); BRAC_UserSpeakControl(-1,TRUE); else logstr.sprintf(#INFO# can not enter room,error code: %d ,lParam); emit changeSysLogs(logstr); return 0;当我们成功进入房间时,我们首先打开自己的音视频,这里用到了两个API,BRAC_UserCameraControl()和BRAC_UserSpeakControl(),分别打开音视频;这个函数有系统消息回调函数来调用,而系统消息回调函数我们在初始化的时候已经设置了,下面将我们的系统消息回调函数贴出来:/ 异步消息通知回调函数定义void CALLBACK Widget:NotifyMessage_CallBack(DWORD dwNotifyMsg, DWORD wParam, DWORD lParam, LPVOID lpUserValue) Widget*pAnyChatSDKProc = (Widget*)lpUserValue; if(!pAnyChatSDKProc) return; switch(dwNotifyMsg) case WM_GV_CONNECT: pAnyChatSDKProc-OnGVClientConnect(wParam,NULL); break; case WM_GV_LOGINSYSTEM: pAnyChatSDKProc-OnGVClientLogin(wParam,lParam); break; case WM_GV_ENTERROOM: pAnyChatSDKProc-OnGVClientEnterRoom(wParam,lParam); break; case WM_GV_MICSTATECHANGE:pAnyChatSDKProc-OnGVClientMicStateChange(wParam,lParam); break; case WM_GV_USERATROOM: pAnyChatSDKProc-OnGVClientUserAtRoom(wParam,lParam); break; case WM_GV_LINKCLOSE: pAnyChatSDKProc-OnGVClientLinkClose(wParam, lParam); break; case WM_GV_ONLINEUSER: pAnyChatSDKProc-OnGVClientOnlineUser(wParam,lParam); break; case WM_GV_CAMERASTATE: pAnyChatSDKProc-OnAnyChatCameraStateChgMessage(wParam,lParam); break; case WM_GV_ACTIVESTATE: pAnyChatSDKProc-OnAnyChatActiveStateChgMessage(wParam,lParam); break; case WM_GV_P2PCONNECTSTATE: pAnyChatSDKProc-OnAnyChatP2PConnectStateMessage(wParam,lParam); break; case WM_GV_SDKWARNING: pAnyChatSDKProc-OnAnyChatSDKWarningMessage(wParam,lParam); break; default: break; pAnyChatSDKProc-OnAnyChatNotifyMessageCallBack(dwNotifyMsg,wParam,lParam);3.6 请求在线用户视频我们进入房间后,获取在线用户并更新列表,所谓的在线用户是指同一房间的在线用户。/ 收到当前房间的在线用户信息 wParam (INT)表示在线用户数(不包含自己)/ lParam (INT)表示房间IDlong Widget:OnGVClientOnlineUser(WPARAM wParam, LPARAM lParam) QString logstr; int onlinenum = (int)wParam; logstr.sprintf(#INFO# the room id:%dn#INFO# total %d user online, lParam, onlinenum); emit changeSysLogs(logstr); /刷新列表 HelloChatRefreshUserList(); return 0; 然后我们双击列表中的用户,进行视频请求:我的虚拟机中打不开本地视频,所以左下角没有视频,具体的实现如下:其中g_sOpenedCamUserId为全局变量,用于保存被请求视频的用户名;/双击列表事件,双击后请求远程用户视频void Widget:on_UserlistWidget_doubleClicked(const QModelIndex &index) int row = ui-UserlistWidget-currentRow(); /获取所在当前列表行号 if(g_sOpenedCamUserId!=0) /先关闭正在视频 BRAC_UserCameraControl(g_sOpenedCamUserId,0); BRAC_UserSpeakControl(g_sOpenedCamUserId,0); g_sOpenedCamUserId = 0; ui-RemoteUserlabel-clear(); BRAC_UserCameraControl(m_iUserIDrow,1); /打开新请求用户视频 BRAC_UserSpeakControl (m_iUserIDrow,1); g_sOpenedCamUserId = m_iUserIDrow; /保存当前建立音视频连接用户id音视频成功啦,接下来我们继续扩展文字消息。 BRAC_UserCameraControl(g_sOpenedCamUserId,0); /视频控制 BRAC_UserSpeakControl(g_sOpenedCamUserId,0); /音频控制以上两个函数说明,参数1为用户id值,这个不难理解,参数2为打开和关闭控制值,建议使用true或false;在我实际开发过程中,在音视频关闭的时候,参数2设置为-1的时候,结果没有关闭成功,因为理解有误,应该设置为0。void Widget:on_SendMsg_Btn_clicked() QString message = ui-SendMsglineEdit-text(); if(g_sOpenedCamUserId=0) AppendLogString(#ERROR#no user chat with you); AppendLogString(#ERROR#please Request Chat first); ui-SendMsglineEdit-setText(); return ; if(BRAC_SendTextMessage(g_sOpenedCamUserId, NULL, (LPCTSTR)message.toStdString().c_str(), message.toStdString().length()= 0) /发送成功 QDateTime time = QDateTime:currentDateTime(); /获取系统当前时间 QString strTime = time.toString( yyyy-MM-dd hh:mm:ss ); QString info =#INFO#; CHAR username30; BRAC_GetUserName(g_sOpenedCamUserId,username,sizeof(username); AppendLogString(info+username + strTime); AppendLogString(message); ui-SendMsglineEdit-setText(); /清空控件3.7 实现发送文字消息聊天是的,使用BARC_SendTextMessage即可啦,参数一为用户id,至此,我们的功能基本完成;3.8 有进必有出-离开房间离开房间之后可以做什么?我们考虑实现离开房间后,要进入其他房间而不马上退出,因此这里我只使用了LeaveRoom!/单击离开房间事件void Widget:on_LeaveRoom_Btn_clicked() /先关闭远程用户视频 BRAC_UserCameraControl(g_sOpenedCamUserId,0); BRAC_UserSpeakControl(g_sOpenedCamUserId,0); ui-RemoteUserlabel-clear(); ui-RemoteUserlabel-setText(RemoteUser); /关闭本地用户视频 BRAC_UserCameraControl(m_SelfId,0); BRAC_UserSpeakControl(m_SelfId,0); ui-LocalUserlabel-clear(); ui-LocalUserlabel-setText(LocalUser); /离开当前房间 BRAC_LeaveRoom(1); /然后清空用户列表 HelloChatRefreshUserList(); /清空用户列表 AppendLogString(#INFO# User Leave Room); g_sOpenedCamUserId = 0;当然我们离开后需要关闭视频和刷新列表,对于关闭视频调用关闭音视频接口,然后设置ui-clear和text,对于列表,调用封装好的接口即可;3.9 关键的视频渲染因为我使用了回调方式获取视频数据,所以我得手动进行视频渲染首先定义视频缓冲和大小(我这里定义为类成员):char* m_lpLocalVideoFrame; /本地视频缓冲int m_iLocalVideoSize; /本地视频缓冲大小char* m_lpRemote
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 周围性面神经麻木护理措施
- 护理进修学习成果汇报
- 青花瓷映沧海:智慧与传承的汇报
- 酱酒烤酒知识培训课件
- 2025年结核病工作方案
- 护理科研项目立项申请汇报
- 精神障碍病人心理护理
- 辽宁省葫芦岛市2024-2025学年高一上学期1月期末考试英语试卷 含解析
- 2025年深圳圣诞节活动策划方案
- 电工电子技术基础 第2版 习题答案 周鹏
- 无缝气瓶检验作业指导书2024
- 电焊 气焊和切割专项施工方案
- 铁路机车车辆制动钳工(高级)职业鉴定考试题及答案(新版)
- DBJ50T-481-2024 装配式开孔钢板组合剪力墙结构住宅 技术标准
- 2024版《CSCO非小细胞肺癌诊疗指南》更新要点
- 2024年甘肃省中考化学真题(原卷版)
- 铝锭销售居间合同范本
- 2023.05.06-广东省建筑施工安全生产隐患识别图集(高处作业吊篮工程部分)
- 2024年上海奉贤区社区工作者及事业单位招聘177人历年(高频重点提升专题训练)共500题附带答案详解
- 小儿疼痛与镇痛的管理
- 钢结构(钢网架)安全技术交底
评论
0/150
提交评论