2013-03-07 21 views
8

Sto provando a prendere il fotogramma di anteprima generato dalla videocamera Android e passare il data[] alla pipe di input ffmpeg per generare un video flv. Il comando che ho usato è stato:Fotocamera Android Cattura utilizzando FFmpeg

ffmpeg -f image2pipe -i pipe: -f flv -vcodec libx264 out.flv 

Ho anche provato a forzare il formato di ingresso per yuv4mpegpipe e rawvideo ma senza successo ... Il formato predefinito del telaio anteprima generata da android-fotocamera è NV21. Il modo in cui am invokin' ffmpeg è attraverso il Process API e scrivendo l'anteprima incornicia data[] al processo stdin ... La definizione onPreviewFrame() è la seguente:

public void onPreviewFrame(byte[] data, Camera camera) 
{ 
    try 
    { 
     processIn.write(data); 
    } 
    catch(Exception e) 
    { 
     Log.e(TAG, FUNCTION + " : " + e.getMessage()); 
    }    
    camera.addCallbackBuffer(new byte[bufferSize]); 
} 

processIn è collegato al processo ffmpegstdin e buffersize è calcolato in base alla documentazione fornita per addCallbackBuffer(). C'è qualcosa che sto sbagliando ...?

Grazie ...

+0

si potrebbe spiegare come è stato richiamato il processo ffmpeg utilizzando l'API processo? – datayeah

risposta

8

Kinda ottenuto che funziona perfettamente ... L'errore che sembrava essere succedendo stato legato alla vcodec del flusso di immagini. Sembra che ffmpeg non sia in grado di decodificare le immagini in formato NV21 o il flusso di immagini. Per questo è necessario convertire il riquadro di anteprima del formato NV21 su JPEG e poiché le immagini dovevano essere trasmesse in streaming in tempo reale al processo ffmpeg, la conversione doveva essere On the Fly. La soluzione affidabile più vicino per On the Fly conversione in JPEG è stato il seguente:

public void onPreviewFrame(byte[] data, Camera camera) 
{ 
     if(isFirstFrame) 
    { 
     Camera.Parameters cameraParam = camera.getParameters(); 
     Camera.Size previewSize = cameraParam.getPreviewSize(); 
     previewFormat = cameraParam.getPreviewFormat(); 
     frameWidth = previewSize.width; 
     frameHeight = previewSize.height; 
     frameRect = new Rect(0, 0, frameWidth, frameHeight); 
     isFirstFrame = false; 
    } 

    previewImage = new YuvImage(data, previewFormat, frameWidth, frameHeight, null); 

    if(previewImage.compressToJpeg(frameRect, 50, processIn)) 
     Log.d(TAG, "Data : " + data.length); 

    previewImage = null; 

    camera.addCallbackBuffer(new byte[bufferSize]); 
} 

E il comando ffmpeg utilizzata è stata:

ffmpeg -f image2pipe -vcodec mjpeg -i - -f flv -vcodec libx264 out.flv 
+0

Ciao, puoi condividere il tuo codice? Voglio sapere come usi 'processIn'. Grazie – suitianshi

+0

Fornisci ulteriori dettagli? – user1767754

+0

Sto ricevendo il formato "mjpeg" non supportato su Android quando provo questo codice usando una build statica di ffmpeg. Qual è la soluzione per questo? –

Problemi correlati