AnyChat技术支持论坛

标题: Android 求救!!视频通信时,如何实现先对视频帧进行处理,再显示? [打印本页]

作者: lova    时间: 2013-11-23 01:00
标题: Android 求救!!视频通信时,如何实现先对视频帧进行处理,再显示?
你好,我希望给视频通信加一些图像处理,比如漫画风格、哈哈镜风格等,看了源码,
发现应该修改AnyChatVideoHelper类的ShowVideo函数,
但是经过测试,发现没有调用该函数。

希望管理员能指导一下我!十分感谢。

作者: admin    时间: 2013-11-23 08:50
您好,您需要设置“Java视频显示驱动模式”,才会调用AnyChatVideoHelper::ShowVideo函数。

AnyChat默认是“内核显示驱动模式”,需要您在程序中主动设置一下,可参考Demo程序的相关代码,Demo程序默认有主动设置“Java视频显示驱动模式”。
作者: lova    时间: 2013-11-23 14:15
admin 发表于 2013-11-23 08:50
您好,您需要设置“Java视频显示驱动模式”,才会调用AnyChatVideoHelper::ShowVideo函数。

AnyChat默认 ...

好的,我找找看,非常感谢您。
作者: lova    时间: 2013-11-26 11:21
admin 发表于 2013-11-23 08:50
您好,您需要设置“Java视频显示驱动模式”,才会调用AnyChatVideoHelper::ShowVideo函数。

AnyChat默认 ...

你好,我按照demo设置了Java视频显示驱动模式以后,会调用ShowVideo函数,
但是无法显示本地视频,anychat.GetCameraState(-1) == 2说明摄像头已经打开,但是
anychat.GetUserVideoWidth(-1) == 0 ,请问这可能是什么原因
作者: lova    时间: 2013-11-26 11:27
lova 发表于 2013-11-23 14:15
好的,我找找看,非常感谢您。
  1. // 初始化SDK 连接服务器
  2.         private void loginSystem(){
  3.                 if (anychat == null){
  4.                         anychat = new AnyChatCoreSDK();
  5.                         anychat.SetBaseEvent(this);                        // 设置基本事件回调函数
  6.                         ApplyVideoConfig();
  7.                         anychat.mSensorHelper.InitSensor(this);

  8.                         if (configEntity.useARMv6Lib != 0)        // 使用ARMv6指令集
  9.                                 anychat.SetSDKOptionInt(AnyChatDefine.
  10.                                                 BRAC_SO_CORESDK_USEARMV6LIB, 1);
  11.                         anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); // 初始化SDK
  12.                 }
  13.                 anychat.Connect("demo.anychat.cn", 8906);

  14.         }

  15.         // 显示即时视频通话画面
  16.         public void VideoChat(){
  17.                 if (!bOtherVideoOpened){
  18. //                        System.out.println("camera state =" + anychat.GetCameraState(userid) + " userVideoWidth="+anychat.GetUserVideoWidth(userid));
  19.                         if (anychat.GetCameraState(userid) == 2
  20.                                         && anychat.GetUserVideoWidth(userid) != 0){
  21.                                 SurfaceHolder holder = remoteSurfaceView.getHolder();
  22.                                 holder.setFormat(PixelFormat.RGB_565);
  23.                                 holder.setFixedSize(anychat.GetUserVideoWidth(userid),
  24.                                                 anychat.GetUserVideoHeight(userid));
  25.                                 Surface s = holder.getSurface();                        // 获得视频画面
  26.                                 anychat.SetVideoPos(userid, s, 0, 0, 0, 0); // 调用API显示视频画面
  27.                                 bOtherVideoOpened = true;
  28.                         }
  29.                 }
  30.                 if (!bSelfVideoOpened){
  31.                         System.out.println("camera state =" + anychat.GetCameraState(-1) + " userVideoWidth="+anychat.GetUserVideoWidth(-1));
  32.                         if (anychat.GetCameraState(-1) == 2
  33.                                         && anychat.GetUserVideoWidth(-1) != 0){
  34.                                 SurfaceHolder holder = localSurfaceView.getHolder();
  35.                                 holder.setFormat(PixelFormat.RGB_565);
  36.                                 holder.setFixedSize(anychat.GetUserVideoWidth(-1),
  37.                                                 anychat.GetUserVideoHeight(-1));
  38.                                 Surface s = holder.getSurface();
  39.                                 anychat.SetVideoPos(-1, s, 0, 0, 0, 0);
  40.                                 bSelfVideoOpened = true;
  41.                         }
  42.                 }
  43.         }
