解决方案 »

  1.   

    搞个点击事件,把两个surfacview位置换过来不行么
      

  2.   

    本地的surface 肯定是绑定了 camera的,切换的时候需要先关掉camera再开,对端的随时都可以换
      

  3.   

    是的,我现在的问题是本地的切换,我尝试关掉camera再打开,但是打开的时候startPreview报错,请问有什么办法可以解决,谢谢。
      

  4.   

    我贴一下我的代码:
    这是点击切换前使用的,正常:
    mCamera = openFrontCamera();
    if( mCamera== null ) {
    return;
    } mCamera.setDisplayOrientation(mOritation);
    mCamera.setPreviewCallback(this);

    try {
    Camera.Parameters params = mCamera.getParameters();
    List<Size> pSizes = params.getSupportedPreviewSizes();
    int previewWidth = 1080;
    int previewHeight = 0;
    if (pSizes.size() > 0) {
    for (int i = 0; i < pSizes.size(); i++) {
    Size tmpSize = pSizes.get(i);
    if (tmpSize.width <= previewWidth && tmpSize.width >= mWidth) {
    previewWidth = tmpSize.width;
    previewHeight = tmpSize.height;
    }
    }
    mWidth = previewWidth;
    mHeight = previewHeight;
    }
    params.setPreviewSize(mWidth, mHeight);
    params.setPreviewFormat(ImageFormat.NV21);
    mCamera.setParameters(params); mListner.onVideoPreviewSize(mWidth, mHeight);
    mEncBuf = new byte[H264_BUFFER_SIZE];
    mCamera.setPreviewDisplay(getSurface1().getHolder());
    mCamera.startPreview();
    mStartTime = System.currentTimeMillis();
    mStopTime = 0;
    } catch (IOException e) {
    Log.error("startRecord, exception="
    + e.getMessage());
    }点击切换后:
    mCamera.stopPreview();
    mCamera.setPreviewCallback(null);
    mCamera.release();
    mCamera = null;

    mCamera = openFrontCamera();
    mCamera.setDisplayOrientation(mOritation);
    mCamera.setPreviewCallback(CameraRecorder.this);
    Camera.Parameters params = mCamera.getParameters();
    List<Size> pSizes = params.getSupportedPreviewSizes();
    int previewWidth = 1080;
    int previewHeight = 0;
    if (pSizes.size() > 0) {
    for (int i = 0; i < pSizes.size(); i++) {
    Size tmpSize = pSizes.get(i);
    if (tmpSize.width <= previewWidth && tmpSize.width >= mWidth) {
    previewWidth = tmpSize.width;
    previewHeight = tmpSize.height;
    }
    }
    mWidth = previewWidth;
    mHeight = previewHeight;
    }
    params.setPreviewSize(mWidth, mHeight);
    params.setPreviewFormat(ImageFormat.NV21);
    mCamera.setParameters(params); mListner.onVideoPreviewSize(mWidth, mHeight);
    mEncBuf = new byte[H264_BUFFER_SIZE];
    mCamera.setPreviewDisplay(getSurface2().getHolder());
    mCamera.startPreview();   ----- 这里会报错
      

  5.   

    我目前是点击切换的时候,关闭重新加载到各自的View。这样确实效率不高也可能出现一些概率性的报错,也准备进行优化了。我的想法是通过嵌套一层Layout,动态改变Layout大小及位置来试下SurfaceView的大小位置变化。
      

  6.   

    你能改变surfaceview的大小,还得改变两个surfaceView的上下层叠关系,还要改变preview的size。这里会有好几个问题的。你都解决了吗?
      

  7.   

    你能改变surfaceview的大小,还得改变两个surfaceView的上下层叠关系,还要改变preview的size。这里会有好几个问题的。你都解决了吗?
    我在尝试
      

  8.   

    你能改变surfaceview的大小,还得改变两个surfaceView的上下层叠关系,还要改变preview的size。这里会有好几个问题的。你都解决了吗?
    我在尝试
    如果你成功了,麻烦把方法分享一下,谢谢
      

  9.   

    创建两个纹理,渲染目标都在纹理上,当你想切换时,只要把绘制到surface上的纹理变下就是了
      

  10.   

    纹理是openGL的一个概念,你渲染的目标可以是一个纹理,纹理可以非常快速的显示到某一个surface上,你没必要有关闭camera的动作,那样效果不会太好,而两个纹理互换下显示的surface需要的时间完全是机器指令的时间,建议你参照下SurfaceTexture,TextureView的使用纹理是什么东西?抱歉,我没看明白你说的