2013-08-23 15 views
7

Pracuję nad aplikacją do nagrywania wideo, w której chcę wyświetlić podgląd, a gdy użytkownik kliknie przycisk nagrywania, rozpoczyna nagrywanie, a gdy użytkownik kliknie przycisk zatrzymania, przestaje nagrywać.Uruchomienie programu Media Recorder nie powiodło się w systemie Android dla kamery

mam podgląd wideo na mojej powierzchni, ale po naciśnięciu przycisku rozpoczęcia upaść z powodu błędu „MEDIA.RECORDER.START (Native Method). Oto mój kod Proszę mi pomóc facetów.

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

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

dziennika kota proszę. – TheLittleNaruto

+0

@KumarGaurav dodano dziennik –

+0

Pełny dziennik Cat Man ... – TheLittleNaruto

Odpowiedz

3

w swojej metodzie startRecording próbują zablokować aparat zanim go odblokować:

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

Może to być o wiele mniej skomplikowane, niż myślisz. Android zrobił dużo pracy nóg o coś tak prostego jak nagrywanie i powrocie plik wideo za pomocą intencjami ...

nagrać film z aparatu App Android sposób delegowania do innych działań aplikacjami jest wywołanie intencji opisującej to, co chcesz zrobić. Wiąże się to z trzema elementami: samym intencją, wezwaniem do rozpoczęcia aktywności zewnętrznej i pewnym kodem do obsługi wideo, gdy fokus powraca do Twojej aktywności.

Oto funkcja, która wywołuje zamiar przechwycenia wideo.

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

obejrzeć film Android aplikacja Camera zwraca wideo w intencyjny dostarczone do onActivityResult() jako Uri wskazując na miejscu wideo w pamięci. Poniższy kod odtwarza wideo i wyświetla je w VideoView.

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

Dodaj do tego manifestu

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

źródła: http://developer.android.com/training/camera/videobasics.html

0

I rozwiązali początek udało błąd -19 zmieniając wartość videoFramesPerSecond jako 30., która jest zalecana wartość for QUALITY_1080p-Poziom jakości odpowiadający rozdzielczości 1080p (1920 x 1080) i QUALITY_480P- Poziom jakości odpowiadający rozdzielczości 480p (720 x 480).

źródło: http://developer.android.com/guide/appendix/media-formats.html

11

znalazłem to rozwiązanie i jego pracy dobrze dla mnie i rozwiązać ten problem :)

dla 2 osób.3+ android:

Wystarczy zmienić:

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

do:

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

Nice! Powinny dodać to do stron programisty, który powinieneś podać id kamery, jeśli nie używasz domyślnego! – Billda

+0

To działa! Dzięki. – gprathour

+0

To działało również dla Androida 6+. Dzięki – EZDsIt

0

Spróbuj następujące mogą pracować: pomóc każdemu:

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

przychodzących nazywają to było poświęcenie czasu na przygotowanie.

Trzymaj przygotować na 1 sek i wszystko działało w porządku.

1

komentarz ten wiersz kodu,

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

Dlaczego? Mam problem z ustawieniem VideoSize http://stackoverflow.com/questions/33898173/android-media-recorder-setvideosize-do-work-work –

Powiązane problemy