2013-04-05 11 views
26

Sto registrando video con MediaRecorder. Il mio codice funziona bene su 2.3.3 ma fallisce su 4.0.3.MediaRecorder.stop() stop non riuscito: -1007

La questione è la seguente: il codice mediaRecorder.stop() genera il RuntimeExeption

java.lang.RuntimeException: stop failed. 
    at android.media.MediaRecorder.stop(Native Method) 

con il messaggio LogCat

04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007 

UPDATE

che ho trovato, che segnala un MediaPlayer errore (tramite MediaPlayer.OnErrorListener) quasi immediatamente dopo l'avvio. Il codice di errore è 100 (media server morto), extra -1007.

UPDATE 2 Codice per preparare il MediaRecorder

  c = Camera.open(); 

    ... 

    // Step 1: Unlock and set camera to MediaRecorder 
    camera.unlock(); 
    mediaRecorder.setCamera(camera); 

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

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

    // manual set up! 

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 

    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); 
    mediaRecorder.setVideoFrameRate(profile.videoFrameRate); 
    mediaRecorder.setVideoSize(profile.videoFrameWidth, 
      profile.videoFrameHeight); 

    mediaRecorder.setAudioChannels(profile.audioChannels); 
    mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate); 
    mediaRecorder.setAudioSamplingRate(profile.audioSampleRate); 

    mediaRecorder.setAudioEncoder(profile.audioCodec); 
    //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
    mediaRecorder.setVideoEncoder(profile.videoCodec); 

    // mediaRecorder.setProfile(profile); 

    // Step 4: Set output file 
    mediaRecorder.setOutputFile("somefile.mp4"); 

    // Step 5: Set the preview output 
    mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface()); 

    // Step 6: Prepare configured MediaRecorder 
    try { 
     mediaRecorder.prepare(); 
    } catch ... 
    { release mediaRecorder} 

poi ho simplyCall mediaRecorder.start() si prega di notare, che ho bisogno di video da codificare in formato mp4. Questo codice funziona su Samsng Galaxy GIO (Android 2.3.3) e fallisce come descritto su Acer E305 (Android 4.0.2)

Qualche idea? Grazie.

+0

ho trovato problema simile ma non è stato utile: https://code.google.com/p/android/issues/detail?id=38107 – alekz

+0

Puoi mostrare il codice per come si prepara l'oggetto 'MediaRecorder'? –

+0

Potrebbe anche essere utile qualche frammento di codice –

risposta

20

Risolto finalmente. Il problema era impostare le dimensioni di anteprima prima di impostare l'anteprima effettiva per la fotocamera. La dimensione di anteprima DEVE essere uguale alla dimensione del video selezionato.

CamcorderProfile profile = [get required profile]; 

Camera.Parameters parameters = mCamera.getParameters(); 
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight); 
mCamera.setParameters(parameters); 

mCamera.setPreviewDisplay([surface holder]); 
mCamera.startPreview(); 

... 

//configure MediaRecorder and call MediaRecorder.start() 
+1

La tua leggenda :) mi ha aiutato molto. Ho avuto un problema in corso che è stato risolto. Su alcuni modelli di telefono ho avuto problemi intermittenti. in particolare, l'HTC Sensation in esecuzione 4.x.x non è stato in grado di registrare video il 100% delle volte senza prima impostare la dimensione dell'anteprima su una superficie anche se è larga solo 1px. Stavo avendo strani problemi in cui a volte registrava video a strisce verde brillante o era completamente ingiocabile, ma solo quando le risoluzioni di 720x480 o superiore. Usando 'setPreviewSize()' il problema è stato risolto. :) – wired00

+0

grazie mi ha aiutato !! ma ricevo un'eccezione nullpointer quando abbandona la mia app. '10 -11 22: 38: 47.609: E/SurfaceView (18569): NullPointerException durante l'aggiornamento della finestra. mSession = [email protected], mWindow = [email protected] 10-11 22: 38: 47.609: E/SurfaceView (18569): NullPointerException imprevisto. ' Potete per favore aiutarmi a riguardo. – user2376920

+0

Stavo usando questo codice per un po 'senza alcun problema, ma da quando ho aggiornato il mio Nexus 6 ad Android 6.0, l'app si arresta in modo casuale su: 'parameters.setPreviewSize' –

14

Citando la documentazione del metodo di "stop" in MediaRecorder.java in 4.0.3:

registrazione si interrompe. Chiamalo dopo l'avvio(). Una volta interrotta la registrazione, dovrai configurarlo di nuovo come se fosse stato appena creato . Si noti che una RuntimeException viene intenzionalmente generata a l'applicazione, se non sono stati ricevuti dati audio/video validi quando viene chiamato lo stop() . Ciò accade se stop() viene chiamato immediatamente dopo start(). L'errore consente all'applicazione di agire di conseguenza su pulendo il file di output (eliminare il file di output, ad esempio), poiché il file di output non viene costruito correttamente quando ciò accade.

E il fatto che MediaPlayer stia segnalando questo "server multimediale morto" è dovuto allo stesso motivo. Puoi pubblicare il resto del tuo codice per vedere se c'è qualche idea sbagliata che potrebbe causare questo problema?

+0

Grazie per la risposta. Conosco già il motivo per cui viene lanciata l'eccezione. Ma non riesco ancora ad ottenerlo, perché la configurazione del MediaRecorder non funziona su acerE350 (Android 4.0.3) e cosa significa l'errore "-1007". Per quanto riguarda la tua domanda - posso postare il resto del mio codice, ma funziona in modo robusto su molti altri telefoni ... Ho controllato che tutti i metodi sono stati richiamati nell'ordine corretto ed è possibile eseguire la riconfigurazione di MEdiaRecorders su Errore ServerDied, ma voglio solo configurare MediaRenderer per creare video MP4 con la massima qualità possibile. – alekz

+1

C'è qualche possibilità (anche se piccola) di avviare e arrestare il registratore troppo velocemente? Quanti fotogrammi (o secondi) stai cercando di registrare? –

+0

Credo di sì. Funziona su diversi telefoni budget. Il codice è piuttosto standard. Per quanto riguarda i fps, ho provato 30 (profilo QUALITY_HIGH) e 15. Entrambi falliscono. – alekz

0

così ho trovato questo errore sono stati segnalati per me su l'emulatore Android per API 18 (dopo la registrazione stava lavorando bene su versioni successive).

Quello che ho trovato è che se avevo chiamato Camera.startPreview() prima di inizializzazione e l'avvio di iniziare il mio MediaRecorder esempio, mi piacerebbe avere il registro stop failed: -1007 quando si chiama MediaRecorder.stop, ma se ho chiamato Camera.stopPreview() prima inizializzazione mia MediaRecorder il video sarebbe registrare bene.

Spero che questo aiuta

+0

https: // stackoverflow.it/questions/47996933/mediarecorder-keep-freezing-during-recording-non riescono a mettersi al lavoro. Questo è il mio codice, sto avendo questo problema, quindi dove sto andando male? – iBEK