前言:
鉴于证券行业实施双录,本人秉承“热爱学习”的态度,就对AnyChat展开了”研究“。对于AnyChat的研究只作学习之用。
首先说一下,当前双录系统涉及的模块
AnyChat核心服务器----bin目录下server
AnyChat录像服务器----bin目录下recordserver
AnyChat业务服务器----src/server/java目录下AnyChat4SpringMVC(当前项目只展示了如何将 AnyChat Server SDK部署到Java Web容器中,没有业务逻辑,可根据自己业务需求增加业务逻辑),
当然,学习之初可以不自己开发AnyChat业务服务器,直接使用AnyChat里封装的业务服务器 (bin/serversdk目录下的AnyChatBussinessServer(C++).exe,直接打开)进行测试。
AnyChat客户服务器----AnyChatCoreSDK_Web_V6.3 SDK包中src目录下AnyChatWebDemo
解压SDK包后,建议首先阅读包中所有readme.txt,可以宏观了解AnyChat的结构
1、下载AnyChat SDK并安装
打开AnyChat官网 http://sdk.anychat.cn/html/download.html 下载AnyChat for Windows SDK和AnyChat for Web SDK。
解压下载的SDK包
(1)、启动AnyChat核心服务器。进入【bin/server】目录,点击run.bat,关于AnyChatCoreServer.ini是核心服务器的配置文件,后期业务需要可对其进行修改。
(2)、启动业务服务器;进入【bin\serversdk】目录,运行业务服务器“AnyChatBussinessServer(C++).exe”
(3)、启动录像服务器;进入【bin/recordserver】目录,点击run.bat,关于anychatrecordserver.ini是录像服务器的配置文件。如有需要可修改。
(4)、打开AnyChat for Web SDK解压包中 src\AnyChatWebDemo目录,使用IE浏览器打开index.html,根据提示安装插件。
图中标记位置填写本机IP地址。启动核心服务器时未对配置文件做修改的情况下,默认运行在评估模式下,登录帐号可以任意填写。登录成功后的页面
此时使用两台有摄像头有麦克的电脑使用IE浏览器进入同一房间后就可进行视频通话了。只是官方Demo没有给出视频录制与抓拍视频的代码。稍后我会贴出相关代码。
到这一步能够实现双方进行视频通话就算可以了。
2、实现视频录制与抓拍
先上代码,然后细说当时遇到的坑。。
//开始录制视频按钮事件(坐席)
$("#recordVideo").off().on('click', function () {
var recordFileName = $("#orderRecordId").val() + "_" + $("#orderFlowId").val() + "_" + $("#clientIp").val(); //录像文件名称以 “订单ID_订单流水ID_客户端IP地址”格式命名,便于业务服务器对文件进行改名、移动目录处理操作
var errorcode = BRAC_SetSDKOption(BRAC_SO_RECORD_TMPDIR, recordFileDirectory)
AddLog("BRAC_SetSDKOption(" + BRAC_SO_RECORD_TMPDIR + "," + recordFileDirectory + ")=" + errorcode, LOG_TYPE_API);
var dwDisableDateDir = 1;// 0-录制文件按日期分目录保存(默认) 1-录制文件不按日期分目录保存
var errorcode = BRAC_SetSDKOption(BRAC_SO_RECORD_DISABLEDATEDIR, dwDisableDateDir)
AddLog("BRAC_SetSDKOption(BRAC_SO_RECORD_DISABLEDATEDIR=" + BRAC_SO_RECORD_DISABLEDATEDIR + "," + dwDisableDateDir + ")=" + errorcode, LOG_TYPE_API);
var lpUserStr = '{"filename":"' + recordFileName + '"}';
//BRAC_RECORD_FLAGS_SERVER 触发业务服务器录像回调函数 OnAnyChatServerRecordExCallBack BRAC_RECORD_FLAGS_LOCALCB-本地回调
var dwFlags = ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO + ANYCHAT_RECORD_FLAGS_MIXAUDIO + ANYCHAT_RECORD_FLAGS_MIXVIDEO + ANYCHAT_RECORD_FLAGS_ABREAST + ANYCHAT_RECORD_FLAGS_USERFILENAME + BRAC_RECORD_FLAGS_SERVER + BRAC_RECORD_FLAGS_LOCALCB;
var errorcode = BRAC_StreamRecordCtrlEx(mSelfUserId, 1, dwFlags, 0, lpUserStr);
if (errorcode == 0) {
countTimer()
}
AddLog("BRAC_StreamRecordCtrlEx(" + mSelfUserId + ",1," + dwFlags + ",0," + lpUserStr + ")=" + errorcode, LOG_TYPE_API);
});
//停止视频按钮事件
$("#stopVideo").off().on('click', function () {
if (confirm("确认是否停止录制,停止后无法重新开始!")) {
var dwFlags = ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO + ANYCHAT_RECORD_FLAGS_MIXAUDIO + ANYCHAT_RECORD_FLAGS_MIXVIDEO + ANYCHAT_RECORD_FLAGS_ABREAST + ANYCHAT_RECORD_FLAGS_USERFILENAME + BRAC_RECORD_FLAGS_SERVER + BRAC_RECORD_FLAGS_LOCALCB;
var errorcode = BRAC_StreamRecordCtrl(mSelfUserId, 0, dwFlags, 0);
if (errorcode == 0) {
resetCountTimer();
}
AddLog("BRAC_StreamRecordCtrl(" + mSelfUserId + ",0," + dwFlags + ",0," + ")=" + errorcode, LOG_TYPE_API);
} else {
}
});
//开始视频抓拍按钮事件(坐席)
$("#videoSnapShot").off().on('click', function () {
var recordFileName = $("#orderRecordId").val() + "_" + $("#orderFlowId").val() + "_" + $("#clientIp").val(); //录像文件名称以 “订单ID_订单流水ID_客户端IP地址”格式命名,便于业务服务器对文件进行改名、移动目录处理操作
var errorcode = BRAC_SetSDKOption(BRAC_SO_SNAPSHOT_TMPDIR, imageFileDirectory);
AddLog("BRAC_SetSDKOption(" + BRAC_SO_SNAPSHOT_TMPDIR + "," + imageFileDirectory + ")=" + errorcode, LOG_TYPE_API);
var lpUserStr = '{"filename":"' + recordFileName + '"}';
//var dwDisableDateDir = 1;// 0-录制文件按日期分目录保存(默认) 1-录制文件不按日期分目录保存 对抓拍不生效!!待解决
//var errorcode = BRAC_SetSDKOption(BRAC_SO_RECORD_DISABLEDATEDIR,dwDisableDateDir)
//AddLog("BRAC_SetSDKOption("+BRAC_SO_RECORD_DISABLEDATEDIR + "," + dwDisableDateDir + ")=" + errorcode, LOG_TYPE_API)
var dwFlags = BRAC_RECORD_FLAGS_SNAPSHOT + ANYCHAT_RECORD_FLAGS_USERFILENAME + BRAC_RECORD_FLAGS_SERVER + BRAC_RECORD_FLAGS_LOCALCB;
//var errorcode = BRAC_SnapShot(mSelfUserId,dwFlags,0);
//AddLog("BRAC_SnapShot("+mSelfUserId+","+dwFlags+",0" + ")=" + errorcode, LOG_TYPE_API);
var errorcode = BRAC_StreamRecordCtrlEx(mTargetUserId, 1, dwFlags, 0, lpUserStr);
AddLog("BRAC_StreamRecordCtrlEx(" + mTargetUserId + ",1," + dwFlags + ",0" + lpUserStr + ")=" + errorcode, LOG_TYPE_API);
});
//开始录制视频按钮事件(坐席)
$("#recordVideo").off().on('click', function () {
var recordFileName = $("#orderRecordId").val() + "_" + $("#orderFlowId").val() + "_" + $("#clientIp").val(); //录像文件名称以 “订单ID_订单流水ID_客户端IP地址”格式命名,便于业务服务器对文件进行改名、移动目录处理操作
var errorcode = BRAC_SetSDKOption(BRAC_SO_RECORD_TMPDIR, recordFileDirectory)
AddLog("BRAC_SetSDKOption(" + BRAC_SO_RECORD_TMPDIR + "," + recordFileDirectory + ")=" + errorcode, LOG_TYPE_API);
var dwDisableDateDir = 1;// 0-录制文件按日期分目录保存(默认) 1-录制文件不按日期分目录保存
var errorcode = BRAC_SetSDKOption(BRAC_SO_RECORD_DISABLEDATEDIR, dwDisableDateDir)
AddLog("BRAC_SetSDKOption(BRAC_SO_RECORD_DISABLEDATEDIR=" + BRAC_SO_RECORD_DISABLEDATEDIR + "," + dwDisableDateDir + ")=" + errorcode, LOG_TYPE_API);
var lpUserStr = '{"filename":"' + recordFileName + '"}';
//BRAC_RECORD_FLAGS_SERVER 触发业务服务器录像回调函数 OnAnyChatServerRecordExCallBack BRAC_RECORD_FLAGS_LOCALCB-本地回调
var dwFlags = ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO + ANYCHAT_RECORD_FLAGS_MIXAUDIO + ANYCHAT_RECORD_FLAGS_MIXVIDEO + ANYCHAT_RECORD_FLAGS_ABREAST + ANYCHAT_RECORD_FLAGS_USERFILENAME + BRAC_RECORD_FLAGS_SERVER + BRAC_RECORD_FLAGS_LOCALCB;
var errorcode = BRAC_StreamRecordCtrlEx(mSelfUserId, 1, dwFlags, 0, lpUserStr);
if (errorcode == 0) {
countTimer()
}
AddLog("BRAC_StreamRecordCtrlEx(" + mSelfUserId + ",1," + dwFlags + ",0," + lpUserStr + ")=" + errorcode, LOG_TYPE_API);
});
//停止视频按钮事件
$("#stopVideo").off().on('click', function () {
if (confirm("确认是否停止录制,停止后无法重新开始!")) {
var dwFlags = ANYCHAT_RECORD_FLAGS_VIDEO + ANYCHAT_RECORD_FLAGS_AUDIO + ANYCHAT_RECORD_FLAGS_MIXAUDIO + ANYCHAT_RECORD_FLAGS_MIXVIDEO + ANYCHAT_RECORD_FLAGS_ABREAST + ANYCHAT_RECORD_FLAGS_USERFILENAME + BRAC_RECORD_FLAGS_SERVER + BRAC_RECORD_FLAGS_LOCALCB;
var errorcode = BRAC_StreamRecordCtrl(mSelfUserId, 0, dwFlags, 0);
if (errorcode == 0) {
resetCountTimer();
}
AddLog("BRAC_StreamRecordCtrl(" + mSelfUserId + ",0," + dwFlags + ",0," + ")=" + errorcode, LOG_TYPE_API);
} else {
}
});
//开始视频抓拍按钮事件(坐席)
$("#videoSnapShot").off().on('click', function () {
var recordFileName = $("#orderRecordId").val() + "_" + $("#orderFlowId").val() + "_" + $("#clientIp").val(); //录像文件名称以 “订单ID_订单流水ID_客户端IP地址”格式命名,便于业务服务器对文件进行改名、移动目录处理操作
var errorcode = BRAC_SetSDKOption(BRAC_SO_SNAPSHOT_TMPDIR, imageFileDirectory);
AddLog("BRAC_SetSDKOption(" + BRAC_SO_SNAPSHOT_TMPDIR + "," + imageFileDirectory + ")=" + errorcode, LOG_TYPE_API);
var lpUserStr = '{"filename":"' + recordFileName + '"}';
//var dwDisableDateDir = 1;// 0-录制文件按日期分目录保存(默认) 1-录制文件不按日期分目录保存 对抓拍不生效!!待解决
//var errorcode = BRAC_SetSDKOption(BRAC_SO_RECORD_DISABLEDATEDIR,dwDisableDateDir)
//AddLog("BRAC_SetSDKOption("+BRAC_SO_RECORD_DISABLEDATEDIR + "," + dwDisableDateDir + ")=" + errorcode, LOG_TYPE_API)
var dwFlags = BRAC_RECORD_FLAGS_SNAPSHOT + ANYCHAT_RECORD_FLAGS_USERFILENAME + BRAC_RECORD_FLAGS_SERVER + BRAC_RECORD_FLAGS_LOCALCB;
//var errorcode = BRAC_SnapShot(mSelfUserId,dwFlags,0);
//AddLog("BRAC_SnapShot("+mSelfUserId+","+dwFlags+",0" + ")=" + errorcode, LOG_TYPE_API);
var errorcode = BRAC_StreamRecordCtrlEx(mTargetUserId, 1, dwFlags, 0, lpUserStr);
AddLog("BRAC_StreamRecordCtrlEx(" + mTargetUserId + ",1," + dwFlags + ",0" + lpUserStr + ")=" + errorcode, LOG_TYPE_API);
});
3、常见问题
1、开始录制视频与结束录制视频的dwFlags要相同,不然无法正常执行结束视频录制。
ANYCHAT_RECORD_FLAGS_VIDEO:录制视频
ANYCHAT_RECORD_FLAGS_AUDIO:录制音频
ANYCHAT_RECORD_FLAGS_MIXAUDIO:录制音频时,将其它人的声音混音后录制
ANYCHAT_RECORD_FLAGS_MIXVIDEO:录制视频时,将其它人的视频迭加后录制
ANYCHAT_RECORD_FLAGS_ABREAST:录制视频时,将其它人的视频并列录制
ANYCHAT_RECORD_FLAGS_USERFILENAME:用户自定义文件名
BRAC_RECORD_FLAGS_SERVER:服务器端录制
BRAC_RECORD_FLAGS_LOCALCB:触发本地回调
当然,还有其他很多参数,anychatsdk.js中都有定义和注解
2、录像和图片默认保存位置为插件安装目录的record目录中。当时录制成功后,找不到相关视频,还以为没录制成功。0.0。
3、可以在录像服务器(recordserver)安装目录中的anychatrecordserver.ini配置文件中修改录像保存位置。recordrootdir = D:\record,我保存到了D:record文件夹中。
4、有些业务是需要修改录像文件名称的。这里提供两种思路
(1)、录制时,设置文件名称。如图
(
(2)、可以在业务服务器中修改录像名称,并使用moveFile修改文件路径。(录像成功后,会触发业务服务器中的相关方法。)
5、当前anychat版本虽然开发了anychat4html5相关js,但并不完善,两台电脑不能正常通信,只能看到自己的视频影像,而且暂时未封装录制抓拍方法,如果有开发htlm5版本的想法,请联系AnyChat官方。
6、评估版本下,每次视频最多维持通信15分钟,超过15分钟会被强制下线(结束视频录制,并退出房间),而且最多同时创建五个房间。建议商用的联系官方购买授权。支持正版,人人有责。
7、房间资源回收很给力啊,当所有用户退出房间,当前房间资源在几秒中就会被回收。手动赞。