2012-05-08 37 views
6

Próbuję utworzyć rejestrator wideo w systemie Android i przygotowałem mój kod, który powinien działać - ale ciągle pojawia się komunikat o błędzie start failed: -19.Android MediaRecorder - "Uruchomienie nie powiodło się: -19"

Oto mój kod:

public boolean startRecording() { 
    try { 
     camera.unlock(); 
     mediaRecorder = new MediaRecorder(); 
     mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() { 

       @Override 
       public void onError(MediaRecorder mr, int what, int extra) { 
       Log.i(TAG, "Error"); 
      } 
     }); 

     mediaRecorder.setCamera(camera); 
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     Log.i(TAG, "a"); 

     mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
     mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); 
     Log.i(TAG, "b"); 

     mediaRecorder.setMaxDuration(maxDurationInMs); // set to 20000 

     String uniqueOutFile = OUTPUT_FILE + System.currentTimeMillis() + ".3gp"; 
     File outFile = new File(uniqueOutFile); 
     if (outFile.exists()) { 
      outFile.delete(); 
     } 
     mediaRecorder.setOutputFile(uniqueOutFile); 
     mediaRecorder.setVideoFrameRate(videoFramesPerSecond); // set to 20 
     mediaRecorder.setVideoSize(sView.getWidth(), sView.getHeight()); 
     Log.i(TAG, "c"); 

     mediaRecorder.setPreviewDisplay(holder.getSurface()); 
     mediaRecorder.setMaxFileSize(maxFileSizeInBytes); // set to 50000 
     mediaRecorder.prepare(); 
     Log.i(TAG, "d"); 

     mediaRecorder.start(); 
     Log.i(TAG, "e"); 

     return true; 
     } catch (IllegalStateException e) { 
      Log.i(TAG, "f"); 
      Log.e(TAG, e.getMessage()); 
      e.printStackTrace(); 
      camera.lock(); 
      return false; 
     } catch (IOException e) { 
      Log.i(TAG, "g"); 
      Log.e(TAG, e.getMessage()); 
      e.printStackTrace(); 
      camera.lock(); 
      return false; 
     } catch (RuntimeException e) { 
      Log.i(TAG, "h"); 
      Log.e(TAG, e.getMessage()); 
      camera.lock(); 
      return false; 
     } 
    } 

Wszystkie dzienniki debugowania (od „a” do „D”) są drukowane w dzienniku, więc wydaje się, że wszystkie kroki upto mediaRecorder.prepare() są wykonane prawidłowo. Następnie przechwytuje numer RuntimeException z komunikatem start failed: -19. Jest podobny question, ale to nie rozwiązuje mojego problemu.

Czy istnieje inny powód, aby uzyskać taki błąd?

Odpowiedz

14

Właśnie dowiedziałem się błąd, w tej linii:

mediaRecorder.setVideoSize(sView.getWidth(), sView.getHeight()); 

po komentując tę ​​linię, kod działa doskonale!

+0

nie działa na samsung wielkich duetów – Neji

+4

Komentując tę ​​line out rzuci siły blisko na urządzeniach Samsung, takich jak GN2, GS. To nie jest rozwiązanie. Chociaż nie mam Androida od dawna, mam już dość Androida!Po prostu pozwalali producentom swobodnie wykonywać telefony bez standardu. – Dante

+2

Jak określić rozmiar wideo, jeśli usuniesz ten wiersz? – TOP

2

mi rozwiązać mój problem raz i to dodaje do nagrywania wideo

/** 
* Start video recording by cleaning the old camera preview 
*/ 
private void startVideoRecorder() { 
    // THIS IS NEEDED BECAUSE THE GLASS CURRENTLY THROWS AN ERROR OF 
    // "MediaRecorder start failed: -19" 
    // THIS WONT BE NEEDED INCASE OF PHONE AND TABLET 
    // This causes crash in glass kitkat version so remove it 
    // try { 
    // mCamera.setPreviewDisplay(null); 
    // } catch (java.io.IOException ioe) { 
    // Log.d(TAG, 
    // "IOException nullifying preview display: " 
    // + ioe.getMessage()); 
    // } 
    // mCamera.stopPreview(); 
    // mCamera.unlock(); 
    recorder = new MediaRecorder(); 
    // Let's initRecorder so we can record again 
    initRecorder(); 
} 

