AnyChat技术支持论坛

标题: anychat.GetCameraState(dwTargetUserId) == 0 [打印本页]

作者: william2014    时间: 2014-8-6 15:32
标题: anychat.GetCameraState(dwTargetUserId) == 0
Android 端和PC端视频通话,Android端经常出现获取pc端视频状态等于零。请问这个好似什么情况?
anychat.GetCameraState(dwTargetUserId)==0。

作者: william2014    时间: 2014-8-6 15:41
在线坐等回复
作者: 廖斌    时间: 2014-8-6 15:42
请问您android用的什么版本?最新版本有修正Java模式下anychat.GetCameraState获取状态不准的问题
作者: 佰锐技术-卓剑锐    时间: 2014-8-6 15:42
您好:
0  没有摄像头
1  有摄像头但没有打开
2  摄像头已打开
作者: 廖斌    时间: 2014-8-6 15:43
廖斌 发表于 2014-8-6 15:42
请问您android用的什么版本?最新版本有修正Java模式下anychat.GetCameraState获取状态不准的问题

另外您获取这个状态干嘛用呢?打开视频即可,不需要根据这个状态去打开视频
作者: william2014    时间: 2014-8-6 15:52
廖斌 发表于 2014-8-6 15:43
另外您获取这个状态干嘛用呢?打开视频即可,不需要根据这个状态去打开视频

5.0版本,需要根据这个状态判断是否需要进入聊天室
作者: william2014    时间: 2014-8-6 15:58
william2014 发表于 2014-8-6 15:52
5.0版本,需要根据这个状态判断是否需要进入聊天室

在OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode)回调中如果获取anychat.GetCameraState(dwTargetUserId) == 0进入视频聊天,Android端会看不到PC端的视频。
所以我会有个判断 ,当获取对方视频状态等于0的时候提示对方已离线。
作者: william2014    时间: 2014-8-6 15:59
william2014 发表于 2014-8-6 15:58
在OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode)回调中如果获取anychat.GetCameraState(dwT ...
  1. if (dwErrorCode == 0) {
  2.                         int i[] = anychat.GetOnlineUser();
  3.                         if (i.length > 0) {
  4.                                 dwTargetUserId = i[0];
  5.                         }
  6.                         if (!flag) {
  7.                                 dwTargetUserId = dwRoomId;
  8.                         }
  9.                         Log.d("------------------------------------",
  10.                                         "status =" + anychat.GetCameraState(dwTargetUserId));
  11.                         if (anychat.GetCameraState(dwTargetUserId) != 0) {// 坐席视频正常
  12.                                 isErrorInRoom = false;
  13.                                 Bundle bundle = new Bundle();
  14.                                 bundle.putInt("target_user_id", dwTargetUserId);
  15.                                 toNextPage(bundle, VideoAuthViewActivity.class);
  16.                                 MainUIActivity.getMainController().popView();
  17.                         } else {
  18.                                 showAlertDialog("对方尚未连接视频,请重试",
  19.                                                 new DialogInterface.OnClickListener() {

  20.                                                         @Override
  21.                                                         public void onClick(DialogInterface dialog,
  22.                                                                         int which) {
  23.                                                                 regist_videotestimony_index = 0;
  24.                                                                 get_videotestimony_index = 0;
  25.                                                                 serialNum = VideoAuthManager.getInstance()
  26.                                                                                 .registVideoTestimony();
  27.                                                                 tvWait.setText(R.string.video_authing);
  28.                                                                 tvInfo.setText("");
  29.                                                                 if (!progressBar.isShown()) {
  30.                                                                         progressBar.setVisibility(View.VISIBLE);
  31.                                                                 }
  32.                                                         }
  33.                                                 }, "重试");
  34.                         }
  35.                 }
复制代码

作者: 廖斌    时间: 2014-8-6 16:07
william2014 发表于 2014-8-6 15:59

这样的判断有问题哦,不建议这样做。
1、在自己进入房间成功的回调OnAnyChatEnterRoomMessage中去判断别人的视频状态,这个时机本身就是不对的。应该在OnAnyChatOnlineUserMessage或者OnAnyChatUserAtRoomMessage

2、打开摄像头是异步的过程,即使对方打开了摄像头,调用GetCameraState获取的也可能是0。
作者: admin    时间: 2014-8-6 16:26
是否可以考虑用一个定时器来判断?
作者: william2014    时间: 2014-8-8 11:36
admin 发表于 2014-8-6 16:26
是否可以考虑用一个定时器来判断?
  1. if (!bOtherVideoOpened) {
  2.                                 if (anychat.GetCameraState(userID) == 2
  3.                                                 && anychat.GetUserVideoWidth(userID) != 0) {
  4.                                         SurfaceHolder holder = otherView.getHolder();
  5.                                         // 如果是采用内核视频显示(非Java驱动),则需要设置Surface的参数
  6.                                         if (AnyChatCoreSDK
  7.                                                         .GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) != AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
  8.                                                 holder.setFormat(PixelFormat.RGB_565);
  9.                                                 holder.setFixedSize(anychat.GetUserVideoWidth(userID),
  10.                                                                 anychat.GetUserVideoHeight(userID));
  11.                                         }
  12.                                         Surface s = holder.getSurface();
  13.                                         anychat.SetVideoPos(userID, s, 0, 0, 0, 0);
  14.                                         bOtherVideoOpened = true;
  15.                                 }
  16.                         }
  17.                         if (!bSelfVideoOpened) {
  18.                                 if (anychat.GetCameraState(-1) == 2
  19.                                                 && anychat.GetUserVideoWidth(-1) != 0) {
  20.                                         SurfaceHolder holder = myView.getHolder();
  21.                                         // 如果是采用内核视频显示(非Java驱动),则需要设置Surface的参数
  22.                                         if (AnyChatCoreSDK
  23.                                                         .GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) != AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
  24.                                                 holder.setFormat(PixelFormat.RGB_565);
  25.                                                 holder.setFixedSize(anychat.GetUserVideoWidth(-1),
  26.                                                                 anychat.GetUserVideoHeight(-1));
  27.                                         }
  28.                                         Surface s = holder.getSurface();
  29.                                         anychat.SetVideoPos(-1, s, 0, 0, 0, 0);
  30.                                         bSelfVideoOpened = true;
  31.                                 }
  32.                         }
