2017-10-14 65 views
1

我正在开发一个Android应用程序,它在应用程序中记录视频。 它很好地记录了视频并保存在文件中。但开始预览功能失败,并且在录制过程中我没有预览。Android相机记录不错,但开始预览失败

这是代码:

private void startVRec(){ 
     //final View view = inflater.inflate(R.layout.fragment_conversation, container, false); 
     try { 

      vrec = new MediaRecorder(); 
      mCamera = Camera.open(); 
      params = mCamera.getParameters(); 
      Camera.Size size=getOptimalPreviewSize(params.getSupportedPreviewSizes(), 240, 240); 
      params.setPreviewSize(size.height, size.width); 
      mCamera.setParameters(params); 
      vrec.setPreviewDisplay(surfaceHolder.getSurface()); 
      mCamera.unlock(); 
      vrec.setCamera(mCamera); 
      camera_layout.setVisibility(View.VISIBLE); 
      surfaceView.setVisibility(View.VISIBLE); 
     } catch (Exception e) { 

     } 


    } 

,因为我在互联网上最例子所看到的,startpreview函数调用上surfaceChanged事件:

@Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, 
            int height) { 

      //Camera.Size previewSize=null; 
      try { 

       if (mCamera != null) 
       { 
        Camera.Size 
        size=getOptimalPreviewSize(params.getSupportedPreviewSizes(), 240, 240); 
        params.setPreviewSize(size.height, size.width); 
        mCamera.setParameters(params); 
        mCamera.startPreview(); 
       } 
      } catch (Exception e) { 
       Toast.makeText(activity, "error "+ e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     } 

并开始记录上surfaceCreated事件

public void surfaceCreated(SurfaceHolder holder){if(mCamera!= null){

 try { 

      vrec.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
      vrec.setAudioSource(MediaRecorder.AudioSource.MIC); 
      vrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
      vrec.setVideoFrameRate(30); 
      vrec.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
      vrec.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
      vrec.setPreviewDisplay(surfaceHolder.getSurface()); 
      vrec.setOutputFile(FileBackend.getConversationsImageDirectory() + System.currentTimeMillis() + ".mp4"); 
      vrec.prepare(); 

      vrec.start(); 

     } 
     catch(IllegalStateException e2){ 
       Toast.makeText(activity,"err cam stop ill :"+ e2.getMessage(),Toast.LENGTH_LONG).show(); 
      } 

     catch (Exception e) { 
      Toast.makeText(activity,"err surface created :"+ e.getMessage(),Toast.LENGTH_LONG).show(); 
     } 

    } 
    else { 
     Toast.makeText(activity, "Camera not available!", Toast.LENGTH_LONG).show(); 

    } 
} 

回答

0

尝试setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)为您的相机SurfaceView

+1

持有我已经在使用的onCreate它活动()事件。 – siavash