2013-08-23 39 views
7

Sto lavorando su registrazione video app in cui voglio visualizzare in anteprima e quando l'utente clicca sul pulsante di registrazione è avviare la registrazione e quando l'utente clicca pulsante di arresto è fermare la registrazione.Media Recorder avvio non riuscito in Android per la macchina fotografica

ho ricevuto il video di anteprima sulla mia superficie, ma quando si preme il pulsante di avvio si schianto con l'errore "MEDIA.RECORDER.START (Native Method). Ecco il mio codice Please help me ragazzi.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      surfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
      surfaceHolder = surfaceView.getHolder(); 
      surfaceHolder.addCallback(this); 
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      Button start =(Button)findViewById(R.id.start); 
      Button stop =(Button)findViewById(R.id.stop); 
      stop.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        camera.stopPreview(); 
        stopRecording(); 
       } 
      }); 
      start.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        startRecording(); 
       } 
      }); 
    } 

    @Override 
public void surfaceCreated(SurfaceHolder holder) { 
    camera = Camera.open(); 
    if (camera != null){ 
     Camera.Parameters params = camera.getParameters(); 
     camera.setParameters(params); 
    } 
    else { 
     Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show(); 
     finish(); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    if (previewRunning){ 
     camera.stopPreview(); 
    } 
    Camera.Parameters p = camera.getParameters(); 
    List<Camera.Size> sizes = p.getSupportedPreviewSizes(); 
    Camera.Size cs = sizes.get(0); 
    p.setPreviewSize(cs.width, cs.height); 
     camera.setParameters(p); 

    try { 
     camera.setPreviewDisplay(holder); 
     camera.startPreview(); 
     previewRunning = true; 
    } 
    catch (IOException e) { 
     Log.e(TAG,e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

private MediaRecorder mediaRecorder; 
    private final int maxDurationInMs = 20000; 
    private final long maxFileSizeInBytes = 500000; 
    private final int videoFramesPerSecond = 20; 

    public boolean startRecording(){ 
     try { 
      camera.unlock(); 

      mediaRecorder = new MediaRecorder(); 

      mediaRecorder.setCamera(camera); 
      mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

      mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 

      mediaRecorder.setMaxDuration(maxDurationInMs); 

     File tempFile = new File(getCacheDir(),"test.mp4"); 
      mediaRecorder.setOutputFile(tempFile.getPath()); 

      mediaRecorder.setVideoFrameRate(videoFramesPerSecond); 
      mediaRecorder.setVideoSize(surfaceView.getWidth(), surfaceView.getHeight()); 

      mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
      mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 

      mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 

      mediaRecorder.setMaxFileSize(maxFileSizeInBytes); 

         mediaRecorder.prepare(); 
      mediaRecorder.start(); 

      return true; 
     } catch (IllegalStateException e) { 
      Log.e(TAG,e.getMessage()); 
      e.printStackTrace(); 
      return false; 
     } catch (IOException e) { 
      Log.e(TAG,e.getMessage()); 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    public void stopRecording(){ 
     mediaRecorder.stop(); 
     camera.lock(); 
    } 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview(); 
    previewRunning = false; 
    camera.release(); 
} 

}

Log è

08-31 02:20:11.781: E/MediaRecorder(14519): start failed: -19 
08-31 02:20:11.781: D/AndroidRuntime(14519): Shutting down VM 
08-31 02:20:11.781: W/dalvikvm(14519): threadid=1: thread exiting with uncaught exception (group=0x416c9700) 
08-31 02:20:11.781: E/AndroidRuntime(14519): FATAL EXCEPTION: main 
08-31 02:20:11.781: E/AndroidRuntime(14519): java.lang.RuntimeException: start failed. 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.media.MediaRecorder.start(Native Method) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.example.cameratest.MainActivity.startRecording(MainActivity.java:135) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.example.cameratest.MainActivity$2.onClick(MainActivity.java:61) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.view.View.performClick(View.java:4240) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.view.View$PerformClick.run(View.java:17721) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.os.Handler.handleCallback(Handler.java:730) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.os.Looper.loop(Looper.java:137) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at java.lang.reflect.Method.invokeNative(Native Method) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at java.lang.reflect.Method.invoke(Method.java:525) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-31 02:20:11.781: E/AndroidRuntime(14519): at dalvik.system.NativeStart.main(Native Method) 
+0

registro gatto per favore. – TheLittleNaruto

+0

@KumarGaurav aggiunto registro –

+0

Log completo Cat Man ... – TheLittleNaruto

risposta

3

nel metodo startRecording cercare di serratura della macchina fotografica prima di sbloccarlo:

mediaRecorder = new MediaRecorder(); 
camera.lock(); 
camera.unlock(); 
-3

Questo può essere molto meno complicato di quanto si pensi. Android ha fatto un sacco di lavoro di gambe per qualcosa di semplice come la registrazione e la restituzione del file video utilizzando Intenti ...

registrare un video con una fotocamera App Il modo Android di delegare ad altri interventi le applicazioni è di invocare un Intento che descrive ciò che si vuole fare. Ciò comporta tre parti: l'Intento stesso, una chiamata per avviare l'attività esterna e un codice per gestire il video quando l'attenzione torna alla tua attività.

Ecco una funzione che richiama l'intento di acquisire video.

private void dispatchTakeVideoIntent() { 
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO); 
} 

visualizzare il video L'applicazione Fotocamera Android ritorna il video nell'intento consegnato a onActivityResult() come Uri punta alla posizione di video in deposito. Il seguente codice recupera questo video e lo visualizza in una VideoView.

private void handleCameraVideo(Intent intent) { 
mVideoUri = intent.getData(); 
mVideoView.setVideoURI(mVideoUri); 
} 

Aggiungere questo al Manifesto

<uses-feature android:name="android.hardware.camera" /> 

fonte: http://developer.android.com/training/camera/videobasics.html

0

ho risolto l'inizio errore -19 fallito cambiando il valore videoFramesPerSecond come 30. che è il valore consigliato per QUALITY_1080p-Livello di qualità corrispondente alla risoluzione 1080p (1920 x 1080) e QUALITY_480P- Livello di qualità corrispondente alla risoluzione 480p (720 x 480).

fonte: http://developer.android.com/guide/appendix/media-formats.html

11

ho trovato questa soluzione e il suo lavoro bene per me e risolto questo problema :)

per 2.3+ Android:

Basta cambiare:

mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

a:

mediaRecorder.setProfile(CamcorderProfile.get(CameraID,CamcorderProfile.QUALITY_HIGH)); 
+0

Bello! Dovrebbero aggiungerlo alle pagine degli sviluppatori per specificare l'id della telecamera se non si utilizza quella predefinita! – Billda

+0

Funziona! Grazie. – gprathour

+0

Questo ha funzionato anche per Android 6+. Grazie – EZDsIt

0

prova a seguire può essere il lavoro: aiutare a nessuno:

 try { 
      mediaRecorder.prepare(); 
      Thread.sleep(1000); 
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
     mediaRecorder.start(); 

Per chiamata entrante è stato prendersi del tempo per prepararsi

Tenere la preparazione per 1 secondo e tutto funziona correttamente.

1

commento questa riga di codice,

mediaRecorder.setVideoSize(surfaceView.getWidth(), surfaceView.getHeight()); 
+0

Perché? Ho un problema con l'impostazione di VideoSize http://stackoverflow.com/questions/33898173/android-media-recorder-setvideosize-do-not-work –