复制代码

作者: william2014    时间: 2014-8-8 11:38
william2014 发表于 2014-8-8 11:36

能给我解释下这段代码的用途吗?   我理解的不太对。
我的理解是:如果对席视频没开,如果对席视频状态是摄像头已打开  重新绑定对席
作者: 廖斌    时间: 2014-8-8 12:01
william2014 发表于 2014-8-8 11:38
能给我解释下这段代码的用途吗?   我理解的不太对。
我的理解是:如果对席视频没开,如果对席视频状态 ...

您好,这段代码是针对以前版本内核显示模式写的。最新版本的Java显示模式是不需要根据这个去显示视频、绑定视频控件的。
作者: 廖斌    时间: 2014-8-8 12:07
廖斌 发表于 2014-8-8 12:01
您好,这段代码是针对以前版本内核显示模式写的。最新版本的Java显示模式是不需要根据这个去显示视频、绑 ...

你可以通过计数器执行if (anychat.GetCameraState(userID) == 2

                                          && anychat.GetUserVideoWidth(userID) != 0)
去判断对方的数据有没有过来。Java显示模式,只要得到对方的userid,就调用
        int index = anychat.mVideoHelper.bindVideo(otherView.getHolder());
                        anychat.mVideoHelper.SetVideoUser(index, userID);去绑定surfaview了,视频过来了就会显示了。
作者: william2014    时间: 2014-8-8 13:54
admin 发表于 2014-8-6 16:26
是否可以考虑用一个定时器来判断?
  1. if (!bOtherVideoOpened) {
  2.                                 if (anychat.GetCameraState(userID) == 2
  3.                                                 && anychat.GetUserVideoWidth(userID) != 0) {
  4.                                         SurfaceHolder holder = otherView.getHolder();
  5.                                         // 如果是采用内核视频显示(非Java驱动),则需要设置Surface的参数
  6.                                         if (AnyChatCoreSDK
  7.                                                         .GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) != AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
  8.                                                 holder.setFormat(PixelFormat.RGB_565);
  9.                                                 holder.setFixedSize(anychat.GetUserVideoWidth(userID),
  10.                                                                 anychat.GetUserVideoHeight(userID));
  11.                                         }
  12.                                         Surface s = holder.getSurface();
  13.                                         anychat.SetVideoPos(userID, s, 0, 0, 0, 0);
  14.                                         bOtherVideoOpened = true;
  15.                                 }
  16.                         }
复制代码

