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

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

一、初始化

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

01.// 打开(关闭)的日志记录功能

02.BRAC_ActiveCallLog(TRUE);

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) 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);

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));

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));

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));

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)); 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: ,则SDK内部将会把视频显示到指定的窗体的指定位置(在指定位置上自动迭加一个视频窗口); BRAC_SetVideoPos

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接口,但是释放资源后,将不再工作。

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

转载于:https://my.oschina.net/u/2298974/blog/364223

独家揭秘语音视频聊天室开发顶尖制作教程相关推荐

  1. 网页的视频聊天室开发

    现在网上很多朋友在弄网页的视频聊天室 通过学习,我自己也做了个简单的小例子,几十行JavaScript脚本就能轻松实现视频通话:也不用去下载指定的什么浏览器,因为IE.firefox.chrome等w ...

  2. 类似YY 9158网页版多人语音视频聊天室远程教学系统源码

    仿六间房网页视频聊天室 网页视频直播系统源码 开发采用FMS加flash只需在网页上就可发布视频直播,无需安装插件儿 主要应用远程教育,培训,远程视频直播(类似6间房聊天室) 视频采用H264压缩一路 ...

  3. 即时通讯 音视频聊天室开发建议

    目前网上视频聊天室.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕 捉和网络传输技术,根本就难不倒你.本文详细介绍了如何利用别人 ...

  4. 基于webrtc的点对点音视频聊天室开发|spring+vue.js

    WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...

  5. 网站在线客服系统实时语音视频聊天实战开发,利用peerjs vue.js实现webRTC网页音视频客服系统...

    webRTC机制和peerjs库的介绍在其他博客中已经有了很多介绍,这里我直接搬运过来 一.webrtc回顾 WebRTC(Web Real-Time Communication)即:网页即时通信. ...

  6. FMS案例开发--视频聊天室(三)

    本文要介绍的内容主要有利用SharedObject来实现聊天文字聊天和在线用户的列表,以及实现语音视频聊天等. 前一篇文章介绍了实现用户注册和登录的功能,本文接着介绍用户注册并成功登录后的相关功能开发 ...

  7. Flex与.NET互操作(十六):FluorineFx + Flex视频聊天室案例开发

    本文将使用FluorineFx和Flex结合介绍一个简单的视频聊天室案例开发,希望通过此篇和大家交流FluorineFx和Flex的相关技术,同时也希望本篇可以帮助到需要使用FluorineFx做及时 ...

  8. 网络视频聊天室的开发指南

    目前网上视频聊天室.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕 捉和网络传输技术,根本就难不倒你.本文详细介绍了如何利用别人 ...

  9. FluorineFx + Flex视频聊天室案例开发----客户端

    上一篇<FluorineFx + Flex视频聊天室案例开发----服务器端>详细的介绍了如何利用FluorineFx开发一个及时通信的视频聊天室服务器处理程序,并通过Web网站来宿主这个 ...

最新文章

  1. Android 中文 API 文档 (45) —— AbsoluteLayout.LayoutParams
  2. C++vector容器学习
  3. Matplotlib实例教程(九)热力图
  4. Cocos2d-x:使用九宫格(九切片)自定义缩放资源
  5. php nginx配置404页面,Nginx实现404页面的几种方法
  6. SharePoint工作流开发点滴(2) - 开发第一个SharePiont工作流: HelloWorldSequential 的注意事项...
  7. 云计算及应用课程知识整理
  8. jrockit_1.6下载_Oracle JRockit Mission Control 4.1发布
  9. 分析微博游戏名人数据
  10. iOS人脸识别 用苹果api<AVFoundation/AVFoundation.h>
  11. Struts2快速入门,超简单详细的快速入门教程
  12. QTcpSocket目录文件传输
  13. 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
  14. 如何从git中移除一个子模块(submodule)
  15. 济南:建设中国软件名城
  16. mat1 and mat2 shapes cannot be multiplied (128x432 and 576x64)的解决
  17. 使用javascript抓取网站数据
  18. PostgreSQL , PostGIS , 球坐标 , 平面坐标 , 球面距离 , 平面距离
  19. 3.1 控制器之ReplicaSet/ReplicationController
  20. 第八章 强制类型转换

热门文章

  1. OpenJudge NOI题库 1.5编程基础之循环控制
  2. 该模型在额定以下采用MTPA控制,速度环输出给定电流,然后代入MTPA得到dq电流,电压反馈环输出超前角进行弱磁
  3. SP(软件过程)的发展历程2:计划驱动软件开发过程时代
  4. 如何在VS201里引用ActiveX类型的引用
  5. 美军征集降落伞RFID跟踪系统信息
  6. Java OA集成SAP BO
  7. 亲测好用的数据恢复软件:Disk Drill Mac中文版
  8. 基于51单片机的电流电压过流过压监测声光报警器proteus仿真原理图PCB
  9. Guía de Inversión Minera en Argentina阿根廷矿业投资指引
  10. 不用再找了,SQLMap基础命令合集版来了