2014-02-26 2 views
2

인사말 동료 Androiders. 저는 카메라를 사용하여 연속 미리보기를 표시하는 앱을 개발 중이며 사용자가 원할 때 피드의 동영상을 녹화하고 저장합니다.이미 실행중인 미리보기의 비디오 녹화

첫 번째 부분은 설정했지만 레코딩 작업에 문제가 있습니다. 나는 여러 가지 가이드와 내가 치고있는 문제에 대한 해답을 따라 왔지만 항상 "잘못된 상태"문제 (현재 setCamera가 유효하지 않은 상태 (4)로 호출 됨)로 진행되는 것처럼 보입니다.

이것은 전체 코드입니다. 좀 봐 주셔서 감사합니다!

Camera camera; 
SurfaceView preview; 
SurfaceHolder previewHolder; 
MediaRecorder recorder; 
boolean recording = false; 
boolean cameraConfigured = false; 
private Button camera_button; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    //Remove title bar 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

    //Remove notification bar 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    //Keep screen awake 
    this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    setContentView(R.layout.activity_fullscreen); 

    preview = (SurfaceView)findViewById(R.id.camerapreview);   
    previewHolder = preview.getHolder(); 
    previewHolder.addCallback(surfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    camera_button = (Button) findViewById(R.id.camera_button); 

    camera_button.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      if (recording) 
      { 
       recorder.stop(); 
       recording = false; 

       initRecorder(); 
       prepareRecorder(); 

       camera_button.setText("Record"); 
      } 
      else 
      { 
       recording = true; 
       recorder.start(); 

       camera_button.setText("Stop"); 
      } 
     } 
    }); 

    // Wake screen 
    WakeLock screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
      PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 
    screenLock.acquire(); 
    screenLock.release(); 
} 

@Override 
public void onResume() 
{  
    super.onResume(); 

    if (camera == null) 
    { 
     camera = Camera.open();   
    } 

    preview.setVisibility(View.VISIBLE); 
    startPreview(); 
} 

@Override 
public void onPause() 
{  
    if(camera != null) 
    {   
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
     cameraConfigured = false;   
    } 

    preview.setVisibility(View.INVISIBLE); 

    super.onPause(); 
} 

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() 
{ 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     initRecorder(); 
     prepareRecorder();   
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, 
           int width, int height) 
    { 
     initPreview(width, height); 
     startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     if (recording) 
     { 
      recorder.stop(); 
      recording = false; 
     } 
     recorder.release(); 
    } 
}; 


private void initRecorder() 
{ 
    recorder = new MediaRecorder();  

    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

    CamcorderProfile cpHigh = CamcorderProfile 
      .get(CamcorderProfile.QUALITY_HIGH); 
    recorder.setProfile(cpHigh); 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    recorder.setOutputFile("/sdcard" + File.separator + "testVideo_" + timeStamp + ".mp4"); 

    camera.unlock(); 
    recorder.setCamera(camera); 
} 

private void prepareRecorder() 
{ 
    recorder.setPreviewDisplay(previewHolder.getSurface()); 

    try 
    { 
     recorder.prepare(); 
    } 
    catch (IllegalStateException e) 
    { 
     e.printStackTrace(); 

    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 

    } 
} 

private void initPreview(int width, int height) 
{ 
    if (camera != null && previewHolder.getSurface() != null) 
    { 
     try 
     { 
      camera.setPreviewDisplay(previewHolder); 
     } 
     catch (Throwable t) 
     { 
      Log.e("CameraTest",""); 
     } 

     if (!cameraConfigured) 
     { 
      Camera.Parameters parameters=camera.getParameters(); 
      Camera.Size size = getBestPreviewSize(width, height, parameters); 
      Camera.Size pictureSize = getSmallestPictureSize(parameters); 

      if (size != null && pictureSize != null) 
      { 
       parameters.setPreviewSize(size.width, size.height); 
       parameters.setPictureSize(pictureSize.width, 
              pictureSize.height); 

       parameters.set("cam_mode", 1); 
       parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); 
       parameters.setPictureFormat(ImageFormat.JPEG); 
       camera.setParameters(parameters); 
       cameraConfigured=true; 
      } 
     } 
    }   
} 

private void startPreview() 
{ 
    if (cameraConfigured && camera != null) 
    { 
     camera.startPreview(); 
    } 
} 

public Camera.Size getBestPreviewSize(int width, int height, 
     Camera.Parameters parameters) 
{  
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) 
    { 
     if ((size.width <= width && size.height <= height) || (size.height <= width && size.width <= height)) 
     { 
      if (result == null) 
      { 
       result=size; 
      } 
      else 
      { 
       int resultArea=result.width * result.height; 
       int newArea=size.width * size.height; 

        if (newArea > resultArea) 
        { 
         result=size; 
        } 
      } 
     } 
    } 

    return(result); 


} 

public Camera.Size getSmallestPictureSize(Camera.Parameters parameters) 
{ 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPictureSizes()) 
    { 
     if (result == null) 
     { 
      result=size; 
     } 
     else 
     { 
      int resultArea=result.width * result.height; 
      int newArea=size.width * size.height; 

      if (newArea < resultArea) 
      { 
       result=size; 
      } 
     } 
    } 
    return(result); 
} 

답변

2

android video recording sample code에서 보면 안드로이드는 mediaRecorder를 구성하기 위해 매우 구체적인 순서가 필요합니다. 내게는 initRecorder()을 다음과 같이 정리해야합니다.

private void initRecorder() 
{ 
    recorder = new MediaRecorder(); 
    // The following two lines should precede setAudioSource line 
    camera.unlock(); 
    recorder.setCamera(camera); 

    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

    CamcorderProfile cpHigh = CamcorderProfile 
      .get(CamcorderProfile.QUALITY_HIGH); 
    recorder.setProfile(cpHigh); 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    recorder.setOutputFile("/sdcard" + File.separator + "testVideo_" + timeStamp + ".mp4"); 
} 
+0

Aha! 고마워, 나는 결국 국가 오류를 지나쳤다! 내 getBestPreviewSize 메서드의이 줄은 null 포인터 (for (Camera.Size size : parameters.getSupportedPreviewSizes()))를 제공하지만 다른 문제입니다. – Droidmon