/** 
* Initialize video recorder to record video 
*/ 
private void initRecorder() { 
    try { 
     File dir = new File(folderPath); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 
     mCamera.stopPreview(); 
     mCamera.unlock(); 
     videofile = new File(dir, fileName + ".mp4"); 
     recorder.setCamera(mCamera); 

     // Step 2: Set sources 
     recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

     // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
     recorder.setProfile(CamcorderProfile 
       .get(CamcorderProfile.QUALITY_HIGH)); 

     // Step 4: Set output file 
     recorder.setOutputFile(videofile.getAbsolutePath()); 
     // Step 5: Set the preview output 
     recorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 
     // Step 6: Prepare configured MediaRecorder 
     recorder.setMaxDuration(video_duration * 1000); 
     recorder.setOnInfoListener(new OnInfoListener() { 

      @Override 
      public void onInfo(MediaRecorder mr, int what, int extra) { 
       if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) { 

        mCamera.stopPreview(); 
        releaseMediaRecorder(); 

        /* 
        * initiate media scan and put the new things into the 
        * path array to make the scanner aware of the location 
        * and the files you want to see 
        */MediaScannerConnection.scanFile(
          CuxtomCamActivity.this, 
          new String[] { videofile.getPath() }, null, 
          null); 

        Intent intent = new Intent(); 
        intent.putExtra(CuxtomIntent.FILE_PATH, 
          videofile.getPath()); 
        intent.putExtra(CuxtomIntent.FILE_TYPE, FILE_TYPE.VIDEO); 
        setResult(RESULT_OK, intent); 
        finish(); 
       } 

      } 
     }); 
     recorder.prepare(); 
     recorder.start(); 
    } catch (Exception e) { 
     Log.e("Error Stating CuXtom Camera", e.getMessage()); 
    } 
} 
private void releaseMediaRecorder() { 
    if (recorder != null) { 
     recorder.reset(); // clear recorder configuration 
     recorder.release(); // release the recorder object 
     recorder = null; 
    } 
} 

Dla szczegółowej instrukcji odnoszą się do tego Open Source Cuxtom Cam

0

problem jest w kodzie setVideoSize().

i dlaczego ten błąd kod ...

Z badań, jakie spełniliśmy, kod błędu -19 przychodzi, kiedy jest problem z rozmiarem wideo ustawiony przez MediaRecorder#setVideoSize()

przebiegu tej Kod i zobacz whitch ekran, że aparat w telefonie może wspierać:

final List<Camera.Size> mSupportedVideoSizes = getSupportedVideoSizes(mCamera); 
     for (Camera.Size str : mSupportedVideoSizes) 
      Log.e(TAG, "mSupportedVideoSizes "+str.width + ":" + str.height + " ... " 
        + ((float) str.width/str.height)); 

i sposób jest:

public List<Size> getSupportedVideoSizes(Camera camera) { 
     if (camera.getParameters().getSupportedVideoSizes() != null) { 
      return camera.getParameters().getSupportedVideoSizes(); 
     } else { 
      // Video sizes may be null, which indicates that all the supported 
      // preview sizes are supported for video recording. 
      return camera.getParameters().getSupportedPreviewSizes(); 
     } 
    } 
0

Miałem problem z niektórymi telefonami. Odkryłem, że nie mogłem w niektórych z nich ustawić rozmiarów profilu camcoder. Ale kiedy to działało dla problematycznych androidów, przestało działać na wcześniej działających urządzeniach.

Więc w końcu moja realizowane logika było coś takiego:

  • ustawić szerokość/wysokość
  • próbie uruchomienia rejestratora merdia
  • W przypadku wyjątku, spróbuj ponownie bez ustawiania szerokość/wysokość

Trochę logiki kosza, ale zadziałało.

mam setup projekt github z tego wdrożenia go wypróbować: https://github.com/rafaelsilverio/MediaRecorder

Powiązane problemy