`
fanxiaojun
  • 浏览: 56232 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

 互联网的不断发展,各种新技术的兴起,原本做管理软件的我也逐渐转向从事着互联网相关的运营产品的开发。尤其是目前抄得最火热的音视频互动平台技术,今天我先列出最基本开发流程,适用于开发视频会议系统、语音视频聊天系统、远程教育平台以及即时通讯平台(IM)等。希望对喜欢这方面的朋友有所帮助。同时欢迎各大高手参与讨论,相互交流、学习。

首先,知其然,先看看如何开始工作。

下载:http://anychat.storage.aliyun.com/AnyChatCoreSDK_Win32(MBCS)_V4.5.zip

一、初始化

该部分是首先要完成的,包括设置对应的回调函数、设置SDK组件路径、设置是否产生日志文件等,通常初始化的代码如下(C++):

01.// 打开(关闭)的日志记录功能
02.BRAC_ActiveCallLog(TRUE);
03.      
04.// 设置核心组件所在目录
05.CHAR szCoreSDKPath[MAX_PATH] = {0};
06.GetModuleFileName(NULL,szCoreSDKPath,sizeof(szCoreSDKPath));
07.(strrchr(szCoreSDKPath,'\\'))[1] = 0; 
08.BRAC_SetSDKOption(BRAC_SO_CORESDK_PATH,szCoreSDKPath,strlen(szCoreSDKPath));
09.      
10.// 根据BRAC_InitSDK的第二个参数:dwFuncMode,来告诉该如何处理相关的任务(详情请参考开发文档)
11.DWORD dwFuncMode = BRAC_FUNC_VIDEO_CBDATA | BRAC_FUNC_AUDIO_AUTOPLAY | BRAC_FUNC_CHKDEPENDMODULE | BRAC_FUNC_AUDIO_VOLUMECALC | BRAC_FUNC_NET_SUPPORTUPNP | BRAC_FUNC_FIREWALL_OPEN |
12.BRAC_FUNC_AUDIO_AUTOVOLUME | BRAC_FUNC_CONFIG_LOCALINI;
13.BRAC_InitSDK(this->GetSafeHwnd()/*NULL*/,dwFuncMode);
14.      
15.// 设置录像临时文件保存路径
16.CHAR szRecordDirectory[MAX_PATH] = {0};
17.::GetModuleFileName(NULL,szRecordDirectory,MAX_PATH);
18.(strrchr(szRecordDirectory,'\\'))[1] = 0; 
19.strcat(szRecordDirectory,"Record");
20.BRAC_SetSDKOption(BRAC_SO_RECORD_TMPDIR,szRecordDirectory,strlen(szRecordDirectory));
21.  
22.// 设置录像文件质量参数
23.DWORD dwVideoBitrate = 200 * 1000;  // 200kbps
24.BRAC_SetSDKOption(BRAC_SO_RECORD_VIDEOBR,(PCHAR)&dwVideoBitrate,sizeof(DWORD));
25.DWORD dwAudioBitrate = 96 * 1000;   // 96kbps
26.BRAC_SetSDKOption(BRAC_SO_RECORD_AUDIOBR,(PCHAR)&dwAudioBitrate,sizeof(DWORD));
27.      
28.// 设置快照临时文件保存路径
29.CHAR szSnapShotDirectory[MAX_PATH] = {0};
30.::GetModuleFileName(NULL,szSnapShotDirectory,MAX_PATH);
31.(strrchr(szSnapShotDirectory,'\\'))[1] = 0; 
32.strcat(szSnapShotDirectory,"SnapShot");
33.BRAC_SetSDKOption(BRAC_SO_SNAPSHOT_TMPDIR,szSnapShotDirectory,strlen(szSnapShotDirectory));
34.      
35.// 设置临时文件路径
36.CHAR szTempPath[MAX_PATH] = {0};
37.::GetModuleFileName(NULL,szTempPath,MAX_PATH);
38.(strrchr(szTempPath,'\\'))[1] = 0; 
39.strcat(szTempPath,"Temp");
40.BRAC_SetSDKOption(BRAC_SO_CORESDK_TMPDIR,szTempPath,strlen(szTempPath));
41.  
42.// 启用音频自动参数功能(默认关闭)
43.DWORD bAudioAutoParam = TRUE;
44.BRAC_SetSDKOption(BRAC_SO_AUDIO_AUTOPARAM,(PCHAR)&bAudioAutoParam,sizeof(DWORD));

二、登录系统

当第一步初始化完成之后,便可以连接服务器、验证用户身份。通常调用代码如下(C++):

1.// 连接服务器
2.BRAC_Connect("211.155.25.90",8906);
3.// 登录系统
4.BRAC_Login("testuser","",0);

连接服务器与登录系统都是一个异步的过程,调用后会立即返回,其中:

a、连接服务器成功,或是失败,将会触发异步消息:网络连接消息

b、登录系统成功,或是失败,将会触发异步消息:登录系统消息

所以应用程序需要响应这些异步消息(或处理:异步消息通知回调函数)才能知道连接服务器、登录系统是否成功。

登录系统成功后,如果需要实现即时通讯应用中的好友列表(AnyChat默认没有实现),则需要利用AnyChat的扩展API接口与Server SDK来配合实现,登录系统成功后,服务器会返回一个32位的用户ID,如果登录时没有传入密码参数,则系统会认为是游客登录,并分配一个独立的用户ID(如-1、-2等),如果登录时传入了密码参数,则登录请求将会交给“SDK Filter Plus”接口,或“Server SDK”对应的接口,用户可开发一个自己的服务器插件“SDK Filter Plus”,或是调用“Server SDK”所对应的API来处理用户身份验证的请求,完成对用户ID的管理,实现与第三方系统的互联互通,详细内容可参考SDK包中的:doc\server\目录下的相关文档。

三、进入房间

在第二步登录系统成功之后,就可以进入房间,因为只有在房间中,才能完成语音和视频的交互。通常调用代码如下(C++):

1.// 进入房间
2.BRAC_EnterRoom(1,"",0);

房间由服务器动态管理,由32位的房间ID号来唯一标示,当客户端指定的房间ID号不存在时,服务器将会自动创建。进入房间也是一个异步的过程,是否成功将会触发异步消息:自己进入房间消息,进入房间成功后,服务器会把当前房间的在线用户列表传给客户端,传输完成后,将会触发异步消息: 当前房间在线用户消息(该消息只触发一次),只有收到服务器的在线用户列表后,才能对房间内的用户进行音视频的相关操作。

当自己进入房间成功,且收到服务器的在线用户消息后,有新的用户进入房间,或是老用户离开房间,将会触发异步消息:用户进入(离开)房间消息,这样自己便知道谁进入,或是离开了房间。

1、打开自己的音视频

进入房间成功之后,便可以打开自己的音视频设备,通常调用代码如下(C++):

1.// 打开自己的视频设备

2.BRAC_UserCameraControl(-1,TRUE);
3.// 打开自己的音频设备
4.BRAC_UserSpeakControl(-1,TRUE);

打开自己的设备后,并不会立即上传音视频流,只有当其它用户请求自己的音视频数据时(可单独请求音频流,或视频流)才对外传输,打开自己的音视频设备,默认是按服务器的配置信息来初始化设备(如采样分辨率、视频帧率、音频的采样频率等),如需要在客户端程序中调节音、视频质量,

2、请求其它用户的音视频

如果需要显示其它用户的音视频,则必须在收到房间用户列表消息后,请求对方的音视频流,然后对方才将音视频流传输过来,通常请求其它用户的音视频数据调用代码如下(C++):

1.// 请求对方的视频流

2.BRAC_UserCameraControl(dwUserId,TRUE);
3.// 请求对方的音频流
4.BRAC_UserSpeakControl(dwUserId,TRUE);

数据传输优先P2P方式,只有当P2P不通时,才由服务器转发,P2P的NAT打洞过程,以及数据流传输策略均由服务器控制,只要有请求,而且对方已打开了自己的音视频设备,则就能收到对方的音视频流数据。

3、音视频的播放与显示

当收到其它用户的音频数据后:

a)如果在初始化时设置了“BRAC_FUNC_AUDIO_AUTOPLAY”标志,则SDK内部将会自动播放,自动混音;

b)如果在初始化时设置了“BRAC_FUNC_AUDIO_CBDATA”标志,则SDK会将解码后的音频数据(PCM格式)通过回调函数回调给上层应用。

当收到其它用户的视频数据后

a)如果在初始化时设置了“BRAC_FUNC_VIDEO_AUTODISP”标志,并且调用了API: BRAC_SetVideoPos,则SDK内部将会把视频显示到指定的窗体的指定位置(在指定位置上自动迭加一个视频窗口);

b)如果在初始化时设置了“BRAC_FUNC_VIDEO_CBDATA”标志,则SDK会将解码后的视频数据(RGB、YUV)通过回调函数回调给上层应用,由上层应用自己来绘制,或渲染,该模式适合于DirectX、HGE等没有窗口模式下的应用程序,或是上层应用需要对视频进行特殊处理的场合,如迭加文字、logo等。

4、文字交互

成功进入房间后, 便可以调用API接口向指定用户,或是房间中的所有用户发送文字消息:

1.// 发送文字消息
2.CString strInput = "hello world";
3.BRAC_SendTextMessage(-1,FALSE,strInput.GetBuffer(0),strInput.GetLength());

其它用户收到自己发送的文字消息后,便会触发回调函数:文字消息回调函数,通过处理回调消息,然后将收到的文字消息显示在界面上,便可实现文字的交互。

5、业务逻辑处理 

AnyChat SDK内置的基本逻辑是:当自己的音视频设备打开后,别的用户有请求,便会将流媒体数据传输给对方,而没有任何何业务逻辑。

a)如要实现视频会议系统,则用户进入房间后,就需要知道谁是主持人,然后打开主持人的视频;

b)如要实现视频聊天系统,则用户进入房间后,就需要知道当前房间有几个公麦,谁在公麦上,然后打开对应公麦用户的视频等;

c)……

这些业务逻辑需要与服务器端的“SDK Filter Plus”或“AnyChat Server SDK”互相配合来实现,具体的实现方案可参考SDK包中的:doc\server\目录下的《AnyChat Server SDK 开发指南》第6章节。 

四、释放资源

与前面连接服务器、登录系统、进入房间对应的,退出系统的过程是:离开房间、注销系统、释放资源,通常调用代码如下(C++):

1.// 离开房间

2.BRAC_LeaveRoom(-1);
3.// 注销系统(将关闭网络连接)
4.BRAC_Logout();
5.// 释放资源
6.BRAC_Release();

离开房间后,可以进入新的房间,系统注销之后,可以再次调用连接服务器的API接口,但是释放资源后,将不再工作。

需要特别注意一下释放资源的时机。

完了之后,我们就来知其所以然了,如果你喜欢这个项目,请继续关注。也可加QQ:992139738

分享到:
评论

相关推荐

    大型语音视频聊天室程序代码(价值2万) 3.0

    《大型语音视频聊天室程序代码详解 3.0 版本》 在互联网技术日新月异的今天,实时通信已经成为各类应用的核心功能之一。尤其是大型语音视频聊天室程序,它们为用户提供了一种高效、直观的沟通方式,广泛应用于在线...

    vc++视频聊天源代码

    【VC++视频聊天源代码详解】 在信息技术领域,视频聊天技术已经成为了日常沟通的重要组成部分,尤其是在远程工作、在线教育和社交互动中。本篇将详细探讨一个基于VC++的视频聊天源代码,帮助读者理解其背后的原理和...

    使用java开发的聊天室

    【Java聊天室开发详解】 在IT领域,Java作为一种多用途且跨平台的编程语言,广泛应用于各种项目开发,包括创建聊天软件。本项目名为“使用Java开发的聊天室”,其核心是利用Java的强大功能实现一个实时通信的聊天...

    网页聊天室源码

    【网页聊天室源码详解】 在互联网应用中,聊天室是一种常见的实时通信工具,它允许用户在一个共享的环境中进行文字、语音甚至视频的交流。"DOLLARS聊天室"是源自一个动画作品中的虚构场景,但我们可以将其概念转化...

    Happychatchat_聊天室_java_

    【Java聊天室项目详解】 Java聊天室是一种基于网络的实时通信系统,允许用户通过文本、语音甚至视频进行交互。在本项目"HappyChatChat_聊天室_java_"中,我们将深入探讨其背后的编程技术和实现原理。 一、Java基础...

    聊天室程序(Web)

    【Web聊天室程序详解】 Web聊天室是一种在线交互平台,允许用户通过Web浏览器进行实时文本、音频或视频交流。在互联网技术中,实现Web聊天室涉及多种关键技术和概念,包括HTML、CSS、JavaScript、WebSocket、AJAX...

    FMS聊天室下载FMS

    【FMS聊天室下载FMS】相关知识点详解 FMS(Flash Media Server)是由Adobe公司开发的一款流媒体服务器软件,主要用于实时音频、视频的发布和交互。它支持HTTP Live Streaming (HLS)、RTMP(Real Time Messaging ...

    完整版老李的局域网聊天室.rar

    【标题】"完整版老李的局域网聊天室"是一个局域网通信软件的压缩包,可能是由用户老李开发或整理的,用于在局域网内的设备间实现即时通讯功能。这样的软件通常适用于小型网络环境,如家庭、办公室或学校内部,允许在...

    [聊天留言]网页视频聊天室软件zlchat v1.3_zlchat-server-1_3.zip

    【标题】:“网页视频聊天室软件zlchat v1.3”是基于Java JSP技术开发的一款应用程序,主要用于提供在线视频聊天功能。这个软件版本为v1.3,对应的服务器端源码包名为“zlchat-server-1_3”。 【描述】:这款软件...

    聊天室(TCP,UDP)

    【TCP与UDP协议详解及其在聊天室应用】 TCP(Transmission Control Protocol,传输控制协议)与UDP(User Datagram Protocol,用户数据报协议)是网络通信中两种主要的传输层协议,它们各自具有不同的特点和应用...

    FM.rar_FluorineFx_flex_flex 视频_视频聊天

    《FluorineFx与Flex构建视频聊天室详解》 在现代互联网技术中,实时通信功能,特别是视频聊天,已经成为用户交互的重要组成部分。本篇将深入探讨如何利用FluorineFx与Flex技术来构建一个功能完备的视频聊天室。...

    chatroom聊天室

    【聊天室技术详解】 聊天室是一种在线实时交流的平台,让用户可以实时发送和接收消息,进行多用户间的对话。在本项目"chatroom聊天室"中,开发者使用了JavaServer Pages(JSP)技术来构建了一个简单易用的聊天室...

    网络聊天室 (源码+可执行程序).zip

    《基于Qt实现的网络聊天室详解》 网络聊天室是一种实时通信工具,它允许用户通过互联网进行文字、语音甚至视频的交流。本项目是利用Qt框架实现的一个网络聊天室,结合了TCP并发服务器、登录界面以及聊天室的基本...

    c#语言聊天室系统(客户端、服务器端)

    《C#语言构建聊天室系统:客户端与服务器端详解》 C#,作为一种高效且功能强大的编程语言,广泛应用于各种软件开发,特别是在Windows平台上的应用开发。本篇将深入探讨如何利用C#来构建一个聊天室系统,涵盖客户端...

    易语言局域网聊天室,支持表情,震动,禁言等等

    《易语言局域网聊天室:构建与技术详解》 在信息技术日新月异的今天,局域网内的即时通讯工具已经成为日常工作中不可或缺的一部分。易语言作为一款本土化的编程语言,以其简单易学的特点,为许多初级开发者提供了...

    聊天室,聊天室源代码

    【聊天室技术详解】 聊天室是一种在线实时通讯平台,它允许用户进行文本、语音或视频交流,具有实时性、互动性和社区性质。本篇将深入探讨聊天室的实现原理及其核心源代码,以"类似QQ的聊天室界面"为例。 一、聊天...

    语音聊天室

    3. **服务器端实现**:在“cgi语音聊天室”中,服务器端可能负责管理用户的连接、分配音视频流、处理多用户同步等任务。这可能需要高性能的服务器硬件和优化的服务器软件,如负载均衡、高可用性集群等。 4. **...

    易语言聊天室聊天工具

    《易语言聊天室聊天工具详解》 易语言聊天室是一款基于易语言开发的局域网内通信工具,专为用户提供便捷、高效的实时通讯服务。在最新版本V2.5中,该工具进行了重大升级,增加了丰富的功能,提升了用户体验,使其在...

    基于SIP聊天室系统

    **基于SIP聊天室系统详解** SIP(Session Initiation Protocol)是一种用于建立、修改和终止多媒体通信会话的协议,常用于VoIP(Voice over Internet Protocol)和即时通讯领域。一个基于SIP的聊天室系统是利用SIP...

    c语言实现的udp聊天室

    【描述】:“基于Linux网络编程视频实现的UDP聊天室,自己实现的管理用户的链表” 这个项目是在Linux环境下开发的,Linux作为开源操作系统,提供了丰富的网络编程接口,使得开发者可以直接操作网络套接字(socket)...

Global site tag (gtag.js) - Google Analytics