Autore Topic: aquisizione video = prepare failed  (Letto 1111 volte)

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
aquisizione video = prepare failed
« il: 15 Dicembre 2011, 12:52:23 CET »
0
sto cercando di fare una app che possa fare video con android 2.2, ma continuo a ricevere l'errore "prepare failed"nel logcat appena clicco sul bottone per iniziare la registrazione.
ho letto in giro che dipende dai parametri impostati per la camera, ma non riesco a risolvere..avete idea di come rendere funzionante questo codice?:
Codice (Java): [Seleziona]
public class videomanostart extends Activity implements SurfaceHolder.Callback{

        private static final String TAG = "TAG";

        private SurfaceView surfaceView;
        private SurfaceHolder surfaceHolder;
        private Camera camera;
        private boolean previewRunning;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.camera_surface);
                surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
                surfaceHolder = surfaceView.getHolder();
                surfaceHolder.addCallback(this);
                surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
                Log.v(TAG, "1");
        Button buttonstartt= (Button)findViewById(R.id.buttonstartt);
       
        buttonstartt.setOnClickListener(new View.OnClickListener(){
               
                public void onClick(View v){
                        startRecording();
                }
        });
        Button buttonstopp= (Button)findViewById(R.id.buttonstopp);
       
        buttonstopp.setOnClickListener(new View.OnClickListener(){
               
                public void onClick(View v){
                        stopRecording();
                }
        });
       
        }
// prepara il surfaceview
       
        public void surfaceCreated(SurfaceHolder holder) {
                Log.v(TAG, "2");
                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();
                }
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                Log.v(TAG, "3");
                if (previewRunning){
                        camera.stopPreview();
                }
               
               
               
                Camera.Parameters p = camera.getParameters();          
               
               
//              p.setPreviewSize(320, 240);
//              p.setPreviewFormat(PixelFormat.JPEG);
                camera.setParameters(p);

                try {
                        Log.v(TAG, "4");
                        camera.setPreviewDisplay(holder);
                        camera.startPreview();
                        previewRunning = true;
                }
                catch (IOException e) {
                        Log.e(TAG,e.getMessage());
                        e.printStackTrace();
                }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
                Log.v(TAG, "surface distrutto");
                camera.stopPreview();
                previewRunning = false;
                camera.release();
        }

       
       
// preparo per registrazione
       

       
       
         private MediaRecorder mediaRecorder;
                private final int maxDurationInMs = 20000;
                private final long maxFileSizeInBytes = 500000;
                private final int videoFramesPerSecond = 20;

                private boolean startRecording(){
                        Log.v(TAG, "start rec");
                        try {
                                camera.unlock();

                                mediaRecorder = new MediaRecorder();
                                mediaRecorder.setCamera(camera);
                                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                                mediaRecorder.setMaxDuration(5000);
                                mediaRecorder.setOutputFile("/sdcard/videocapture_example.mp4");               // nome file
                                mediaRecorder.setVideoFrameRate(20);
                                mediaRecorder.setVideoSize(surfaceView.getWidth(), surfaceView.getHeight());
                                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
                                mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
                                mediaRecorder.setMaxFileSize(5000);
                                            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;
                        }
                }
                private void stopRecording(){
                        Log.v(TAG, "stop rec");
                        mediaRecorder.stop();
                        camera.lock();
                }


                }