作者: william2014    时间: 2014-8-11 09:07
廖斌 发表于 2014-8-8 12:07
你可以通过计数器执行if (anychat.GetCameraState(userID) == 2

                                    ...

anychat.GetCameraState(userID)    这个值在什么时候会发生改变?  具体的客户端调用什么方法会改变对席视频状态?   
作者: 廖斌    时间: 2014-8-11 09:12
william2014 发表于 2014-8-11 09:07
anychat.GetCameraState(userID)    这个值在什么时候会发生改变?  具体的客户端调用什么方法会改变对席 ...

用户摄像头打开成功后会改变,客户端在调用UserCameraControl(userID,1)后会改变这个值。
作者: william2014    时间: 2014-8-11 09:15
廖斌 发表于 2014-8-11 09:12
用户摄像头打开成功后会改变,客户端在调用UserCameraControl(userID,1)后会改变这个值。

就是说我在定时器里面检测到anychat.GetCameraState(userID) == 0  调用UserCameraControl(userID,1)就OK了?  
作者: 廖斌    时间: 2014-8-11 09:20
william2014 发表于 2014-8-11 09:15
就是说我在定时器里面检测到anychat.GetCameraState(userID) == 0  调用UserCameraControl(userID,1)就 ...

不需要,在OnAnyChatOnlineUserMessage和OnAnyChatUserAtRoomMessage调用UserCameraControl就行了,UserCameraControl是异步的,执行完之后,并不能马上就能获取到摄像头已经打开的状态。
作者: william2014    时间: 2014-8-11 11:05
廖斌 发表于 2014-8-11 09:20
不需要,在OnAnyChatOnlineUserMessage和OnAnyChatUserAtRoomMessage调用UserCameraControl就行了,Use ...

anychat.GetCameraState(-1)这个是获取本地摄像头状态的?
作者: 廖斌    时间: 2014-8-11 11:23
william2014 发表于 2014-8-11 11:05
anychat.GetCameraState(-1)这个是获取本地摄像头状态的?

是的,是这个api。
作者: william2014    时间: 2014-8-13 16:48
廖斌 发表于 2014-8-11 11:23
是的,是这个api。

你好,现在有这种情况。和PC端视频时,同一时间PC端显示本地摄像头状态是2,Android获取远程摄像头状态是0。  请问在这种情况下怎么样才能获取到对方的摄像头状态等于2?是调用   
anychat.UserCameraControl(userID, 1);
anychat.UserSpeakControl(userID, 1);    这两个吗?
作者: william2014    时间: 2014-8-13 16:58
william2014 发表于 2014-8-13 16:48
你好,现在有这种情况。和PC端视频时,同一时间PC端显示本地摄像头状态是2,Android获取远程摄像头状态是 ...

以下是log日志。



[2014-08-13 16:31:43(714)]        ---------------------------AnyChat Platform Core SDK Client Log---------------------------
[2014-08-13 16:31:43(715)]        Load libanychatcore.so success!(V5.0 Build Time:Jul  3 2014 10:26:43)
[2014-08-13 16:31:43(716)]        Android OS SDK Version:16, Support ARMv7:2, Support Neon:4
[2014-08-13 16:31:43(727)]        Load libmediautil_v7.so success!(V5.0 Build Time:Jul  3 2014 10:28:00)
[2014-08-13 16:31:43(747)]        Load libmediashow_4.0.so success!(V5.0 Build Time:Jul  3 2014 10:27:19)
[2014-08-13 16:31:43(756)]        Load libmediacore_4.1.so success!(V5.0 Build Time:Jul  3 2014 10:27:42)
[2014-08-13 16:31:43(757)]        CPU:13.53 MIPS, HardwareCT MSM8960 CDP
[2014-08-13 16:31:43(758)]        Apply video parameter:320x240, bitrate:150000, quality:3, gop:40, fps:10, preset:3, codec:0
[2014-08-13 16:31:43(759)]        Invoke        BRAC_SetSDKOption(BRAC_SO_NETWORK_P2PPOLITIC=1)
[2014-08-13 16:31:43(759)]        Invoke        SetSDKOption(BRAC_SO_AUDIO_ECHOCTRL,1)
[2014-08-13 16:31:43(759)]        Invoke        BRAC_SetSDKOption(BRAC_SO_CORESDK_USEHWCODEC=0)
[2014-08-13 16:32:42(948)]        Invoke        BRAC_Connect(61.191.49.28,9808)=0
[2014-08-13 16:32:42(950)]        Invoke        LoginServer(username=userA4B7CB74-BF31-400F-8291-342CD76322C4)
[2014-08-13 16:32:43(016)]        CheckClientSocketLink         Connect(ip=61.191.49.28,port=9808)
[2014-08-13 16:32:43(171)]        Server version: V4.9(Build Time:2014-02-23 16:12:56, Server OS:Windows)
[2014-08-13 16:32:43(245)]        Message        OnConnect(bSuccess:1, errorcode=0)
[2014-08-13 16:32:43(535)]        Message        OnLoginSystem(userid=-422,errorcode=0,username=userA4B7CB74-BF31-400F-8291-342CD76322C4), msg deliver worked(0)
[2014-08-13 16:32:43(538)]        Invoke        EnterRoom(roomid=8)
[2014-08-13 16:32:43(597)]        Connection to streaming media server successfully!(udp delay:30ms)
[2014-08-13 16:32:43(718)]        Message        OnEnterRoom(roomid=8,errorcode=0,siteindex=1)
[2014-08-13 16:32:43(719)]        Audio Playback Device Init(0, 1, 16000, 16), Default Playback Driver
[2014-08-13 16:32:43(719)]        Message        OnReceiveOnlineUser(count=2,roomid=8)
[2014-08-13 16:32:43(828)]        Invoke        UserCameraControl(userid=8,bOpen=1)
[2014-08-13 16:32:43(828)]        Invoke        UserSpeakControl(userid=8,bOpen=1)
[2014-08-13 16:32:43(829)]        Invoke        UserCameraControl(userid=-1,bOpen=1)
[2014-08-13 16:32:43(830)]        Invoke        UserSpeakControl(userid=-1,bOpen=1)
[2014-08-13 16:32:43(881)]        Audio Init, error:0, device:-1, 1, 16000, 16, capmode:0
[2014-08-13 16:32:43(883)]        Audio codec init, handle:1, 11, 1, 16000, 16, 15850
[2014-08-13 16:32:43(965)]        Audio FX Status: VAD:1, NS:1, AGC:1, AEC:1
[2014-08-13 16:32:44(235)]        video init finish:320x240, NV21, fps:25
[2014-08-13 16:32:44(352)]        video codec init:codec:1, 10fps, 320x240, bitrate:150000, quality:3, preset:3, gop:40, handle:2
[2014-08-13 16:32:45(185)]        On Remote UserCameraControl(dwUserId:-421, bOpen:1)
[2014-08-13 16:32:45(247)]        On Remote UserSpeakControl(dwUserId:-421, bOpen:1)
[2014-08-13 16:34:53(873)]        Invoke        UserCameraControl(userid=8,bOpen=0)
[2014-08-13 16:34:53(874)]        Invoke        UserSpeakControl(userid=8,bOpen=0)
[2014-08-13 16:34:53(874)]        Invoke        UserCameraControl(userid=-1,bOpen=0)
[2014-08-13 16:34:53(875)]        Invoke        UserSpeakControl(userid=-1,bOpen=0)
[2014-08-13
作者: 佰锐技术-卓剑锐    时间: 2014-8-13 17:27
william2014 发表于 2014-8-13 16:48
你好,现在有这种情况。和PC端视频时,同一时间PC端显示本地摄像头状态是2,Android获取远程摄像头状态是 ...

这两个是请求打开userID的音视频
作者: 佰锐技术-卓剑锐    时间: 2014-8-13 17:29
william2014 发表于 2014-8-13 16:58
以下是log日志。

从您日志里看出服务器版本是V4.9,而客户端版本是V5.0,您先下载更新一下版本(最好是客户端与服务器端一同更新,然后再测试一下)
下载地址:http://www.anychat.cn/download.html
作者: 佰锐技术-高萌    时间: 2014-8-13 17:34
您好,您可以用这个函数来监听,不需要启动定时器去查询。
4.1.9.  用户摄像头状态变化消息
名称:WM_GV_CAMERASTATE
参数(WPARAM) :表示用户 ID 号;
参数(LPARAM) :表示摄像头的当前状态;
说明:当用户摄像头状态变化时被触发,摄像头的状态定义为:
GV_CAMERA_STATE_NULL: 0 没有摄像头,
GV_CAMERA_STATE_NORMAL: 1  有摄像头但是没有打开,
GV_CAMERA_STATE_OPEN :  2  摄像头已打开。




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