AnyChat技术支持论坛

标题: AnyChat视频呼叫业务逻辑详解 [打印本页]

作者: 佰锐技术-卓剑锐    时间: 2013-9-6 15:12
标题: AnyChat视频呼叫业务逻辑详解
本帖最后由 佰锐技术-卓剑锐 于 2014-10-11 11:31 编辑

新版本AnyChat已经内置视频呼叫(VideoCall)业务逻辑,简化应用层开发工作量,下面详细讲解视频呼叫业务逻辑:
一、视频呼叫业务逻辑概述
视频呼叫业务逻辑主要实现两个终端(PC、手机、Pad等)之间的通话请求流程控制,包括请求(Request)、回复(Reply)、开始(Start)以及结束(Finish)等过程,可以形象理解为打电话的流程:拨号、等待、通话、挂断。

二、视频呼叫业务逻辑流程图


三、视频呼叫业务逻辑API接口
客户端新增回调函数:

  1. // 视频通话消息通知回调函数定义
  2. typedef void (CALLBACK * BRAC_VideoCallEvent_CallBack)(DWORD dwEventType, DWORD dwUserId, DWORD dwErrorCode, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr, LPVOID lpUserValue);
  3. // 设置视频通话消息通知回调函数
  4. BRAC_API DWORD BRAC_SetVideoCallEventCallBack(BRAC_VideoCallEvent_CallBack lpFunction, LPVOID lpUserValue);
复制代码
客户端新增API接口:

  1. // 视频呼叫事件控制(请求、回复、挂断等)
  2. BRAC_API DWORD BRAC_VideoCallControl(DWORD dwEventType, DWORD dwUserId, DWORD dwErrorCode, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr);
复制代码
服务器新增回调函数

  1. // 视频通话消息通知回调函数定义
  2. typedef DWORD (CALLBACK * BRAS_OnVideoCallEvent_CallBack)(DWORD dwEventType, DWORD dwSrcUserId, DWORD dwTarUserId, DWORD dwErrorCode, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr, LPVOID lpUserValue);
  3. // 设置视频通话消息通知回调函数
  4. BRAS_API DWORD BRAS_SetOnVideoCallEventCallBack(BRAS_OnVideoCallEvent_CallBack lpFunction, LPVOID lpUserValue=NULL);
复制代码
服务器新增API接口:

  1. // 视频呼叫事件控制(请求、回复、挂断等)
  2. BRAS_API DWORD BRAS_VideoCallControl(DWORD dwEventType, DWORD dwUserId, DWORD dwErrorCode, DWORD dwFlags, DWORD dwParam, LPCTSTR lpUserStr);

复制代码
常量定义

  1. // 视频呼叫事件类型定义(API:BRAC_VideoCallControl 传入参数、VideoCallEvent回调参数)
  2. #define BRAC_VIDEOCALL_EVENT_REQUEST              1        ///< 呼叫请求
  3. #define BRAC_VIDEOCALL_EVENT_REPLY                2        ///< 呼叫请求回复
  4. #define BRAC_VIDEOCALL_EVENT_START                3        ///< 视频呼叫会话开始事件
  5. #define BRAC_VIDEOCALL_EVENT_FINISH               4        ///< 挂断(结束)呼叫会话

  6. // 视频呼叫标志定义(API:BRAC_VideoCallControl 传入参数)
  7. #define BRAC_VIDEOCALL_FLAGS_AUDIO             0x01        ///< 语音通话
  8. #define BRAC_VIDEOCALL_FLAGS_VIDEO             0x02        ///< 视频通话
  9. #define BRAC_VIDEOCALL_FLAGS_FBSRCAUDIO        0x10        ///< 禁止源(呼叫端)音频
  10. #define BRAC_VIDEOCALL_FLAGS_FBSRCVIDEO        0x20        ///< 禁止源(呼叫端)视频
  11. #define BRAC_VIDEOCALL_FLAGS_FBTARAUDIO        0x40        ///< 禁止目标(被呼叫端)音频
  12. #define BRAC_VIDEOCALL_FLAGS_FBTARVIDEO        0x80        ///< 禁止目标(被呼叫端)视频

  13. // 视频呼叫
  14. #define AC_ERROR_VIDEOCALL_CANCEL             100101       ///< 源用户主动放弃会话
  15. #define AC_ERROR_VIDEOCALL_OFFLINE            100102       ///< 目标用户不在线
  16. #define AC_ERROR_VIDEOCALL_BUSY               100103       ///< 目标用户忙
  17. #define AC_ERROR_VIDEOCALL_REJECT             100104       ///< 目标用户拒绝会话
  18. #define AC_ERROR_VIDEOCALL_TIMEOUT            100105       ///< 会话请求超时
  19. #define AC_ERROR_VIDEOCALL_DISCONNECT         100106       ///< 网络断线
复制代码
四、其它
1、客户端API(BRAC_VideoCallControl)和回调函数(BRAC_VideoCallEvent_CallBack)中的dwUserId均为对方的用户ID;2、被呼叫方拒绝通话时,发送回复(Reply)指令,dwErrorCode=100104;
3、被呼叫方同意通话时,发送回复(Reply)指令,dwErrorCode=0,然后服务器会向双方发送通话开始(Start)指令,dwParam=RoomId,房间号由核心服务器自动分配;
4、结束通话时,任何一方(包括业务服务器)均可以发送结束(Finish)指令,然后服务器会向双方发送通话结束(Finish)指令;
5、业务服务器可干预呼叫流程:在BRAS_OnVideoCallEvent_CallBack收到呼叫请求指令后,返回0表示允许呼叫,否则为出错代码,不允许呼叫;在会话过程中可以发送结束(Finish)指令,强制挂断指定用户的通话;
6、API接口中的dwParam(整型)、lpUserStr(字符串)均为用户自定义用途;
7、一个用户同时只能发起一路呼叫请求,也同时只能被一个用户呼叫;
8、视频呼叫业务流程可以脱离业务服务器,由核心服务器独立支撑,可以不需要在服务器端进行二次开发。








作者: 廖斌    时间: 2013-9-10 10:55
本帖最后由 廖斌 于 2013-10-12 14:07 编辑

下面android端为例,展示实现视频呼叫业务逻辑的整个过程(代码仅供参考,根据实际情况调用)
一、设置呼叫回调事件接收
用户收到呼叫请求、请求回复、会话开始、会话结束等事件都是在呼叫回调事件中处理的。
1、首先要在目标activity中实现AnyChatVideoCallEvent接口
2、然后在接收之前设置回调接收anychat.SetVideoCallEvent(this);

二、发送呼叫请求
1、用户A请求呼叫用户B,调用如下代码:
  1. anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, useridB, 0, 0,0, "usernameA")