questo è l'errore nel logcat:
Codice: [Seleziona]
12-15 11:41:08.643: V/CAMERA_TUTORIAL(436): start rec
12-15 11:41:08.753: I/MediaRecorderJNI(436): prepare: surface=0x25d910 (id=2)
12-15 11:41:08.784: E/MediaRecorder(436): prepare failed: -17
12-15 11:41:08.784: E/CAMERA_TUTORIAL(436): prepare failed.
12-15 11:41:08.784: W/System.err(436): java.io.IOException: prepare failed.
12-15 11:41:08.793: W/System.err(436):         at android.media.MediaRecorder._prepare(Native Method)
12-15 11:41:08.793: W/System.err(436):         at android.media.MediaRecorder.prepare(MediaRecorder.java:503)
12-15 11:41:08.793: W/System.err(436):         at spy.pro.videomanostart.startRecording(videomanostart.java:142)
12-15 11:41:08.793: W/System.err(436):         at spy.pro.videomanostart.access$0(videomanostart.java:115)
12-15 11:41:08.793: W/System.err(436):         at spy.pro.videomanostart$1.onClick(videomanostart.java:41)
12-15 11:41:08.793: W/System.err(436):         at android.view.View.performClick(View.java:2408)
12-15 11:41:08.793: W/System.err(436):         at android.view.View$PerformClick.run(View.java:8816)
12-15 11:41:08.793: W/System.err(436):         at android.os.Handler.handleCallback(Handler.java:587)
12-15 11:41:08.793: W/System.err(436):         at android.os.Handler.dispatchMessage(Handler.java:92)
12-15 11:41:08.793: W/System.err(436):         at android.os.Looper.loop(Looper.java:123)
12-15 11:41:08.793: W/System.err(436):         at android.app.ActivityThread.main(ActivityThread.java:4627)
12-15 11:41:08.793: W/System.err(436):         at java.lang.reflect.Method.invokeNative(Native Method)
12-15 11:41:08.793: W/System.err(436):         at java.lang.reflect.Method.invoke(Method.java:521)
12-15 11:41:08.793: W/System.err(436):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-15 11:41:08.793: W/System.err(436):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-15 11:41:08.793: W/System.err(436):         at dalvik.system.NativeStart.main(Native Method)
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:aquisizione video = prepare failed
« Risposta #1 il: 15 Dicembre 2011, 13:49:04 CET »
0
Non ho esperienza di videorecording, ma ad occhio proverei due cose:
(1) Impostare una videosize di quelle supportate dalla camera.
(2) Impostare l'outputfile così .setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/tuofile.mp4");
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:aquisizione video = prepare failed
« Risposta #2 il: 15 Dicembre 2011, 13:57:51 CET »
0
ho provato come mi hai consigliato, ma non è cambiato nulla purtroppo ;(
in rete ho visto che l'errore prepare -17 dipende da dove è posizionato il comando camera.unlock() ...
quindi modificando la sequenza dei parametri , ho risolto l'errore -17 ... ma ora mi esce l'errore prepare failed -1 di cui non riesco a trovare nulla a riguardo ..
questa è la nuova sequenza di comandi:
Codice (Java): [Seleziona]
                                mediaRecorder.setCamera(camera);
                                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

                                mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
                                camera.unlock();
                                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                                mediaRecorder.setMaxDuration(5000);
                                mediaRecorder.setOutputFile("/sdcard/videocapture_example.3gp");               // nome file
                                mediaRecorder.setVideoFrameRate(20);
                                mediaRecorder.setVideoSize(surfaceView.getWidth(), surfaceView.getHeight());
                                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
                                mediaRecorder.setMaxFileSize(5000);
                               
                    mediaRecorder.prepare();
                                mediaRecorder.start();

e questo il nuovo logcat che esce dopo aver premuto il bottone per registrare:
Codice: [Seleziona]
12-15 13:03:55.703: V/TAG(829): start rec
12-15 13:03:55.743: I/MediaRecorderJNI(829): prepare: surface=0x2490a0 (id=2)
12-15 13:03:55.803: E/MediaRecorder(829): prepare failed: -1
12-15 13:03:55.803: E/TAG(829): prepare failed.
12-15 13:03:55.803: W/System.err(829): java.io.IOException: prepare failed.
12-15 13:03:55.803: W/System.err(829):         at android.media.MediaRecorder._prepare(Native Method)
12-15 13:03:55.803: W/System.err(829):         at android.media.MediaRecorder.prepare(MediaRecorder.java:503)
12-15 13:03:55.803: W/System.err(829):         at spy.pro.videomanostart.startRecording(videomanostart.java:141)
12-15 13:03:55.803: W/System.err(829):         at spy.pro.videomanostart.access$0(videomanostart.java:115)
12-15 13:03:55.803: W/System.err(829):         at spy.pro.videomanostart$1.onClick(videomanostart.java:41)
12-15 13:03:55.803: W/System.err(829):         at android.view.View.performClick(View.java:2408)
12-15 13:03:55.803: W/System.err(829):         at android.view.View$PerformClick.run(View.java:8816)
12-15 13:03:55.803: W/System.err(829):         at android.os.Handler.handleCallback(Handler.java:587)
12-15 13:03:55.803: W/System.err(829):         at android.os.Handler.dispatchMessage(Handler.java:92)
12-15 13:03:55.803: W/System.err(829):         at android.os.Looper.loop(Looper.java:123)
12-15 13:03:55.803: W/System.err(829):         at android.app.ActivityThread.main(ActivityThread.java:4627)
12-15 13:03:55.803: W/System.err(829):         at java.lang.reflect.Method.invokeNative(Native Method)
12-15 13:03:55.803: W/System.err(829):         at java.lang.reflect.Method.invoke(Method.java:521)
12-15 13:03:55.803: W/System.err(829):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-15 13:03:55.803: W/System.err(829):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-15 13:03:55.803: W/System.err(829):         at dalvik.system.NativeStart.main(Native Method)
« Ultima modifica: 15 Dicembre 2011, 14:09:13 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:aquisizione video = prepare failed
« Risposta #3 il: 15 Dicembre 2011, 14:31:32 CET »
0
Controlla se "surfaceHolder.getSurface()" ritorna un valore diverso da nullo, c'è qualcosa che non va' quando imposti la preview display.
adb logcat | tee /tmp/logcat | grep TAG

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:aquisizione video = prepare failed
« Risposta #4 il: 15 Dicembre 2011, 15:31:28 CET »
0
ho provato a mettere il log per vedere il risultato ed esce questo:
Codice: [Seleziona]
12-15 14:26:54.205: V/TAG(391): surfaceHolder.getSurface()  =Surface(name=null, identity=39)
il log completo dell'errore:
Codice: [Seleziona]
12-15 14:26:54.125: V/TAG(391): start rec
12-15 14:26:54.205: V/TAG(391): surfaceHolder.getSurface()  =Surface(name=null, identity=39)
12-15 14:26:54.205: I/MediaRecorderJNI(391): prepare: surface=0x259b58 (id=2)
12-15 14:26:54.245: E/MediaRecorder(391): prepare failed: -1
12-15 14:26:54.245: E/TAG(391): prepare failed.
12-15 14:26:54.245: W/System.err(391): java.io.IOException: prepare failed.
12-15 14:26:54.245: W/System.err(391):         at android.media.MediaRecorder._prepare(Native Method)
12-15 14:26:54.245: W/System.err(391):         at android.media.MediaRecorder.prepare(MediaRecorder.java:503)
12-15 14:26:54.245: W/System.err(391):         at spy.pro.videomanostart.startRecording(videomanostart.java:142)
12-15 14:26:54.255: W/System.err(391):         at spy.pro.videomanostart.access$0(videomanostart.java:115)
12-15 14:26:54.255: W/System.err(391):         at spy.pro.videomanostart$1.onClick(videomanostart.java:41)
12-15 14:26:54.255: W/System.err(391):         at android.view.View.performClick(View.java:2408)
12-15 14:26:54.255: W/System.err(391):         at android.view.View$PerformClick.run(View.java:8816)
12-15 14:26:54.255: W/System.err(391):         at android.os.Handler.handleCallback(Handler.java:587)
12-15 14:26:54.255: W/System.err(391):         at android.os.Handler.dispatchMessage(Handler.java:92)
12-15 14:26:54.255: W/System.err(391):         at android.os.Looper.loop(Looper.java:123)
12-15 14:26:54.255: W/System.err(391):         at android.app.ActivityThread.main(ActivityThread.java:4627)
12-15 14:26:54.255: W/System.err(391):         at java.lang.reflect.Method.invokeNative(Native Method)
12-15 14:26:54.255: W/System.err(391):         at java.lang.reflect.Method.invoke(Method.java:521)
12-15 14:26:54.255: W/System.err(391):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-15 14:26:54.255: W/System.err(391):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-15 14:26:54.255: W/System.err(391):         at dalvik.system.NativeStart.main(Native Method)

non riesco proprio a vedere dove possa essere il problema :(
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:aquisizione video = prepare failed
« Risposta #5 il: 12 Marzo 2012, 15:02:18 CET »
0
Ho lo stesso identico problema! Anche io sono passato dall'avere un errore -17 ad avere un errore -1, spostando l'unlock() della camera, tuttavia non riesco a capire come andare avanti... ???

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:aquisizione video = prepare failed
« Risposta #6 il: 12 Marzo 2012, 16:54:12 CET »
0
Ho scoperto il problema, è nel video encoder.

Codice (XML): [Seleziona]
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
non piace l'MPEG_4_SP. Ho messo H263 e la registrazione parte. Peccato che il video occupi sempre e soltanto 0 byte sulla SD CARD, adesso...

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:aquisizione video = prepare failed
« Risposta #7 il: 12 Marzo 2012, 17:30:51 CET »
0
Ho capito. Le seguenti linee di codice vanno messe subito dopo l'unlock() della camera e nel seguente ordine, assolutamente non in quello inverso, pena nessuna segnalazione di errore ma dimensione del file di output di 0 byte:

Codice (XML): [Seleziona]
                mMediaRecorder.setPreviewDisplay(surface);
                mMediaRecorder.setCamera(mCamera);