Autore Topic: Eccezione durante la registrazione di un video  (Letto 866 volte)

Offline F4L|{0

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Play Store ID:
    Jesi
  • Sistema operativo:
    Windows XP + ubuntu
Eccezione durante la registrazione di un video
« il: 11 Agosto 2011, 20:34:10 CEST »
0
stavo lavorando all'acquisizione di un video tramite la camera del cellulare.
guardando in giro ho visto che viene usato il Media Recorder
di seguito il codice che uso

Codice: [Seleziona]
     private boolean mediaRecorderConfig()
     {
             try
             {
                        mediaRecorder = new MediaRecorder();
                        mediaRecorder.setCamera(mCamera);
                        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                        mediaRecorder.setMaxDuration(maxDurationInMs);
                       
                        mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
                                       
                        mediaRecorder.setVideoFrameRate(videoFramesPerSecond);
                        mediaRecorder.setVideoSize(mSurfaceView.getWidth(), mSurfaceView.getHeight());
                        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
                        mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
                        mediaRecorder.setMaxFileSize(maxFileSizeInBytes);
                        mediaRecorder.prepare();   
             }
             catch (IOException e)
             {                       
                     Log.e(TAG,e.getMessage());
                     e.printStackTrace();
                     return false;
              }
             return true;
     }

Codice: [Seleziona]
         private boolean startRecording()
         {
                try
                {
                        mCamera.unlock();
                        if(!mediaRecorderConfig())
                                return false;
                        mediaRecorder.start();
                        recording = true;
                        return true;
                }
                catch (IllegalStateException e)
                {
                        Log.e(TAG,e.getMessage());
                        e.printStackTrace();
                        return false;
                }
        }

Codice: [Seleziona]
         private void stopRecording()
         {
                if(mediaRecorder != null)
                        mediaRecorder.stop();
                if(mCamera != null)
                        mCamera.lock();
                recording = false;
         }


tutto funziona a dovere finche non viene chiamato il
Codice: [Seleziona]
mediaRecorder.start();
qui ottengo un errore

di seguito l'estratto del LogCat

Codice: [Seleziona]
08-11 20:23:42.832: ERROR/AndroidRuntime(4661): FATAL EXCEPTION: main
08-11 20:23:42.832: ERROR/AndroidRuntime(4661): java.lang.RuntimeException: start failed.
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at android.media.MediaRecorder.start(Native Method)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at it.android.TrackRace.ViewCamera.startRecording(ViewCamera.java:323)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at it.android.TrackRace.ViewCamera.onOptionsItemSelected(ViewCamera.java:205)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at android.app.Activity.onMenuItemSelected(Activity.java:2205)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:748)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at android.view.View$PerformClick.run(View.java:9080)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at android.os.Handler.handleCallback(Handler.java:587)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at android.os.Looper.loop(Looper.java:130)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at android.app.ActivityThread.main(ActivityThread.java:3683)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at java.lang.reflect.Method.invokeNative(Native Method)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at java.lang.reflect.Method.invoke(Method.java:507)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-11 20:23:42.832: ERROR/AndroidRuntime(4661):     at dalvik.system.NativeStart.main(Native Method)

qualcuno sa darmi un consiglio una dritta su come risolvere il problema?

grazie


Offline fabio80s

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 7, Samsung Galaxy S2
  • Play Store ID:
    FABIO+SARACINO
  • Sistema operativo:
    Windows 7
Re:Eccezione durante la registrazione di un video
« Risposta #1 il: 04 Marzo 2012, 19:34:42 CET »
0
Anche io ho lo stesso problema, sto sviluppando su un HTC Hero e ho seguito vari esempi per la registrazione di video, ma, quando lancio il metodo start(), l'applicazione crasha generando una IllegalStateException. C'è qualcuno che ha sviluppato un registratore video che funzioni realmente? Oppure è un problema del mio modello di smartphone?

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:Eccezione durante la registrazione di un video
« Risposta #2 il: 05 Marzo 2012, 02:41:10 CET »
0
cosi a occhio sembra che non hai aperto la camera con .open() e la sequenza di settaggi che hai nel Try{}mi sembra sbagliata..se non rispetti la sequenza giusta nel dare i vari settaggi, ti crea degli errori e non parte il prepare()...quindi quando fai partire lo start, crassha perchè provi a forzare lo start senza che il prepare sia andato a buon fine..
molto facile che le logcat, qualche riga prima dell'errore hai il messaggio di log dell'IOException..prova a verificare e nel caso cerca qualche esempio in rete per vedere la sequenza esatta...ce ne sono a decine di funzionanti..
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline fabio80s

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 7, Samsung Galaxy S2
  • Play Store ID:
    FABIO+SARACINO
  • Sistema operativo:
    Windows 7