复制代码
发送呼叫请求。
其中“AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST”为请求呼叫类型,“useridB”为用户B的userId,“usernameA”是自定义参数(这里可以传送A的userName)。
2、服务器接收到之后会判断B用户是否在线、是否正在呼叫,并返回“呼叫请求回复”给A,A触发OnAnyChatVideoCallEvent。
  1.         public void OnAnyChatVideoCallEvent(int dwEventType, final int dwUserId,
  2.                         int dwErrorCode, final int dwFlags, final int dwParam, final String userStr) {
  3.                 // TODO Auto-generated method stub
  4.                 switch(dwEventType)
  5.                 {
  6.                 case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY:
  7.                         switch(dwErrorCode)
  8.                         {
  9.                         case AnyChatDefine.RETURNCODE_SUCCESS:
  10.                                 showToast("呼叫成功,请等待");
  11.                                  dialogCall=new ProgressDialog(this);
  12.                                 dialogCall.setMessage("呼叫成功,请等待");
  13.                         dialogCall.setButton("取消呼叫", new DialogInterface.OnClickListener() {
  14.                                 
  15.                                 @Override
  16.                                 public void onClick(DialogInterface dialog, int which) {
  17.                                         // TODO Auto-generated method stub
  18.                                         anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, dwUserId, AnyChatDefine.RETURNCODE_SESSION_QUIT, dwFlags, 30, anychat.GetUserName(-1));
  19.                                 }
  20.                         });
  21.                                 dialogCall.show();
  22.                                 
  23.                                 break;
  24.                         case AnyChatDefine.RETURNCODE_SESSION_BUSY:
  25.                                 showToast("目标用户忙");
  26.                                 break;
  27.                         case AnyChatDefine.RETURNCODE_SESSION_DISCONNECT:
  28.                                 showToast("网络断线");
  29.                                 break;
  30.                         case AnyChatDefine.RETURNCODE_SESSION_OFFLINE:
  31.                                 showToast("目标用户不在线");
  32.                                 break;
  33.                         case AnyChatDefine.RETURNCODE_SESSION_QUIT:
  34.                                 showToast("源用户主动放弃会话");
  35.                                 break;
  36.                         case AnyChatDefine.RETURNCODE_SESSION_REFUSE:
  37.                                 showToast("目标用户拒绝会话");
  38.                                 if(dialogCall!=null)
  39.                                         dialogCall.dismiss();
  40.                                 break;
  41.                         case AnyChatDefine.RETURNCODE_SESSION_TIMEOUT:
  42.                                 showToast("会话请求超时");
  43.                                 break;
  44.                                 
  45.                                 
  46.                         }
  47.                         break;
复制代码
3、如B是空闲的,服务器会转发“请求指令”给B,B触发OnAnyChatVideoCallEvent
  1.         switch(dwEventType)
  2.                 {
  3.                 case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST:
  4.                          dialogRequest = new AlertDialog.Builder(this).setPositiveButton("同意", new DialogInterface.OnClickListener() {
  5.                                        
  6.                                         @Override
  7.                                         public void onClick(DialogInterface dialog, int which) {
  8.                                                 // TODO Auto-generated method stub
  9.                                                 targetUserId=String.valueOf(dwUserId);
  10.                                                 anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, dwUserId, AnyChatDefine.RETURNCODE_SUCCESS, dwFlags, 10, anychat.GetUserName(-1));
  11.                                         }
  12.                                 }).setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
  13.                                        
  14.                                         @Override
  15.                                         public void onClick(DialogInterface dialog, int which) {
  16.                                                 // TODO Auto-generated method stub
  17.                                                 Log.i("ANYCHAT", "REPLY:"+"EVENT:"+AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY+"dwUserId:"+dwUserId+"ERRORCODE:"+AnyChatDefine.RETURNCODE_SESSION_REFUSE+"NAME:"+anychat.GetUserName(-1));
  18.                                                 anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, dwUserId, AnyChatDefine.RETURNCODE_SESSION_REFUSE, dwFlags, 20, anychat.GetUserName(-1));
  19.                                         }
  20.                                 }).setMessage(userStr+":请求通话").create();
  21.                          dialogRequest.show();
复制代码
三、呼叫请求回复
B收到“请求指令之后”之后,可以回复A的请求。
1、同意通话,调用
  1.         anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, useridA, AnyChatDefine.RETURNCODE_SUCCESS, dwFlags, 10, anychat.GetUserName(-1));
复制代码
其中useridA为用户A的userId,10、anychat.GetUserName(-1)都是用户自定义参数
2、拒绝通话,调用
anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, useridA, AnyChatDefine.RETURNCODE_SESSION_REFUSE, dwFlags, 20, anychat.GetUserName(-1));
其中useridA为用户A的userId,20、anychat.GetUserName(-1)都是用户自定义参数。A端触发OnAnyChatVideoCallEvent,可以得知B拒绝通话
  1.         case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY:
  2.                         switch(dwErrorCode)
  3.                         {
  4.                         case AnyChatDefine.RETURNCODE_SESSION_REFUSE:
  5.                                 showToast("目标用户拒绝会话");
  6.                                 if(dialogCall!=null)
  7.                                         dialogCall.dismiss();
  8.                                 break;
复制代码
3、取消呼叫
A端此时可以取消呼叫,调用
  1. anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, useridB, AnyChatDefine.RETURNCODE_SESSION_QUIT, dwFlags, 30, anychat.GetUserName(-1));
