2012-09-14 5 views
0
에서 캡처 이미지

나는 비디오 녹화 및 안드로이드

비디오

내 응용 프로그램 그래서 내가 여기 달성하기 위해 두 가지, 1. 이미지 캡처 2. 기록이 내부에서 실행되는 상수 카메라가 필요 응용 프로그램을 개발하고 나는 다음 카메라를

을 비디오를 녹화하고 중지하고 다시 어려움을 겪고 나의 코드 조각입니다 : -

import java.io.File; 
import java.io.IOException; 
import java.util.Date; 
import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.media.MediaRecorder; 
import android.media.MediaRecorder.OnInfoListener; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.MenuItem; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.Menu; 
import android.view.SurfaceView; 
import android.widget.Toast; 

public class Myvideo1 extends Activity implements SurfaceHolder.Callback { 

    @Override 
    protected void onDestroy() { 
    // stopRecording(); 
     super.onDestroy(); 
    } 

    private SurfaceHolder surfaceHolder; 
    private SurfaceView surfaceView; 
    public MediaRecorder mrec = new MediaRecorder();  
    private Camera mCamera; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     surfaceView = (SurfaceView) findViewById(R.id.videoview); 
    //  if(mCamera==null) 
    //  mCamera = Camera.open(); 

     // Please maintain sequence of following code. 

     // If you change sequence it will not work. 

     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     try { 
      startRecording(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 

     menu.add(0, 0, 0, "Start"); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 

    { 
     if(item.getTitle().equals("Start")) 
     { 
      try { 

       startRecording(); 
      // item.setTitle("Stop"); 

      } catch (Exception e) { 

       String message = e.getMessage(); 
       Log.i(null, "Problem " + message); 
       mrec.release(); 
      } 
     } 

     else 
     // if(item.getTitle().equals("Stop")) 
     { 
      // mrec.stop(); 
     // mrec.release(); 
     // mrec = null; 
      // item.setTitle("Start"); 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    protected void startRecording() throws IOException 
    { 
     if(mCamera==null) 
      mCamera = Camera.open(); 

     String filename; 
     String path; 

     path= Environment.getExternalStorageDirectory().getAbsolutePath().toString(); 

     Date date=new Date(); 
     filename="/rec"+date.toString().replace(" ", "_").replace(":", "_")+".mp4"; 

     //create empty file it must use 
     File file=new File(path,filename); 

     mrec = new MediaRecorder(); 

     mCamera.lock(); 
     mCamera.unlock(); 

     // Please maintain sequence of following code. 

     // If you change sequence it will not work. 
     mrec.setCamera(mCamera);  
     mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mrec.setAudioSource(MediaRecorder.AudioSource.MIC);  
     mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
     mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mrec.setPreviewDisplay(surfaceHolder.getSurface()); 
     mrec.setOutputFile(path+filename); 
     mrec.setMaxDuration(10000);  //10 sec 



    // } 


    mrec.setOnInfoListener(new OnInfoListener() { 
     @Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
      if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) { 
       onStop();  

       Toast.makeText(getApplicationContext(), "video of 10 sec is completed", Toast.LENGTH_SHORT).show(); 

      } 
     } 
    } 
    ); 

    } 


    public void preparerec() 
    { 
     try { 
      mrec.prepare(); 
      mCamera.setPreviewDisplay(this.surfaceHolder); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    public void startrec() 
    { 
     mrec.start(); 
    } 





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

     Camera.Parameters parameters = mCamera.getParameters();  
     parameters.setPreviewSize(width, height);  
     mCamera.setParameters(parameters);  
     mCamera.startPreview(); 


    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) {  

     /* if (mCamera != null) { 
      Parameters params = mCamera.getParameters(); 
      mCamera.setParameters(params); 

      Log.i("Surface", "Created"); 
     } 
     else { 
      Toast.makeText(getApplicationContext(), "Camera not available!", 
        Toast.LENGTH_LONG).show(); 

      finish(); 
     }*/ 


     try     {  
      //Open the Camera in preview mode    
      mCamera = Camera.open(); 
      preparerec(); 
      //   
      }    
     catch(Exception ioe)   
      {   
      ioe.printStackTrace(System.out);   
      } 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCamera.stopPreview(); 
     mCamera.release();  

    } 


    public void onStop(){ 
     mrec.stop(); 
     mrec.release(); 
     mrec = null; 
    // item.setTitle("Start"); 
    } 


} 

나는 화면 깜박임 및 녹색 도착 StartRecording 때 내 삼성 갤럭시 s2, 이것에 대한 해결책은 없나요?

+0

예외/오류가 있습니까? –

+0

내가 화면을 시작하면 blurr이 이것에 대한 해결책을 얻을 수 있습니까? – kendrelaxman

답변

0

This Solution은 저에게 적합합니다.

+0

"이 솔루션"은 더 이상 유효한 링크가 아닙니다. – Yar

+0

이 링크를 수정하십시오. 고장났어. –

0

카메라 객체를 onCreate (startRecording - 항상 surfaceCreated 이전에 실행 됨) 및 surfaceCreated에서 모두 생성합니다. 카메라를 한 번만 엽니 다. 두 번째 시간은 예외를 throw합니다.

사용자가 버튼을 눌렀을 때 모두 실행되도록 녹음 코드를 이동하는 것이 좋습니다. 서로 다른 시간에 트리거되는 2-3 가지 방법을 통해 설정 작업을 분할 했으므로 호출 순서에 대해 상당히 추측하고 있습니다.

앱이 시작될 때 즉시 녹음을 시작해야하는 경우 다른 모든 프로그램이 완료되면 각 콜백 검사를 한 다음 녹음을 시작하는 것이 좋습니다.