7

Ambiente:

Nexus 7 Jelly Bean 4.1.2Editing VideoView Android incornicia

Problema:

Sto cercando di presentare una domanda di Motion Detection che funziona con RTSP utilizzando VideoView.

Vorrei che ci fosse qualcosa come un onNewFrameListener

videoView.onNewFrame(Frame frame) 

Ho cercato di ottenere l'accesso ai fotogrammi prime di un flusso RTSP via VideoView ma non riusciva a trovare alcun supporto per che nel SDK di Android .

ho scoperto che VideoView incapsula classe MediaPlayer del Android.

Quindi mi sono immerso nella libreria media_jni per provare a trovare un modo per accedere ai frame non elaborati, ma non sono riuscito a trovare il buffer di byte o qualunque cosa rappresenti un frame.

Domanda:

Qualcuno ha un'idea di dove o come posso trovare questo buffer e ottenere l'accesso ad esso?

O qualsiasi altra idea di implementare un Motion Detection su una VideoView?

Anche se è sais che ho bisogno di ricompilare l'AOSP.

+0

Il vostro obiettivo su Android 4.1 e solo fino? – yorkw

+0

Sì, ma se ho bisogno di una versione precedente posso gestirla anch'io. – Danpe

risposta

1

Nel tuo caso vorrei usare l'anteprima fotocamera invece il VideoView, se si sta lavorando con il movimento dal vivo, i video non registrati. È possibile utilizzare un callback di anteprima della fotocamera per catturare ogni fotogramma catturato dalla fotocamera. Questo callback implementa:

onPreviewFrame(byte[] data, Camera camera) 
Called as preview frames are displayed. 

Quale penso che potrebbe essere utile per voi.

http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html

dire se questo è ciò che si sta cercando.

Buona fortuna.

+1

Non posso usare Camera Preview per RTSP Stream, solo per l'acquisizione live della telecamera ... – Danpe

3

è possibile estendere la VideoView e sovrascrivere il metodo draw(Canvas canvas).

  • Imposta la bitmap sul canvas ricevuto tramite draw.
  • Chiama super.draw() che otterrà il frame disegnato sulla bitmap.
  • Accedere ai pixel del frame dalla bitmap.

    class MotionDetectorVideoView extends VideoView { 
    public Bitmap mFrameBitmap; 
    ... 
        @Override 
        public void draw(Canvas canvas) { 
         // set your own member bitmap to canvas.. 
         canvas.setBitmap(mFrameBitmap); 
         super.draw(canvas); 
         // do whatever you want with mFrameBitmap. It now contains the frame. 
         ... 
         // Allocate `buffer` big enough to hold the whole frame. 
         mFrameBitmap.copyPixelsToBuffer(buffer); 
         ... 
        } 
    } 
    

Non so se questo funzionerà. Evitare di fare calcoli pesanti in draw, avviare un thread lì. Prova e fammi sapere ..

+0

Come posso ottenere i pixel grezzi della tela disegnata? non è riuscito a trovare nulla nella loro API a riguardo. – Danpe

+0

C'è 'public public copyPixelsToBuffer (Buffer dst)' nella classe Bitmap. documentazione qui: http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsToBuffer(java.nio.Buffer) – Ronnie

+0

Sì, ma come ottenere la bitmap dalla tela? – Danpe

Problemi correlati