AnyChat技术支持论坛

标题: 打不开摄像头 [打印本页]

作者: great流浪    时间: 2013-10-23 20:49
标题: 打不开摄像头
我仿写的一个例子怎么在没有打开摄像头啊?
下面是我的代码,指导一下

public class MainActivity extends Activity implements AnyChatBaseEvent {
    public ConfigEntity configEntity;  //配置文件
    private AnyChatCoreSDK anychat; //核心SDK
    private Timer mTimer = new Timer(true);  
    private TimerTask mTimerTask;// 定时器   
    private Handler handler;  // 用Handler来不间断刷新即时
    private List<String> userlist = new ArrayList<String>();//保存在线用户
   
    private boolean bSelfVideoOpened = false;   // 本地视频是否已打开   
    private boolean bOtherVideoOpened = false;  // 对方视频是否已打开
    private SurfaceView remoteSurfaceView;  // 对方视频   
    private SurfaceView localSurfaceView;   // 本地视频
   
    private int userid = -13649; // 用户ID
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  remoteSurfaceView = (SurfaceView) findViewById(R.id.remoteSurfaceView);
  localSurfaceView = (SurfaceView) findViewById(R.id.localSurfaceView);
  
  configEntity = ConfigService.LoadConfig(this);//加载视频通话设置
  loginSystem();// 初始化SDK 连接服务器
        mTimerTask = new TimerTask(){   
           public void run(){   
           Message mesasge = new Message();   
           handler.sendMessage(mesasge);   
        }
        };
      mTimer.schedule(mTimerTask, 1000, 100);   
      handler = new Handler(){   
          public void handleMessage(Message msg){   
             VideoChat();// 不间断显示即时视频通话画面   
              super.handleMessage(msg);   
          }
       };   
}


  //第一步,初始化SDK 第二步,连接服务器
  //初始化SDK连接服务器
      public void loginSystem(){
        if (anychat == null){   
            anychat = new AnyChatCoreSDK();   
            anychat.SetBaseEvent(this);         // 设置基本事件回调函数   
            if (configEntity.useARMv6Lib != 0)  // 使用ARMv6指令集   
                anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEARMV6LIB, 1);   
                anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); // 初始化SDK   
      }   
        anychat.Connect("demo.anychat.cn", 8906);// 连接服务器
      }
      
      

//显示即时通讯画面
public void VideoChat(){
     //if (!bOtherVideoOpened){   
      //对方摄像头已经打开并且显示宽度不为0
      //Log.i("对方画面打开:", bOtherVideoOpened+" "+anychat.GetCameraState(userid)+" id为:"+userid);
        //if (anychat.GetCameraState(userid) == 2
             //  && anychat.GetUserVideoWidth(userid) != 0){   
           // Log.i("对方摄像头已经打开并且显示宽度不为0:", anychat.GetCameraState(userid)+" "+anychat.GetUserVideoWidth(userid));
              // SurfaceHolder holder = remoteSurfaceView.getHolder();   
              //  holder.setFormat(PixelFormat.RGB_565);   
              //  holder.setFixedSize(anychat.GetUserVideoWidth(userid),   
               //        anychat.GetUserVideoHeight(userid));   
               // Surface s = holder.getSurface();            // 获得视频画面   
              // anychat.SetVideoPos(userid, s, 0, 0, 0, 0); // 调用API显示视频画面   
               //bOtherVideoOpened = true;   
           // }   
       // }   
        if (!bSelfVideoOpened){   
         Log.i("44444444444", anychat.GetCameraState(-1)+" ");
             if (anychat.GetCameraState(-1) == 2
                    && anychat.GetUserVideoWidth(-1) != 0){   
                SurfaceHolder holder = localSurfaceView.getHolder();   
                holder.setFormat(PixelFormat.RGB_565);   
                holder.setFixedSize(anychat.GetUserVideoWidth(-1),   
                       anychat.GetUserVideoHeight(-1));   
               Surface s = holder.getSurface();   
               //AnyChatCoreSDK.mCameraHelper.SelectVideoCapture(AnyChatCoreSDK.mCameraHelper.CAMERA_FACING_FRONT);
                anychat.SetVideoPos(-1, s, 0, 0, 0, 0);   
               
                bSelfVideoOpened = true;
         }   
        }   
}

     
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
}
//连接服务器
@Override
public void OnAnyChatConnectMessage(boolean bSuccess) {
  if(!bSuccess){
   Toast.makeText(MainActivity.this, "连接服务器失败,自动重连,请稍后...", Toast.LENGTH_SHORT).show();
  }
  anychat.Login("代帮文", ""); // 服务器连接成功 用户登录
  
}
//登录信息
@Override
public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode) {
  if(dwErrorCode==0){
   Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
   anychat.EnterRoom(1, ""); // 用户登录成功 进入房间,1为房间编号  第二个参数为密码,可以为空
   ApplyVideoConfig();
   Toast.makeText(MainActivity.this, "获取房间人数。。。..."+userlist.size(), Toast.LENGTH_SHORT).show();
  }else {
   Toast.makeText(this, "登录失败,错误代码:" + dwErrorCode, Toast.LENGTH_SHORT).show();   
  }
}
@Override
public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode) {
      if (dwErrorCode == 0) {                     // 进入房间成功  打开本地音视频   
            Toast.makeText(this, "进入房间成功", Toast.LENGTH_SHORT).show();   
            anychat.UserCameraControl(-1, 1);       // 打开本地视频   
            anychat.UserSpeakControl(-1, 1);        // 打开本地音频   
         } else {   
            Toast.makeText(this, "进入房间失败,错误代码:" + dwErrorCode, Toast.LENGTH_SHORT).show();   
        }     
}
@Override
public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId) {
      if (dwRoomId == 1){   
         int user[] = anychat.GetOnlineUser();   
         if (user.length != 0){   
            for (int i = 0; i < user.length; i++){   
                userlist.add(user+"");   
              }   
              String temp =userlist.get(0);   
              userid = Integer.parseInt(temp);   
              anychat.UserCameraControl(userid, 1);// 请求用户视频   
              anychat.UserSpeakControl(userid, 1); // 请求用户音频   
            
           }   
          else {   
              Toast.makeText(MainActivity.this, "当前没有在线用户", Toast.LENGTH_SHORT).show();   
           }   
     }   
    }   

