2013-08-23 9 views
7

Ich arbeite an Videoaufnahme-App, in der ich Vorschau anzeigen möchte und wenn Benutzer auf Aufnahme-Taste klicken, starten Sie die Aufnahme und wenn Benutzer klicken Sie auf Stopp-Taste stoppen Sie die Aufnahme.Media Recorder Start fehlgeschlagen in Android für Kamera

I Video-Vorschau auf meiner Oberfläche bekam aber wenn ich Taste drücken, starten Sie es zum Absturz mit Fehlern „MEDIA.RECORDER.START (native Methode). Hier ist mein Code Bitte helfen Sie mir Jungen.

@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 ist

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

log Katze bitte. – TheLittleNaruto

+0

@KumarGaurav hinzugefügt Protokoll –

+0

Complete Log Cat Man ... – TheLittleNaruto

Antwort

3

in Ihrem startRecording Methode versuchen, die Kamera zu sperren, bevor Sie es entsperren:

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

Dies kann viel weniger kompliziert sein als Sie denken. Android hat eine Menge der Beinarbeit für etwas so einfaches wie Aufnahme und Zurückführen der Videodatei erfolgt durch Intents mit ...

Nehmen Sie ein Video mit einer Kamera App Die Android Art und Weise von Aktionen an andere zu delegieren Anwendungen soll einen Intent aufrufen, der beschreibt, was Sie tun wollen. Dies umfasst drei Teile: die Absicht selbst, einen Aufruf, um die externe Aktivität zu starten, und einen Code, um das Video zu verarbeiten, wenn der Fokus auf Ihre Aktivität zurückkehrt.

Hier ist eine Funktion, die eine Absicht zum Aufnehmen von Video aufruft.

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

Sehen Sie das Video Die Android-Kamera-Anwendung das Video in der Absicht zu onActivityResult() als Uri zeigt auf das Video Lage in Speicher geliefert zurückgibt. Der folgende Code ruft dieses Video ab und zeigt es in einem VideoView an.

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

Fügen Sie diese auf das Manifest

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

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

0

ich den Start fehlgeschlagen Fehler -19 gelöst durch den videoFramesPerSecond Wert als 30. Wechsel, die der empfohlene Wert ist für QUALITY_1080p-Qualitätsstufe entsprechend der 1080p (1920 x 1080) Auflösung und QUALITY_480P- Qualitätsstufe entsprechend 480p (720 x 480) Auflösung.

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

11

fand ich diese Lösung und ihre Arbeit für mich in Ordnung und hat dieses Problem gelöst :)

für 2 Personen.ändern

einfach: 3+ android

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

zu:

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

Nizza! Sie sollten dies Entwickler-Seiten hinzufügen, die Sie Kamera-ID angeben sollten, wenn Sie nicht Standard verwenden! – Billda

+0

Es funktioniert! Vielen Dank. – gprathour

+0

Dies funktioniert auch für 6+ Android. Danke – EZDsIt

0

Versuchen werden folgende kann es funktionieren: Hilfe für jedermann:

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

Bei eingehenden Anruf war es sich Zeit nehmen, sich vorzubereiten.

Halten Sie die Vorbereitung für 1 Sekunde und alles ist in Ordnung.

1

Kommentar Codezeile,

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

Warum? Ich habe ein Problem mit der Einstellung VideoSize http://stackoverflow.com/questions/33898173/android-media-recorder-setvideosize-do-not-work –

Verwandte Themen