复制代码
B端将触发OnAnyChatVideoCallEvent
  1.         case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY:
  2.                         switch(dwErrorCode)
  3.                         {
  4.                         case AnyChatDefine.RETURNCODE_SESSION_QUIT:
  5.                                 showToast("源用户主动放弃会话");
  6.                                 break;
复制代码
四、会话开始
B端发送“同意会话回复”之后,服务器端将向A、B同时发送“会话开始”指令,A和B将触发OnAnyChatVideoCallEvent
  1. public void OnAnyChatVideoCallEvent(int dwEventType, final int dwUserId,
  2.                         int dwErrorCode, final int dwFlags, final int dwParam, final String userStr) {
  3.                 // TODO Auto-generated method stub
  4.                 switch(dwEventType)
  5.                 {
  6.                 case AnyChatDefine.BRAC_VIDEOCALL_EVENT_START:
  7.                         anychat.LeaveRoom(-1);
  8.                          Intent intent=new Intent();
  9.                            intent.putExtra("UserID",targetUserId);
  10.                            intent.putExtra("ROOMID",dwParam);
  11.                            intent.setClass(RoomActivity.this, VideoActivity.class);
  12.                        startActivity(intent);
  13.                         break;
复制代码
其中dwParam是roomId,A和B收到之后可以进入同一房间进行音视频通话。

五、会话结束
B或者A任何一方发送会话结束指令,调用
  1. anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_FINISH, userID, 0, 0, 0, "");
复制代码
其中userID为对方的useId.此时A、B将会触发“呼叫结束事件”OnAnyChatVideoCallEvent
  1. public void OnAnyChatVideoCallEvent(int dwEventType, int dwUserId,
  2.                         int dwErrorCode, int dwFlags, int dwParam, String userStr) {
  3.                 // TODO Auto-generated method stub
  4.                 public void OnAnyChatVideoCallEvent(int dwEventType, final int dwUserId,
  5.                         int dwErrorCode, final int dwFlags, final int dwParam, final String userStr) {
  6.                 // TODO Auto-generated method stub
  7.                 switch(dwEventType)
  8.                 {
  9. case AnyChatDefine.BRAC_VIDEOCALL_EVENT_FINISH:
  10.                         Toast.makeText(this, "通话结束",Toast.LENGTH_LONG).show();
  11.                         this.finish();
  12.                 }
复制代码
六、附录,errorcode定义
        public static final int RETURNCODE_SUCCESS=0;
        public static final int RETURNCODE_SESSION_QUIT = 100101;// 源用户主动放弃会话
        public static final int RETURNCODE_SESSION_OFFLINE = 100102;// 目标用户不在线
        public static final int RETURNCODE_SESSION_BUSY = 100103;// 目标用户忙
        public static final int RETURNCODE_SESSION_REFUSE = 100104;// 目标用户拒绝会话
        public static final int RETURNCODE_SESSION_TIMEOUT = 100105;//会话请求超时
        public static final int RETURNCODE_SESSION_DISCONNECT= 100106;// 网络断线
作者: KeepGoing2013    时间: 2013-10-11 16:10
廖斌 发表于 2013-9-10 10:55
下面android端为例,展示实现视频呼叫业务逻辑的整个过程
一、设置呼叫回调事件接收
用户收到呼叫请求、 ...

请问实现以上逻辑,需要服务器二次开发吗?
1.如果不需要的话,A呼叫B 执行
anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, useridB, 0, 0,0, "usernameA")
OnAnyChatVideoCallEvent ()方法无响应.
2.如果需要的话,能否提供代码
谢谢

作者: admin    时间: 2013-10-11 16:14
您好,服务器端不需要进行二次开发,该业务逻辑可以单独由核心服务器来实现,即可以不倚赖业务服务器。

执行方法“anychat.VideoCallControl”无响应,请确认两边客户端、服务器都是最新版本。
作者: KeepGoing2013    时间: 2013-10-11 16:34
admin 发表于 2013-10-11 16:14
您好,服务器端不需要进行二次开发,该业务逻辑可以单独由核心服务器来实现,即可以不倚赖业务服务器。

...

服务器端是最新版本
android客户端是我下载官方demo后修改的
官方demo中点击用户执行以下方法, 但对方无任何提示.
                 Intent intent = new Intent();
                intent.putExtra("UserID", idList.get(position));
                intent.setClass(RoomActivity.this, VideoActivity.class);
                startActivity(intent);,
我修改为下面的方法,请问是否正确.--------
                anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST,
                                Integer.parseInt(idList.get(position)), 0, 0, 0, "usernameA");
谢谢.
作者: 廖斌    时间: 2013-10-11 16:50
KeepGoing2013 发表于 2013-10-11 16:34
服务器端是最新版本
android客户端是我下载官方demo后修改的
官方demo中点击用户执行以下方法, 但对方 ...

可以的。android业务流程描述中的代码还没有更新到网上,还是老的代码
作者: KeepGoing2013    时间: 2013-10-11 16:57
廖斌 发表于 2013-10-11 16:50
可以的。android业务流程描述中的代码还没有更新到网上,还是老的代码

回调接收anychat.SetVideoCallEvent(this)也已经设置,但是OnAnyChatVideoCallEvent()方法无响应.
谢谢
作者: 廖斌    时间: 2013-10-11 17:05
您设置的SetVideoCallEvent在什么地方呢?另外最新的核心服务器才支持业务呼叫逻辑,你连接的服务器是什么版本的?
作者: KeepGoing2013    时间: 2013-10-11 17:09
廖斌 发表于 2013-10-11 17:05
您设置的SetVideoCallEvent在什么地方呢?另外最新的核心服务器才支持业务呼叫逻辑,你连接的服务器是什么 ...

private void InitialSDK() {
                anychat = new AnyChatCoreSDK();
                anychat.SetBaseEvent(this);
                anychat.SetTextMessageEvent(this);
                anychat.SetVideoCallEvent(this);
        }
服务器版本是v4.8
谢谢
作者: admin    时间: 2013-10-11 17:20
您好,请将客户端、服务器的log均帖上来我们帮您分析一下,谢谢!
作者: 廖斌    时间: 2013-10-11 17:21
恩。可以将您的服务器日志发上来看下。另外可以将VideoCallControl的返回值输出下看看
作者: KeepGoing2013    时间: 2013-10-11 19:32
廖斌 发表于 2013-10-11 17:21
恩。可以将您的服务器日志发上来看下。另外可以将VideoCallControl的返回值输出下看看

10-11 19:24:47.369: INFO/ANYCHAT(1300): 19:24:47(382)    Invoke    BRAC_VideoCallControl(EventType:1, UserId:-2, ErrorCode:0, dwFlags:0, dwParam:0, UserStr:usernameA)=0
这是android客户端调用VideoCallControl方法后,控制台打印的日志,也就是说VideoCallControl方法的返回值是0.
请问服务器日志是AnyChatCoreSDK_Win32_r3569\bin\server\AnyChatCoreServer.log中的内容吗?
谢谢
作者: admin    时间: 2013-10-11 19:48
请问服务器日志是AnyChatCoreSDK_Win32_r3569\bin\server\AnyChatCoreServer.log中的内容吗?

您好,您的SDK版本是r3569,视频呼叫需要 r3664及之后的版本才能支持,请参考:
http://bbs.anychat.cn/forum.php? ... =149&extra=page%3D1

所以请您重新下载最新版本的SDK包:http://www.anychat.cn
作者: KeepGoing2013    时间: 2013-10-11 20:12
admin 发表于 2013-10-11 19:48
您好,您的SDK版本是r3569,视频呼叫需要 r3664及之后的版本才能支持,请参考:
http://bbs.anychat.cn/ ...

好的,我试试,非常感谢两位.
作者: KeepGoing2013    时间: 2013-10-11 20:17
admin 发表于 2013-10-11 19:48
您好,您的SDK版本是r3569,视频呼叫需要 r3664及之后的版本才能支持,请参考:
http://bbs.anychat.cn/ ...

不好意思,还得麻烦您一下
http://www.anychat.cn/download.html
下载的服务器SDK还是r3569.请问哪里可以下载最新的.
谢谢
作者: admin    时间: 2013-10-11 20:46
您好,我刚才从网上下载的AnyChat for Windows SDK是:AnyChatCoreSDK_Win32_r3673,您试一下?
作者: KeepGoing2013    时间: 2013-10-11 21:07
admin 发表于 2013-10-11 20:46
您好,我刚才从网上下载的AnyChat for Windows SDK是:AnyChatCoreSDK_Win32_r3673,您试一下?

嗯,是我看错了,不好意思,辛苦!
谢谢
作者: KeepGoing2013    时间: 2013-10-11 21:20
廖斌 发表于 2013-10-11 17:21
恩。可以将您的服务器日志发上来看下。另外可以将VideoCallControl的返回值输出下看看

我调试成功了,万分感谢.
作者: KeepGoing2013    时间: 2013-10-11 21:20
admin 发表于 2013-10-11 20:46
您好,我刚才从网上下载的AnyChat for Windows SDK是:AnyChatCoreSDK_Win32_r3673,您试一下?

我调试成功了,万分感谢.
作者: KeepGoing2013    时间: 2013-10-12 11:44
廖斌 发表于 2013-10-11 17:21
恩。可以将您的服务器日志发上来看下。另外可以将VideoCallControl的返回值输出下看看

A呼叫B的业务逻辑已经实现,但是出现没有对方图像和声音的问题.
请问是否是
                case AnyChatDefine.BRAC_VIDEOCALL_EVENT_START:
                        anychat.LeaveRoom(-1);
                         Intent intent=new Intent();
                           intent.putExtra("UserID",targetUserId);
                           intent.putExtra("ROOMID",dwParam);
                           intent.setClass(RoomActivity.this, VideoActivity.class);
                       startActivity(intent);
                        break;
targetUserId参数错误,请问此参数是何含义,?
作者: 廖斌    时间: 2013-10-12 11:51
您好。targetUserId是目标对象的用户id,比如说A呼叫B,那么A中回调中targetUserId就是B的userid。dwParam是房间号。A和B双方收到房间号后。进入共同的房间。需要在VideoActivity进入共同房间,然后打开自己和他人的音视频。
作者: KeepGoing2013    时间: 2013-10-12 12:08
廖斌 发表于 2013-10-12 11:51
您好。targetUserId是目标对象的用户id,比如说A呼叫B,那么A中回调中targetUserId就是B的userid。dwParam ...

通过打印targetUserId 的值,确为对方userid,但是无法接受到对方的视频和音频, 请您帮我分析一下, 问题在哪里?
作者: admin    时间: 2013-10-12 12:18
上层业务逻辑是需要主动调用:UserCameraControl()、UserSpeakControl(),打开本地的音频、视频,请求远程的音频、视频,才能正常工作的,视频呼叫流程只是一个业务逻辑,不会主动调用前面的api
作者: KeepGoing2013    时间: 2013-10-12 12:52
admin 发表于 2013-10-12 12:18
上层业务逻辑是需要主动调用:UserCameraControl()、UserSpeakControl(),打开本地的音频、视频,请求远程 ...

                anychat.UserCameraControl(userID, 1);
                anychat.UserSpeakControl(userID, 1);
                anychat.UserCameraControl(-1, 1);
                anychat.UserSpeakControl(-1, 1);       
以上方法在VideoActivity类中已调用, 且返回值均为0.
当A请求B B点击同意按钮时,服务器打印出以下日志, 请问和这个有关系吗?
OnUserLeaveRoomAction(dwUserId:-63 - dwRoomId:2)
OnUserLeaveRoomAction(dwUserId:-62 - dwRoomId:2)
作者: 廖斌    时间: 2013-10-12 13:45
anychat.UserCameraControl(userID, 1);
                anychat.UserSpeakControl(userID, 1);
                anychat.UserCameraControl(-1, 1);
                anychat.UserSpeakControl(-1, 1);        
需要在进入房间成功之后调用才有效。呼叫成功之后,服务器分配了一个ROOMID,你进入了吗?
作者: KeepGoing2013    时间: 2013-10-12 14:13
廖斌 发表于 2013-10-12 13:45
anychat.UserCameraControl(userID, 1);
                anychat.UserSpeakControl(userID, 1);
       ...

在线人员列表中, 可以看到对方,是否表明已经进入房间了?
否则该如何判断?
作者: 廖斌    时间: 2013-10-12 14:29
在线人员列表中是另外一个房间。比如说是2号。呼叫成功之后服务器会分配一个房间4。先离开2号房间,然后同时进入4号房间(我的代码描述有一个离开房间的操作,然后跳转到VideoActivity,你可以在进入服务器分配的房间成功之后再跳转到vidoactivity中。进入房间成功,会触发onAnyChatEnterRoom)
作者: KeepGoing2013    时间: 2013-10-12 15:16
廖斌 发表于 2013-10-12 14:29
在线人员列表中是另外一个房间。比如说是2号。呼叫成功之后服务器会分配一个房间4。先离开2号房间,然后同 ...

嗯 调试成功了,谢谢讲解.
作者: KeepGoing2013    时间: 2013-10-12 20:35
廖斌 发表于 2013-10-12 14:29
在线人员列表中是另外一个房间。比如说是2号。呼叫成功之后服务器会分配一个房间4。先离开2号房间,然后同 ...

您好.
现在出现了这样的问题:
当A呼叫B 成功进入房间后.
B可以接收到A的图像和声音
但是A却接收不到B的图像和声音,但是可以看到自己的图像.
anychat.GetCameraState(userID)的返回值是0
anychat.GetSpeakState(userID)的返回值也是0
根据文档说明应该是B的摄像头和和音频设备打开失败.
请问是什么问题?
谢谢
作者: admin    时间: 2013-10-12 21:33
您好,在OnEnterRoom()事件和OnUserAtRoom()事件中都请求一下对方的音频、视频,在OnEnterRoom事件中打开本地的音频、视频,按上述流程操作便可解决您遇到的问题。
作者: KeepGoing2013    时间: 2013-10-12 22:03
admin 发表于 2013-10-12 21:33
您好,在OnEnterRoom()事件和OnUserAtRoom()事件中都请求一下对方的音频、视频,在OnEnterRoom事件中打开本 ...

您好.
现在我采用的方法是A呼叫B成功后进入服务器分配的房间之后再跳转到vidoactivity中
然后在InitialLayout()方法中执行               
anychat.UserCameraControl(userID, 1);
anychat.UserSpeakControl(userID, 1);
anychat.UserCameraControl(-1, 1);
anychat.UserSpeakControl(-1, 1);       
等方法,
是否需要将OnEnterRoom和OnUserAtRoom放在vidoactivity中执行?
作者: KeepGoing2013    时间: 2013-10-13 19:09
admin 发表于 2013-10-12 21:33
您好,在OnEnterRoom()事件和OnUserAtRoom()事件中都请求一下对方的音频、视频,在OnEnterRoom事件中打开本 ...

此问题已解决, 另外发现当竖屏时,本地图像向右旋转90度.远程图像向左旋转90度
根据论坛中下贴, 提供的方法 ,本地图像调整后正常了.但是远程图像还是没有变化
http://bbs.anychat.cn/forum.php? ... &extra=page%3D1

作者: 廖斌    时间: 2013-10-14 13:52
您好。竖屏的时候,远程视频可以按下面方法调节
您好,这属于设备方向的相关问题,您可以通过如下步骤来设置:

1、开启设备方向自适应功能,在初始化SDK成功之后调用如下的代码:// 设备方向自适应

AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION, 1);
2、屏蔽设备方向改变事件,可修改【src\com\bairuitech\anychat\AnyChatSensorHelper.java】中的【onOrientationChanged】方法,删除该方法中的代码,可直接return。

3、设置合适的设备方向,在打开摄像头之前调用如下的代码:// 设置设备方向(orientation取值范围:0 ~ 6)

AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, orientation);