@Override
  public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter){   
       if (bEnter) {//新用户进入房间   
           userlist.add(dwUserId+"");   
        }   
        else {       //用户离开房间   
          if (dwUserId == userid)   
        {   
              Toast.makeText(MainActivity.this, "视频用户已下线", Toast.LENGTH_SHORT).show();   
             anychat.UserCameraControl(userid, 0);// 关闭用户视频   
              anychat.UserSpeakControl(userid, 0); // 关闭用户音频   
              userlist.remove(userid+"");          //移除该用户   
              if (userlist.size() != 0)   
             {   
                 String temp =userlist.get(0);   
                 userid = Integer.parseInt(temp);   
                  anychat.UserCameraControl(userid, 1);// 请求其他用户视频   
                   anychat.UserSpeakControl(userid, 1); // 请求其他用户音频   
                }   
          }   
            else {   
               userlist.remove(dwUserId+"");    //移除该用户   
            }   
      }
}

   //网络关闭事件
@Override
public void OnAnyChatLinkCloseMessage(int dwErrorCode) {
  Toast.makeText(MainActivity.this, "连接关闭,error:" + dwErrorCode, Toast.LENGTH_SHORT).show();   
}
   @Override
   protected void onDestroy(){ //程序退出     
   anychat.LeaveRoom(-1);  //离开房间     
      anychat.Logout();       //注销登录     
      anychat.Release();      //释放资源   
      mTimer.cancel();   
       super.onDestroy();   
  }   

public void ApplyVideoConfig(){
  if (configEntity.configMode == 1) // 自定义视频参数配置
  { // 设置本地视频编码的码率(如果码率为0,则表示使用质量优先模式)
  anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_BITRATECTRL,configEntity.videoBitrate);
  if (configEntity.videoBitrate == 0) {
   // 设置本地视频编码的质量
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL,configEntity.videoQuality);
   }
   // 设置本地视频编码的帧率
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FPSCTRL,configEntity.videoFps);
   // 设置本地视频编码的关键帧间隔
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_GOPCTRL,configEntity.videoFps * 4);
   // 设置本地视频采集分辨率
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_WIDTHCTRL,configEntity.resolution_width);
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_HEIGHTCTRL,configEntity.resolution_height);
   // 设置视频编码预设参数(值越大,编码质量越高,占用CPU资源也会越高)
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_PRESETCTRL,configEntity.videoPreset);
   }
   // 让视频参数生效 1
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_APPLYPARAM,configEntity.configMode);
   // P2P设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_NETWORK_P2PPOLITIC,configEntity.enableP2P);
   // 本地视频Overlay模式设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_OVERLAY,configEntity.videoOverlay);
   // 回音消除设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_AUDIO_ECHOCTRL,configEntity.enableAEC);
   // 平台硬件编码设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEHWCODEC,configEntity.useHWCodec);
   // 视频旋转模式设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ROTATECTRL,configEntity.videorotatemode);
   // 视频平滑播放模式设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_STREAM_SMOOTHPLAYMODE,configEntity.smoothPlayMode);
   // 视频采集驱动设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER,configEntity.videoCapDriver);
   // 本地视频采集偏色修正设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FIXCOLORDEVIA,configEntity.fixcolordeviation);
   // 视频显示驱动设置
   anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL,configEntity.videoShowDriver);
   }
}

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/loginbtn"
        android:text="@string/hello_world" />
    <TextView
        android:id="@+id/other"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="qita"
        />
    <SurfaceView   
        android:id="@+id/remoteSurfaceView"
        android:layout_width="fill_parent"
        android:layout_height="100dip"
        android:layout_below="@id/loginbtn"
        />
    <SurfaceView
        android:id="@+id/localSurfaceView"
        android:layout_width="fill_parent"
        android:layout_height="400dip"
        android:layout_below="@id/remoteSurfaceView"
        android:layout_marginTop="25dip"
        />