Re:Eccezione durante la registrazione di un video
« Risposta #3 il: 05 Marzo 2012, 10:56:08 CET »
0
Ciao, innanzi tutto grazie per la risposta; il codice che uso io è il seguente:

Codice (Java): [Seleziona]
package app.travel.utilities;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaRecorder;
//import android.media.CamcorderProfile; //da API level 8
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class RecorderPreview extends SurfaceView implements SurfaceHolder.Callback
{
  //Create objects for MediaRecorder and SurfaceHolder.
  MediaRecorder recorder;
  SurfaceHolder mHolder;
  Camera mCamera;

  //Create constructor of Preview Class. In this, get an object of
  //surfaceHolder class by calling getHolder() method. After that add
  //callback to the surfaceHolder. The callback will inform when surface is
  //created/changed/destroyed. Also set surface not to have its own buffers.

  public RecorderPreview(Context context, MediaRecorder temprecorder)
  {
          super(context);
      recorder=temprecorder;
     
      mCamera = Camera.open();
      mHolder=getHolder();
      mHolder.addCallback(this);
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
   }

  // Implement the methods of SurfaceHolder.Callback interface

  // SurfaceCreated : This method gets called when surface is created.
  // In this, initialize all parameters of MediaRecorder object as explained
  // above.

  public void surfaceCreated(SurfaceHolder holder)
  {      
          try
          {
                  Log.d("RecorderPreview", "RecorderPreview::surfaceCreated()");
                 
                  mCamera.unlock();
                  recorder.setCamera(mCamera);
                 
                  /*********************************************************************************/
                 
                  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);                
                  recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                 
                  /*********************************************************************************/
                 
                  recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                 
                  /*********************************************************************************/
                 
                  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                  recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);                
                  recorder.setOutputFile("/sdcard/recordvideooutput.3gpp");              
                  recorder.setVideoSize(320, 240);
                  recorder.setVideoFrameRate(24);
                  recorder.setPreviewDisplay(mHolder.getSurface());
                 
                  /*********************************************************************************/
                 
                  recorder.prepare();
          }
          catch (Exception e)
          {
        String message = e.getMessage();
          }
  }
 
//SurfaceDestroyed : This method gets called immediately before the
//surface is being destroyed. Stop camera preview because surface will no
//longer exist.

  public void surfaceDestroyed(SurfaceHolder holder)
  {
          if(recorder!=null)
          {
                  recorder.release();
                  recorder = null;
          }
  }

  //surfaceChanged : This method is called after the surface is created.
  public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
  {
         
  }
}  

A me pare di seguire l'ordine corretto, descritto nel grafico qui : http://developer.android.com/reference/android/media/MediaRecorder.html

Considera inoltre che sto sviluppando su API Level 7 e l'oggetto CamcorderProfile non è disponible (lo è solo da Level >= 8).
Le chiamate ai metodi setVideoSize e setVideoFrameRate le ho aggiunte poco fa, ma non è cambiato nulla.
Grazie mille

Offline fabio80s

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 7, Samsung Galaxy S2
  • Play Store ID:
    FABIO+SARACINO
  • Sistema operativo:
    Windows 7
Re:Eccezione durante la registrazione di un video
« Risposta #4 il: 05 Marzo 2012, 11:11:48 CET »
0
Aggiungo che nel logcat, come messaggio ultimo (e quindi in cima) mostrato quando si verifica l'eccezione, ho :

start called in an invalid state 4

Offline fabio80s

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 7, Samsung Galaxy S2
  • Play Store ID:
    FABIO+SARACINO
  • Sistema operativo:
    Windows 7
Re:Eccezione durante la registrazione di un video
« Risposta #5 il: 05 Marzo 2012, 11:16:16 CET »
0
Ho scoperto l'errore, lo smartphone deve essere scollegato dal pc, altrimenti, condividendo la sdcard con quest'ultimo, si perde la capacità di scrivervi.
Ora bannatemi!  :-P