orientation取值范围:0 ~ 6,都试过了吗?


作者: KeepGoing2013    时间: 2013-10-14 14:16
本帖最后由 KeepGoing2013 于 2013-10-14 14:17 编辑
廖斌 发表于 2013-10-14 13:52
您好。竖屏的时候,远程视频可以按下面方法调节
您好,这属于设备方向的相关问题,您可以通过如下步骤来设 ...

您好
1.AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION, 1);是在VideoActivity类中的InitialSDK()中调用,是否正确?
2.已修改
3.AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, orientation);在VideoActivity 类中 anychat.UserCameraControl(userID, 1);方法之前调用.是否正确?
谢谢

作者: 廖斌    时间: 2013-10-14 15:08
1、可以,也可以在loginactivy调用anychat.InitSDK之后调用
3、可以,也可以在loginactivy调用anychat.InitSDK之后调用

作者: KeepGoing2013    时间: 2013-10-14 15:12
廖斌 发表于 2013-10-14 15:08
1、可以,也可以在loginactivy调用anychat.InitSDK之后调用
3、可以,也可以在loginactivy调用anychat.Ini ...

您好
还是没有起作用.远程图像依然是向左旋转90度.
还有其他注意事项吗?
作者: 廖斌    时间: 2013-10-15 10:35
如果按上面部署来做,orientation取值范围:0 ~ 6都试过了的话,那么具体问题得看代码了。

作者: KeepGoing2013    时间: 2013-10-15 11:18
本帖最后由 KeepGoing2013 于 2013-10-15 11:23 编辑
廖斌 发表于 2013-10-14 13:52
您好。竖屏的时候,远程视频可以按下面方法调节
您好,这属于设备方向的相关问题,您可以通过如下步骤来设 ...

您好.
刚才实验了一下, 如果不执行第二步,那么前置摄像头传输到对方的图像就变正常了,但是后置摄像头传到对方的图像是颠倒的. 我同样试了第三步的0-6 , 没有任何作用.
如果三步都不执行,效果同上,我是否可以认为第一步和第三步根本没有起到任何作用.
请您分析一下.
谢谢
作者: 廖斌    时间: 2013-10-15 11:37
您好。第二步是执行了AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, orientation);,你的第三步是不是没有调用成功啊?另外你说的竖屏是activity设置了竖屏吧?
作者: KeepGoing2013    时间: 2013-10-15 11:48
廖斌 发表于 2013-10-15 11:37
您好。第二步是执行了AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, ori ...

        private void InitialSDK() {
                if (anychat == null) {
                        anychat = new AnyChatCoreSDK();
                        anychat.SetBaseEvent(this);
                        if (configEntity.useARMv6Lib != 0)
                                AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEARMV6LIB, 1);
                        anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0);
                        AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION, 1);
                        AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 0);

                        bNeedRelease = true;
                }
        }
我这样调用是否正确? 已经设置为竖屏了.
作者: 廖斌    时间: 2013-10-15 11:54
是这样,这样不行吗?另外切换摄像头的时候需要再次调用AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 0);

作者: KeepGoing2013    时间: 2013-10-16 09:29
廖斌 发表于 2013-10-15 11:54
是这样,这样不行吗?另外切换摄像头的时候需要再次调用AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRA ...

嗯  还是不起作用.0-6 没有任何变化.
作者: KeepGoing2013    时间: 2013-10-17 10:55
KeepGoing2013 发表于 2013-10-16 09:29
嗯  还是不起作用.0-6 没有任何变化.

您好
竖屏显示调整无结果,于是切换为横屏显示.
但是官方的demo,本地前置和后置摄像头传输到对方手机的图像都是旋转180度的
我自己修改代码设置
1.调用mCamera.setDisplayOrientation(180);                       
2.注释public void onOrientationChanged(int degree) 中的代码                       
3.调用
AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION,1);
AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 4);
经过以上操作,本地前置摄像头和传输到对方的图像均是正常的,但是当我切换到后置摄像头时,本地摄像头是正常的,传输到对方的图像就是旋转180度的,当我再切换为前置摄像头的时候 ,本地摄像头是正常的,传输到对方的图像又旋转180度了。
我在切换摄像头的时候也调用了
AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION,1);
AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 4);
请问是什么问题,
谢谢.
作者: 廖斌    时间: 2013-10-17 11:11
你在切换摄像头的什么地方调用的呢?需要在前一个摄像头关闭之后,后一个摄像头开启之前调用AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 4);