</RelativeLayout>








作者: admin    时间: 2013-10-23 23:13
您好,请将工程源代码打包上传(lib目录不用上传),我们帮您调试一下,谢谢!
作者: great流浪    时间: 2013-10-24 09:42
帮忙看看,谢谢了
作者: great流浪    时间: 2013-10-24 09:49
admin 发表于 2013-10-23 23:13
您好,请将工程源代码打包上传(lib目录不用上传),我们帮您调试一下,谢谢!

已经上传了,帮忙看看,谢谢了

AnyChat.rar

648.67 KB, 下载次数: 3


作者: 廖斌    时间: 2013-10-24 10:01
great流浪 发表于 2013-10-24 09:42
帮忙看看,谢谢了

你好,ApplyVideoConfig放在anychat.initSDK之后看看
作者: 廖斌    时间: 2013-10-24 10:05
另外我看你调用了ApplyVideoConfig,用的是Java模式吗?如果是,本地视频显示没有处理
作者: 廖斌    时间: 2013-10-24 10:24
廖斌 发表于 2013-10-24 10:05
另外我看你调用了ApplyVideoConfig,用的是Java模式吗?如果是,本地视频显示没有处理

看了你的工程,你在applyVideoConfig设置中用的是Java模式。请参考标准demo中videoactivy的处理
        // 如果是采用Java视频采集,则需要设置Surface的CallBack
                if(AnyChatCoreSDK.GetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER) == AnyChatDefine.VIDEOCAP_DRIVER_JAVA) {
                        myView.getHolder().addCallback(AnyChatCoreSDK.mCameraHelper);                       
                }
               
                // 如果是采用Java视频显示,则需要设置Surface的CallBack
                if(AnyChatCoreSDK.GetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL) == AnyChatDefine.VIDEOSHOW_DRIVER_JAVA) {
                        int index = anychat.mVideoHelper.bindVideo(otherView.getHolder());
                        anychat.mVideoHelper.SetVideoUser(index, userID);
               
作者: great流浪    时间: 2013-10-24 12:28
用的java调的,我又仿照你说的写了一个,但是没有登录,也没有进入房间,你帮忙看看哪里出问题了,谢谢

demo.zip

692.51 KB, 下载次数: 6


作者: 廖斌    时间: 2013-10-24 12:46
你好。你没有调用anychat.InitSdk哦,这个是加载库功能,每个程序只需要调用一次,调用之后才能使用其他功能
作者: great流浪    时间: 2013-10-24 13:30
我调用了的啊     我调用的这个方法啊
private void InitialSDK() {
                if(anychat==null){
                        anychat = new AnyChatCoreSDK();
                        anychat.SetBaseEvent(this);
                        // 启动AnyChat传感器监听
                        anychat.mSensorHelper.InitSensor(this);
                       
                }
                anychat.Connect("demo.anychat.cn", 8906);// 连接服务器
        }
作者: 廖斌    时间: 2013-10-24 13:40
初始化是这个哦,        anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0);
作者: great流浪    时间: 2013-10-24 21:41
我按照你说的改了,但是还是有问题   1,自己的摄像头打开了,但是对方用户看不到视频,  2,没有对方的视频在本地没有显示    3,自己摄像头打开了,但是好想旋转了90度,不是正常显示的。所以,还得麻烦你看一下

demo2.zip

689.77 KB, 下载次数: 2


作者: 廖斌    时间: 2013-10-25 14:33
great流浪 发表于 2013-10-24 21:41
我按照你说的改了,但是还是有问题   1,自己的摄像头打开了,但是对方用户看不到视频,  2,没有对方的视 ...

您好。附件中有一个一个activity操作所有流程的demo程序,您可以下载下来参考一下,库文件我已经删除了,编译的时候加上即可。

AnyChatForOneActivity.rar

381.51 KB, 下载次数: 7






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