复制代码
  1.         public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode){
  2.                 if (dwErrorCode == 0) {                                                // 进入房间成功  打开本地音视频
  3.                         Toast.makeText(this, "进入房间成功", Toast.LENGTH_SHORT).show();
  4.                        

  5.                         // 如果是采用Java视频采集,则需要设置Surface的CallBack
  6.                         if(AnyChatCoreSDK.GetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER) == AnyChatDefine.VIDEOCAP_DRIVER_JAVA) {
  7.                                 localSurfaceView.getHolder().addCallback(AnyChatCoreSDK.mCameraHelper);                       
  8.                                 System.out.println("#####local addCallback");
  9.                         }
  10.                         if (configEntity.videoOverlay != 0) {
  11.                                 localSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  12.                         }
  13.                        
  14.                         String[] strVideoCaptures = anychat.EnumVideoCapture();
  15.                         if (strVideoCaptures != null && strVideoCaptures.length > 1) {
  16.                                 // 默认打开前置摄像头
  17.                                 for(int i=0;i<strVideoCaptures.length;i++)
  18.                                 {
  19.                                         System.out.println("#####Camers size="+strVideoCaptures.length);
  20.                                         String strDevices=strVideoCaptures[i];
  21.                                         if(strDevices.indexOf("Front")>=0) {
  22.                                                 anychat.SelectVideoCapture(strDevices);
  23.                                                 break;
  24.                                         }
  25.                                 }
  26.                         }
  27.                        
  28.                         anychat.UserCameraControl(-1, 1);                 // 打开本地视频
  29.                         anychat.UserSpeakControl(-1, 1);                 // 打开本地音频

  30.                 } else {
  31.                         Toast.makeText(this, "进入房间失败,错误代码:" + dwErrorCode, Toast.LENGTH_SHORT).show();
  32.                 }
  33.         }
复制代码
  1. /*
  2. 和视频中第一个用户视频
  3. */       
  4. public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId){
  5.                 if (dwRoomId == 2){
  6.                         int user[] = anychat.GetOnlineUser();
  7.                         if (user.length != 0){
  8.                                 for (int i = 0; i < user.length; i++){
  9.                                         userlist.add(user[i]+"");
  10.                                 }
  11.                                 String temp =userlist.get(0);
  12.                                 userid = Integer.parseInt(temp);
  13.                                 anychat.UserCameraControl(userid, 1);// 请求用户视频
  14.                                 anychat.UserSpeakControl(userid, 1); // 请求用户音频
  15.                                
  16.                                 // 如果是采用Java视频显示,则需要设置Surface的CallBack
  17.                                 if(AnyChatCoreSDK.GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) == AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
  18.                                         int index = anychat.mVideoHelper.bindVideo(remoteSurfaceView.getHolder());
  19.                                         anychat.mVideoHelper.SetVideoUser(index, userid);
  20.                                 }
  21.                         }
  22.                         else {
  23.                                 Toast.makeText(VideoChatActivity.this, "当前没有在线用户", Toast.LENGTH_SHORT).show();
  24.                         }
  25.                 }
  26.         }
复制代码

作者: admin    时间: 2013-11-26 12:51
您好,本地视频是摄像头直接Preview的,没有经过anychat.mVideoHelper类。

至于您的程序中不显示本地视频,则可能是初始化本地视频surface的时候遗漏了代码,可参考标准demo程序的源代码。
作者: lova    时间: 2013-11-26 16:17
admin 发表于 2013-11-26 12:51
您好,本地视频是摄像头直接Preview的,没有经过anychat.mVideoHelper类。

至于您的程序中不显示本地视 ...

你好,我已经把问题解决了,当anychat进入房间后,再调用initSDK,initLayout就可以了
谢谢啦
作者: admin    时间: 2013-11-26 17:10
您好,应该不需要再调用InitSDK吧,估计只需要再调用InitLayout就行了,您可以试试。
作者: lova    时间: 2013-11-27 21:41
admin 发表于 2013-11-26 17:10
您好,应该不需要再调用InitSDK吧,估计只需要再调用InitLayout就行了,您可以试试。

真的很感谢你们




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