作者: KeepGoing2013    时间: 2013-10-17 11:28
廖斌 发表于 2013-10-17 11:11
你在切换摄像头的什么地方调用的呢?需要在前一个摄像头关闭之后,后一个摄像头开启之前调用AnyChatCoreSDK ...

        public void onClick(View v) {
                // TODO Auto-generated method stub
                if (v == mCameraSwitchImage) {
                       
                        AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION,1);
                        AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 4);

                        showToast("摄像头切换");
                        // 如果是采用Java视频采集,则在Java层进行摄像头切换
                        if(AnyChatCoreSDK.GetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER) == AnyChatDefine.VIDEOCAP_DRIVER_JAVA) {
                                AnyChatCoreSDK.mCameraHelper.SwitchCamera();
                                return;
                        }

                        String strVideoCaptures[] = anychat.EnumVideoCapture();
                        ;
                        String temp = anychat.GetCurVideoCapture();
                        for (int i = 0; i < strVideoCaptures.length; i++) {
                                if (!temp.equals(strVideoCaptures)) {
                                        anychat.UserCameraControl(-1, 0);
                                        bSelfVideoOpened = false;
                                        anychat.SelectVideoCapture(strVideoCaptures);
                                        anychat.UserCameraControl(-1, 1);
                                        break;
                                }
                        }

                }
        }
这样不对吗?
作者: 廖斌    时间: 2013-10-17 14:08
  AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 4);对于内核模式要放到    anychat.UserCameraControl(-1, 0);之后。对于java模式要放到AnyChatCameraHelper的mCamera = Camera.open(iCurrentCameraId);之前
作者: KeepGoing2013    时间: 2013-10-17 16:10
廖斌 发表于 2013-10-17 14:08
AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 4);对于内核模式要放到 ...

通过与贵公司电话沟通,已解决.谢谢解答
作者: KeepGoing2013    时间: 2013-10-18 15:45
廖斌 发表于 2013-10-17 14:08
AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, 4);对于内核模式要放到 ...

竖屏后,传输到对方手机的图像如何全屏?
谢谢
作者: 廖斌    时间: 2013-10-18 16:16
您好,调整装载视频的surfaceview大小就行了

作者: KeepGoing2013    时间: 2013-10-18 16:19
廖斌 发表于 2013-10-18 16:16
您好,调整装载视频的surfaceview大小就行了

surfaceview 是全屏的 但是图像不是全屏的。
作者: KeepGoing2013    时间: 2013-10-18 16:19
廖斌 发表于 2013-10-18 16:16
您好,调整装载视频的surfaceview大小就行了

surfaceview 是全屏的 但是图像不是全屏的。
作者: 廖斌    时间: 2013-10-18 17:06
demo中的adjuestVideoSize注释掉,然后surfaceview给一个固定的值
作者: hbcs2000    时间: 2014-8-8 10:18
视频呼叫业务逻辑有没有iOS的demo程序?
作者: 佰锐技术-高萌    时间: 2014-8-8 10:26
您好,ios的没有做这个呼叫逻辑Demo,您可以自己实现这方面的业务逻辑。所有平台都是可以实现呼叫逻辑的。
作者: admin    时间: 2014-8-8 10:33
hbcs2000 发表于 2014-8-8 10:18
视频呼叫业务逻辑有没有iOS的demo程序?

工程师正在开发,后续的版本将会提供完整的工程源代码。
作者: hbcs2000    时间: 2014-8-8 13:39
在视频呼叫之前必须先调用
// 连接服务器
+ (int) Connect: (NSString*) lpServerAddr : (int) dwPort;
// 登录系统
+ (int) Login: (NSString*) lpUserName : (NSString*) lpPassword;

这连个接口吗?


作者: 佰锐技术-卓剑锐    时间: 2014-8-8 13:43
hbcs2000 发表于 2014-8-8 13:39
在视频呼叫之前必须先调用
// 连接服务器
+ (int) Connect: (NSString*) lpServerAddr : (int) dwPort;

程序初始化之后就调用连接、登录接口了。
作者: admin    时间: 2014-8-8 13:58
hbcs2000 发表于 2014-8-8 13:39
在视频呼叫之前必须先调用
// 连接服务器
+ (int) Connect: (NSString*) lpServerAddr : (int) dwPort;

您好,各个平台AnyChat的使用方法、API接口、调用流程都是一致的,请参考:http://www.anychat.cn/faq/index. ... =193&artlang=zh
作者: dijkstra    时间: 2015-1-17 20:22
你好 我们使用anychat支持多个android客户端与一个pc端,pc端需要支持同时接受多个android客户端发送的实时视频请求,这种情况需要pc端同时模拟多个用户进入房间来实现吗
作者: admin    时间: 2015-1-17 22:54
是的,可以通过PC端模拟多个用户进入房间来实现。
作者: 一瓶爱因斯坦    时间: 2015-4-27 16:00
您好, 我今天在测试自带的demo AnyChatFeature时候 在服务器端的代码中修改如下:
/**
     * 视频呼叫事件回调,客户端调用API:BRAC_VideoCallControl会触发该回调
     */

    public int OnAnyChatVideoCallEventCallBack(int dwEventType, int dwSrcUserId, int dwTarUserId, int dwErrorCode, int dwFlags, int dwParam, String lpUserStr) {
        System.out.println("OnAnyChatVideoCallEventCallBack called");
        String str = "OnAnyChatVideoCallEventCallBack: dwEventType:" + dwEventType + " dwSrcUserId:" + dwSrcUserId +
                " dwTarUserId:" + dwTarUserId + " dwErrorCode:" + dwErrorCode + " dwFlags:" + dwFlags + " dwParam:" + dwParam + " lpUserStr:" + lpUserStr;
        System.out.print(getCurrentTime() + str + "\r\n");
        return 0;
    }

然后A和B客户端相互发起视频功能, 视频通讯是正常的, 但是看服务器端的输出时 , 并没有OnAnyChatVideoCallEventCallBack called的输出.. 这是为什么呢?
服务器端使用的是自带的demo   AnyChatCallCenter4SpringMVC, 难道A和B视频通讯是直接通讯而不需要经过服务器的吗?
作者: 佰锐科技-邵光清    时间: 2015-4-27 16:50
您好,请您将日志发过来看看。
作者: 佰锐技术-卓剑锐    时间: 2015-4-27 18:06
一瓶爱因斯坦 发表于 2015-4-27 16:00
您好, 我今天在测试自带的demo AnyChatFeature时候 在服务器端的代码中修改如下:
/**
     * 视频呼叫 ...

您好,如果客户端之前P2P建立成功时,流媒体数据是两端之间传输的。
作者: 一瓶爱因斯坦    时间: 2015-4-28 13:20
佰锐科技-邵光清 发表于 2015-4-27 16:50
您好,请您将日志发过来看看。

输出是这样的, 在两个用户都进入房间后, A和B进行了一次视频会话, 然后才离开的房间,  但是服务器端并没有任何输出(我已经为自带的Demo的CallCenterServer类下的所有方法都添加了输出),
OnAnyChatUserLoginActionCallBack called
getCurrentTime called
04-28 13:22:51:893        OnUserLoginActionCallBack: userid:-4 username: nameba
OnAnyChatUserLoginActionCallBack called
getCurrentTime called
04-28 13:22:53:199        OnUserLoginActionCallBack: userid:-5 username: name
OnAnyChatPrepareEnterRoomCallBack called
getCurrentTime called
04-28 13:22:55:522        OnPrepareEnterRoomCallBack: userid:-4 roomid: 1
OnAnyChatUserEnterRoomActionCallBack called
getCurrentTime called
04-28 13:22:55:532        OnUserEnterRoomActionCallBack: userid:-4 roomid: 1
OnAnyChatPrepareEnterRoomCallBack called
getCurrentTime called
04-28 13:22:56:123        OnPrepareEnterRoomCallBack: userid:-5 roomid: 1
OnAnyChatUserEnterRoomActionCallBack called
getCurrentTime called
04-28 13:22:56:132        OnUserEnterRoomActionCallBack: userid:-5 roomid: 1
OnAnyChatUserLeaveRoomActionCallBack called
getCurrentTime called
04-28 13:23:41:930        OnUserLeaveRoomActionCallBack: userid:-5 roomid: 1
OnAnyChatUserLeaveRoomActionCallBack called
getCurrentTime called
04-28 13:23:42:929        OnUserLeaveRoomActionCallBack: userid:-4 roomid: 1
作者: 一瓶爱因斯坦    时间: 2015-4-28 13:21
佰锐技术-卓剑锐 发表于 2015-4-27 18:06
您好,如果客户端之前P2P建立成功时,流媒体数据是两端之间传输的。

如果是直接传输的话,那我需要怎么做才能相互间的视频传输通过服务器呢? 因为我需要实现服务器端实时录制的功能。。。
作者: admin    时间: 2015-4-28 13:23
但是看服务器端的输出时 , 并没有OnAnyChatVideoCallEventCallBack called的输出.. 这是为什么呢?

您好,流媒体数据不会经过业务服务器,如果您需要在服务器端录像,则需要单独部署录像服务器,请参考:AnyChat音视频录制整体解决方案
作者: 一瓶爱因斯坦    时间: 2015-5-1 18:45
请问要如何调节视频聊天的清晰度呢? 我用的自带的AnyChatFeatures  然后两个手机进行视频  用的前置摄像头 清晰度很低  我调节 设置里面的参数为自定义参数:
分辨率:720 * 480
视频码率: 200kbps
视频帧率:20fps
视频质量:较好视频质量
视频预设参数:较高质量,较低效率
并且保存了设置
但即使如此, 视频的清晰度依旧没有改变, 这是为什么呢?

服务器端我用的 AnyChatCallCenter4SpringMVC
作者: admin    时间: 2015-5-1 20:44
您好,请尝试提高码率,或是降低帧率,看视频质量是否有所改善!
作者: 一瓶爱因斯坦    时间: 2015-5-12 15:23
您好, 请问anychat有没有可能把视频请求和回复的功能做到后台服务中呢?
我的意思是: 我需要实现这这样的功能, 就是A和B开启一一个服务和服务器保持长连接, 然后在必要的时间, A的服务直接向B发出一个视频请求, B接受到请求后回复A的请求并开始录制视频
请问这样的功能是否可能实现呢?
作者: 佰锐科技-田杰    时间: 2015-5-12 15:35
一瓶爱因斯坦 发表于 2015-5-12 15:23
您好, 请问anychat有没有可能把视频请求和回复的功能做到后台服务中呢?
我的意思是: 我需要实现这这样 ...

您需要在哪里实现呢?移动端还是?
作者: 一瓶爱因斯坦    时间: 2015-5-12 16:21
佰锐科技-田杰 发表于 2015-5-12 15:35
您需要在哪里实现呢?移动端还是?

移动端的哈, andriod
作者: 一瓶爱因斯坦    时间: 2015-5-12 16:31
佰锐科技-田杰 发表于 2015-5-12 15:35
您需要在哪里实现呢?移动端还是?

就是把视频的呼叫和回复以及录像功能都做到service里面去, 这样是否可行呢? 因为我需要实时的录像但是有可能在A和B视频传输的时候我不需要看到视频, 只需要能录像就行了。。。
作者: 佰锐科技-李永星    时间: 2015-5-12 16:38
本帖最后由 佰锐科技-李永星 于 2015-5-12 16:46 编辑

请你描述你的业务流程是怎么样子的,比如:

QQ图片20150512164629.png (10.43 KB, 下载次数: 2451)

QQ图片20150512164629.png

作者: 廖斌    时间: 2015-5-12 16:50
一瓶爱因斯坦 发表于 2015-5-12 16:31
就是把视频的呼叫和回复以及录像功能都做到service里面去, 这样是否可行呢? 因为我需要实时的录像但是 ...

您好,将视频呼叫的流程和录像的功能放到service中是可以的,但录像是建议在通话的基础上面,android端自己的视频被采集,是一定要放在surfaceview上面的。
作者: 一瓶爱因斯坦    时间: 2015-5-12 16:57
佰锐科技-李永星 发表于 2015-5-12 16:38
请你描述你的业务流程是怎么样子的

是这样的:
A和B是手机, 并且A和B都开启了一个service来保持和服务器长连接, 然后在某一个时间, 比如每隔30分钟, 需要自动录制B方面的视频(不需要用户任何操作, 在锁屏或者非锁屏状态下自动完成), 那么B就向A发送视频的请求, 然后A在接受到B得请求之后回复并且请求B的摄像头和麦克风, 并且在服务器录制视频, 所有的操作都是后台自动完成的, 用户可能是不知情的。


我对anycaht所能实现的功能的了解是:  要在服务器录制B所拍摄到得视频, 那A和B酒就必须有视频通信, 然后才能开启服务器录像。
我的业务逻辑是基于我对anychat的功能做出来的, 但是并不知道是否能够实现, 或者还有更简便的方法吗?
作者: 佰锐科技-李永星    时间: 2015-5-12 17:02
你想干嘛
这个涉及到个人隐私了吧
作者: 廖斌    时间: 2015-5-12 17:04
一瓶爱因斯坦 发表于 2015-5-12 16:57
是这样的:
A和B是手机, 并且A和B都开启了一个service来保持和服务器长连接, 然后在某一个时间, 比如 ...

A对B录制录制的时候,B是在锁屏状态或者后台状态?如果B在锁屏状态或者后台状态的话,B是不能进行视频采集的,音频采集是可以的。
作者: 一瓶爱因斯坦    时间: 2015-5-12 17:10
佰锐科技-李永星 发表于 2015-5-12 17:02
你想干嘛
这个涉及到个人隐私了吧

我做的这个是用户可配置的, 只是粗、存在有这样的需求,  犯法的事情可不敢做
作者: 一瓶爱因斯坦    时间: 2015-5-12 17:15
廖斌 发表于 2015-5-12 17:04
A对B录制录制的时候,B是在锁屏状态或者后台状态?如果B在锁屏状态或者后台状态的话,B是不能进行视频采 ...

大概理解了,  非常感谢您的回答哈!
作者: gothumbers    时间: 2015-6-3 20:51
你好,请问我在调用你们上面的示例程序时为什么类似RETURNCODE_SUCCESS这些errorcode都提示cannot be resoled or is not a field啊?
作者: admin    时间: 2015-6-3 23:47
您好,请问是哪部分代码,截图看看?
作者: sagittar_zhang    时间: 2015-7-24 13:38
public static final int BRAC_ERRORCODE_SUCCESS                        = 0;         ///< 没有错误
    public static final int BRAC_ERRORCODE_SESSION_QUIT                = 100101;///< 源用户主动放弃会话
    public static final int BRAC_ERRORCODE_SESSION_OFFLINE        = 100102;///< 目标用户不在线
    public static final int BRAC_ERRORCODE_SESSION_BUSY                = 100103;///< 目标用户忙
    public static final int BRAC_ERRORCODE_SESSION_REFUSE        = 100104;///< 目标用户拒绝会话
    public static final int BRAC_ERRORCODE_SESSION_TIMEOUT        = 100105;///< 会话请求超时
    public static final int BRAC_ERRORCODE_SESSION_DISCONNECT=100106;///< 网络断线
是不是这些参数都改名了啊,不是RETURN开始的。。。
作者: admin    时间: 2015-7-24 13:47
可能是常量的名称改了,为了统一命名规则,定义值没有修改。
作者: kmbest    时间: 2015-11-3 15:18
编译D:\AnyChatCoreSDK_Win32_V5.3\AnyChatCoreSDK_Win32_r4840\src\client\c#\AnyChatCSharpDemo在这个工程的时候报错,D:\AnyChatCoreSDK_Win32_V5.3\AnyChatCoreSDK_Win32_r4840\src\client\c#\AnyChatCSharpDemo\AnyChatCSharpDemo.csproj : error  : 无法读取项目文件“AnyChatCSharpDemo.csproj”。
D:\AnyChatCoreSDK_Win32_V5.3\AnyChatCoreSDK_Win32_r4840\src\client\c#\AnyChatCSharpDemo\AnyChatCSharpDemo.csproj: 未能加载项目文件。未能找到文件“D:\AnyChatCoreSDK_Win32_V5.3\AnyChatCoreSDK_Win32_r4840\src\client\c#\AnyChatCSharpDemo\AnyChatCSharpDemo.csproj”。

是不是少了什么文件啊
作者: 佰锐科技-陈伟    时间: 2015-11-3 15:30
本帖最后由 佰锐科技-陈伟 于 2015-11-3 15:45 编辑
kmbest 发表于 2015-11-3 15:18
编译D:\AnyChatCoreSDK_Win32_V5.3\AnyChatCoreSDK_Win32_r4840\src\client\c#\AnyChatCSharpDemo在这个工 ...

您好 您使用的VS什么版本呀?
作者: karlpan01    时间: 2015-12-2 17:25
demo中的大厅的创建接口是那个?
作者: 佰锐科技-邵光清    时间: 2015-12-2 17:57
karlpan01 发表于 2015-12-2 17:25
demo中的大厅的创建接口是那个?

您好,请问有什么业务需求吗?
作者: lh602499774    时间: 2016-3-29 11:10
anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, useridB, 0, 0,0, "usernameA") 我想问一下这个方法是在A用户登录后进入房间后去执行的吗?如果不进入房间那么useridB哪里来的,我可以通过对方的昵称来得到这个useridB吗?我们昵称也是唯一的
作者: 佰锐科技-邵光清    时间: 2016-3-29 11:54
lh602499774 发表于 2016-3-29 11:10
anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, useridB, 0, 0,0, "usernameA")  ...

您好,VideoCallControl可以在登录成功之后调用,也可以在进入房间之后调用,前提是先获取到对方的userid;如果不进入房间,则可以使用好友接口同步拿到对方的userid,参见:AnyChat大厅好友业务逻辑详解
另外可以BRAC_QueryInfoFromServer通过用户昵称获取用户的userid。
作者: lh602499774    时间: 2016-3-29 12:35
佰锐科技-邵光清 发表于 2016-3-29 11:54
您好,VideoCallControl可以在登录成功之后调用,也可以在进入房间之后调用,前提是先获取到对方的userid ...

那么String QueryInfoFromServer(int dwInfoName, String strInParam, int dwFlags);这三个参数分别要填什么呢?我想通过昵称查询AnyChatDefine.ANYCHAT_SERVERQUERY_USERIDBYNAME,一个是昵称 那另外的一个应该填写什么呢
作者: lh602499774    时间: 2016-3-29 12:50
佰锐科技-邵光清 发表于 2016-3-29 11:54
您好,VideoCallControl可以在登录成功之后调用,也可以在进入房间之后调用,前提是先获取到对方的userid ...

这里同时还需要一个.so文件 哪里能下载到呢
作者: lh602499774    时间: 2016-3-29 13:52
anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, useridB, 0, 0,0, "usernameA"),这个useridB我想在双方都不进入房间,只是登录成功后获得,还有个问题就是为什么每次登录成功OnAnyChatLoginMessage(int dwUserId, int dwErrorCode)自己的id为什么会一直变化?如果这样我怎样获得对方id呢?

那么String QueryInfoFromServer(int dwInfoName, String strInParam, int dwFlags);这三个参数分别要填什么呢?我想通过昵称查询AnyChatDefine.ANYCHAT_SERVERQUERY_USERIDBYNAME,一个是昵称 那另外的一个应该填写什么呢?还有就是调用这个方法缺少一个so文件,像我这种情况怎么解决的呢
作者: admin    时间: 2016-3-29 14:00
还有个问题就是为什么每次登录成功OnAnyChatLoginMessage(int dwUserId, int dwErrorCode)自己的id为什么会一直变化?

请参考:有关AnyChat平台用户身份验证与第三方平台集成的问题

使用API:QueryInfoFromServer,请更新网上最新版本的SDK包:http://sdk.anychat.cn/html/download.html

第三个参数填0即可。
作者: lh602499774    时间: 2016-3-29 14:40
admin 发表于 2016-3-29 14:00
请参考:有关AnyChat平台用户身份验证与第三方平台集成的问题

使用API:QueryInfoFromServer,请更新 ...

OK了 恩 回答的就是我想问的 谢谢了
作者: zhkmxx930    时间: 2016-5-1 11:07
您好,为什么我在由A向B发送请求之后,日志返回的是
Invoke        VideoCallControl(EventType:1, UserId:-5244, ErrorCode:0, dwFlags:0, dwParam:0, UserStr:zhkmxx930@door)=0
Message        OnVideoCallEvent(EventType:2, UserId:-5244, ErrorCode:100103, dwFlags:0x0, dwParam:0
然后接收方那边日志是
Message        OnVideoCallEvent(EventType:1, UserId:-5245, ErrorCode:0, dwFlags:0x0, dwParam:0

然后我的 OnAnyChatVideoCallEvent 这个回调函数没有执行。


这里我将我的请求端的代码贴一下,您看下谢谢:
  1. public class MainActivity extends AppCompatActivity implements AnyChatVideoCallEvent {

  2.     private AnyChatCoreSDK anyChatCoreSDK = null;
  3.     private SurfaceView mSurfaceLocal = null;
  4.     private EditText et_remoteId = null;
  5.     private Button btn_remote = null;
  6.     private int userId = 0;
  7.     @Override
  8.     protected void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         setContentView(R.layout.activity_main);
  11.         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  12.         setSupportActionBar(toolbar);
  13.         InitLayout();
  14.         InitSDK();
  15.         GetLocalVideo();
  16.         ConnectServer();
  17.         btn_remote.setOnClickListener(new View.OnClickListener() {
  18.             @Override
  19.             public void onClick(View v) {
  20.             //在输入框中输入的远程用户ID
  21.                 userId = Integer.parseInt(et_remoteId.getText().toString());
  22. //                GetRemoteVideo();
  23.                 anyChatCoreSDK.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, userId, 0, 0, 0, "zhkmxx930@door");

  24.             }
  25.         });
  26.     }

  27.     private void InitLayout(){
  28.         mSurfaceLocal = (SurfaceView) findViewById(R.id.surfaceView_local);
  29.         et_remoteId = (EditText) findViewById(R.id.et_remoteId);
  30.         btn_remote = (Button) findViewById(R.id.btn_remote);
  31.     }

  32.     private void InitSDK(){
  33.         anyChatCoreSDK = new AnyChatCoreSDK();
  34.         anyChatCoreSDK.InitSDK(Build.VERSION.SDK_INT, 0);
  35.         anyChatCoreSDK.SetVideoCallEvent(this);
  36.     }

  37.     private void ConnectServer(){
  38.         anyChatCoreSDK.Connect("demo.anychat.cn", 8906);
  39.         anyChatCoreSDK.Login("zhkmxx930@door", "");
  40.         anyChatCoreSDK.EnterRoom(1, "");
  41.         anyChatCoreSDK.UserCameraControl(-1,1);
  42.         anyChatCoreSDK.UserSpeakControl(-1,1);
  43.     }

  44. //    private void GetRemoteVideo(){
  45. //        int index = anyChatCoreSDK.mVideoHelper.bindVideo(mSurfaceLocal.getHolder());
  46. //        anyChatCoreSDK.mVideoHelper.SetVideoUser(index,userId);
  47. //        anyChatCoreSDK.UserCameraControl(userId, 1);
  48. //        anyChatCoreSDK.UserSpeakControl(userId, 1);
  49. //    }

  50.     private void GetLocalVideo(){
  51.         anyChatCoreSDK.mSensorHelper.InitSensor(this);
  52.         AnyChatCoreSDK.mCameraHelper.SetContext(this);
  53.         mSurfaceLocal.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  54.         mSurfaceLocal.getHolder().addCallback(AnyChatCoreSDK.mCameraHelper);
  55.     }

  56.     @Override
  57.     public void OnAnyChatVideoCallEvent(int dwEventType, int dwUserId, int dwErrorCode, int dwFlags, int dwParam, String userStr) {
  58.         System.out.println("===0===");
  59.         switch (dwEventType){
  60.             case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY:
  61.                 System.out.println("回复收到");
  62.                 switch (dwErrorCode){
  63.                     case AnyChatDefine.BRAC_ERRORCODE_SUCCESS:
  64.                         System.out.println("呼叫成功");
  65.                         Toast.makeText(this,"呼叫成功",Toast.LENGTH_LONG).show();
  66.                         break;
  67.                     case AnyChatDefine.BRAC_ERRORCODE_SESSION_BUSY:
  68.                         System.out.println("目标用户忙");
  69.                         Toast.makeText(this,"目标用户忙",Toast.LENGTH_LONG).show();
  70.                         break;
  71.                     case AnyChatDefine.BRAC_ERRORCODE_SESSION_DISCONNECT:
  72.                         System.out.println("网络断线");
  73.                         Toast.makeText(this,"网络断线",Toast.LENGTH_LONG).show();
  74.                         break;
  75.                     case AnyChatDefine.BRAC_ERRORCODE_SESSION_OFFLINE:
  76.                         System.out.println("目标用户不在线");
  77.                         Toast.makeText(this,"目标用户不在线",Toast.LENGTH_LONG).show();
  78.                         break;
  79.                     case AnyChatDefine.BRAC_ERRORCODE_SESSION_REFUSE:
  80.                         System.out.println("目标用户拒绝会话");
  81.                         Toast.makeText(this,"目标用户拒绝会话",Toast.LENGTH_LONG).show();
  82.                         break;
  83.                     case AnyChatDefine.BRAC_ERRORCODE_SESSION_TIMEOUT:
  84.                         System.out.println("会话请求超时");
  85.                         Toast.makeText(this,"会话请求超时",Toast.LENGTH_LONG).show();
  86.                         break;
  87.                     case AnyChatDefine.BRAC_ERRORCODE_SESSION_QUIT:
  88.                         System.out.println("源用户主动放弃会话");
  89.                         Toast.makeText(this,"源用户主动放弃会话",Toast.LENGTH_LONG).show();
  90.                         break;


  91.                 }
  92.                 break;
  93.             case AnyChatDefine.BRAC_VIDEOCALL_EVENT_START:
  94.                 System.out.println("开始通信");
  95.                 Toast.makeText(this,"开始通信",Toast.LENGTH_LONG).show();
  96.                 break;
  97.             case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST:
  98.                 System.out.println("收到请求");
  99.         }
  100.     }
  101. }
复制代码

作者: admin    时间: 2016-5-2 14:08
OnVideoCallEvent(EventType:2, UserId:-5244, ErrorCode:100103, dwFlags:0x0, dwParam:0)

您好,ErrorCode:100103表示目标用户忙,对方还在通话中?
作者: baoxp    时间: 2016-12-28 10:55
下面是我的代码  我的问题是对方不显示我这边的画面和声音
public class CallActivity extends Activity implements AnyChatBaseEvent,AnyChatVideoCallEvent{
       
        private SurfaceView mSurfaceLocal;
        private SurfaceView mSurfaceRemote;
        int userid=18757;
        // 新建核心类对象
        AnyChatCoreSDK anychat = new AnyChatCoreSDK();
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_ideo);
                mSurfaceLocal=(SurfaceView) findViewById(R.id.surfaceview_local);
                mSurfaceRemote=(SurfaceView) findViewById(R.id.surfaceview_remote);
                anychat.SetBaseEvent(this);
                anychat.SetVideoCallEvent(this);
                anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0);
                initVideo();
                //startVideo();
        }
       
       



        // 置必要的音视频参数
        private void initVideo() {
                 // 连接服务器

                 anychat.Connect("demo.anychat.cn", 8906);

                 //登录服务器

                 anychat.Login("电梯一", "123");
                // 设置本地视频采集随着设备而旋转而处理
                  AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION, 1);
                //摄像头硬件初始化 启动anychat传感器监听
                anychat.mSensorHelper.InitSensor(this);
                //初始化camera
                AnyChatCoreSDK.mCameraHelper.SetContext(this);
                 //打开本地视频, 第一个参数用-1表示本地,也可以用本地的真实 userid
                    anychat.UserCameraControl(-1, 1);
                    //打开本地音频
                    anychat.UserSpeakControl(-1, 1);
                    //设置surface_tyoe_push_buffers
                  mSurfaceLocal.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
                         
                  mSurfaceLocal.getHolder().addCallback(AnyChatCoreSDK.mCameraHelper);
                         
        }
        //开始远程音视频
        private void startVideo() {
               
        }





        @Override
        public void OnAnyChatConnectMessage(boolean bSuccess) {
                // TODO Auto-generated method stub
                Log.e("videocall","连接服务器");
               
        }





        @Override
        public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode) {
                // TODO Auto-generated method stub
                Log.e("videocall","登陆成功");
                //发起请求
                anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, userid, 0, 0,0, "电梯一");
        }




        //进入房间触发,dwRoomId为房间号,dwErrorCode==0表示进入房间成功,其他值为进入 房  间 失败的错误代码
        @Override
        public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode) {
                // TODO Auto-generated method stub
                Log.e("videocall","进入房间"+dwRoomId+dwErrorCode);
               
               
                 // mRemoteUserid为通话目标对象的userId;

                  int index = anychat.mVideoHelper.bindVideo(mSurfaceRemote.getHolder());

                  anychat.mVideoHelper.SetVideoUser(index, userid);

                  anychat.UserCameraControl(userid, 1);

                  anychat.UserSpeakControl(userid, 1);
        }




         // 当前房间在线用户消息,进入房间成功后调用一次。dwUserNum当前房间总人数(包含自  己)
        @Override
        public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId) {
                // TODO Auto-generated method stub
               
        }




         // 当前房间用户离开或者进入房间触发这个回调,dwUserId用户 id," bEnter==true"表示进入 房间,反之表示离开房间
        @Override
        public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter) {
                // TODO Auto-generated method stub
               
        }





        @Override
        public void OnAnyChatLinkCloseMessage(int dwErrorCode) {
                // TODO Auto-generated method stub
               
        }



        @Override
        public void OnAnyChatVideoCallEvent(int dwEventType, int dwUserId,
                        int dwErrorCode, int dwFlags, int dwParam, String userStr) {
                // TODO Auto-generated method stub
                Log.e("videocall","callevent"+dwEventType+dwParam);
                Log.e("videocall","callevent"+dwParam);
                switch(dwEventType)
        {
        case AnyChatDefine.BRAC_VIDEOCALL_EVENT_START:
                Log.e("videocall","开始");
               
                 anychat.EnterRoom(dwParam,"");
                break;
               
        }





        }


       
}



作者: 佰锐科技-刘洋    时间: 2016-12-28 11:12
baoxp 发表于 2016-12-28 10:55
下面是我的代码  我的问题是对方不显示我这边的画面和声音
public class CallActivity extends Activity  ...

你好 请发一下日志信息 日志在插件安装目录下 插件默认安装在C盘 C:\Program Files (x86)\AnyChatWeb 下的BRAnyChatCore.log
作者: baoxp    时间: 2016-12-28 11:33
佰锐科技-刘洋 发表于 2016-12-28 11:12
你好 请发一下日志信息 日志在插件安装目录下 插件默认安装在C盘 C:\Program Files (x86)\AnyChatWeb 下 ...

我是安卓开发的
作者: 佰锐科技-刘洋    时间: 2016-12-28 11:37
baoxp 发表于 2016-12-28 11:33
我是安卓开发的

安卓日志信息在cdcard里面BRAnyChatCore.log




欢迎光临 AnyChat技术支持论坛 (http://bbs.anychat.cn/) Powered by Discuz! X3