2011-01-13 24 views
27

Ok, ecco cosa ho finora. Ho costruito FFmpeg su Android e sono in grado di usarlo bene. Sono stato in grado di caricare un video in FFmpeg dopo aver passato il nome file scelto dal lato java. Per risparmiare sulle prestazioni, sto scrivendo video player nell'NDK piuttosto che passare fotogrammi da FFmpeg a java attraverso JNI. Voglio inviare fotogrammi dal video su una superficie OpenGL. Non riesco a capire come ottenere ogni fotogramma del video e renderlo sulla superficie OpenGL. Sono stato bloccato cercando di capirlo per un paio di settimane senza fortuna. Spero che qualcuno possa indicarmi la giusta direzione.Riproduttore video Android che utilizza NDK, OpenGL ES e FFmpeg

Grazie!

+0

Hi Kieran, Sto cercando di convertire il formato e riprodurre audio o video utilizzando FFmpeg e Android ndk. Non ho trovato alcuna risorsa o guida per questo sul web. Dopo una ricerca lunga ho trovato questo collegamento https://github.com/havlenapetr/FFMpeg. ma non riesco a compilare ed eseguire questo esempio. Per favore aiutatemi o datemi il link - come posso riprodurre audio/video usando i file FFmpeg in Android .... Grazie – praveenb

+0

Praveenb, Ho avuto difficoltà a far compilare e utilizzare FFmpeg anche su Android. Ho dovuto giocare un po 'con lo script di configurazione. Inoltre non sto usando la versione più recente di FFmpeg. Ho scaricato una versione leggermente più vecchia che utilizza ancora le funzioni sws_scale per farlo funzionare. Posso fare del mio meglio per aiutarti a farlo funzionare, fammi sapere dove sei adesso e quali tipi di errori hai incontrato. Non dovrebbe essere difficile ottenere le librerie statiche da costruire. – DRiFTy

+0

Ciao, mi sto sforzando di costruire FFmpeg per Android. Potresti dirmi come sei riuscito a costruire le librerie statiche per Android? C'è qualche repository git o qualcosa di simile con cui potrei iniziare? Che dire di quello script di configurazione - cosa c'è da configurare? – j00hi

risposta

20

Un modo che viene in mente è quello di disegnare i pixel del frame in una texture e quindi renderizzare quella texture usando OpenGL.

Ho scritto un post sul blog un po 'indietro su come procedere, principalmente per i videogiochi basati su pixel di vecchia generazione, ma vale anche per la situazione. Il post è Android Native Coding in C e ho impostato un github repository with an example. Usando questa tecnica sono riuscito a ottenere 60 FPS, anche su hardware di prima generazione.

MODIFICA relativo a glTexImage2D vs glTexSubImage2D per questo approccio.

Chiamare glTexImage2D allocherà la memoria video per la trama e copierà i pixel che si passano in quella memoria (se non si passa NULL). Chiamando glTexSubImage2D si aggiorneranno i pixel specificati in una trama già allocata.

Se si aggiorna tutto il della trama, allora c'è poca differenza chiamando l'uno o l'altro, infatti glTexImage2D è solitamente più veloce. Ma se aggiorni solo una parte della texture, glTexSubImage2D vince alla velocità.

È necessario utilizzare le dimensioni di trama power-of-2, quindi nel coprire lo schermo su dispositivi ad alta risoluzione richiede una trama 1024x512 e una trama 512x512 a risoluzioni medie. La trama è più grande dell'area dello schermo (l'alta risoluzione è 800x400-ish), il che significa che è necessario aggiornarne solo una parte, quindi glTexSubImage2D è la strada da percorrere.

+0

Grazie per la tua risposta! Sai che è buffo che sono arrivato sul tuo blog da un po 'di tempo fa e l'ho usato come base per la mia app haha. Non sono stato in grado di ritrovarlo fino ad ora, quindi grazie per avermelo fatto notare! In questo momento finalmente ho qualcosa da mostrare sullo schermo ma i pixel sembrano essere completamente incasinati. Non sono sicuro di creare correttamente la texture rettangolare o se si verifica un problema durante la conversione al formato pixel RGB corretto in FFmpeg. Vorrei che ci fosse più documentazione OpenGL ES in quanto è abbastanza facile farlo con quad in OpenGL. Qualche consiglio? – DRiFTy

+0

È possibile utilizzare un quad con una texture su di esso.Usa semplicemente 'glOrthof' e imposta le coordinate del vertice e della trama, come faresti nella normale OpenGL. I pixel incasinati sono una descrizione vaga: sono completamente indecifrabili? Troppo verde o troppo rosso? Forse sono tosati a sinistra? Il mio consiglio: far funzionare il codice sul PC usando il sottoinsieme di OpenGL che si sovrappone a GLES, quindi compilare lo stesso identico codice su Android. È quello che faccio di solito. – richq

+0

Ok, grazie per l'informazione. Mi dispiace cosa intendevo per pixel incasinati che sono indecifrabili. In FFmpeg devi usare una funzione sws_scale per trasformare il formato pixel in RGG, ma per quanto riguarda il lato OpenGL sto ancora imparando come usarlo e non sono abbastanza sicuro se ho convertito il giusto formato pixel o se ho impostato i miei vertici rettangolari e le coordinate della trama correttamente. Inoltre, dato che sono in loop su ogni frame, dovrei usare glTexSubImage2d() o continuare a usare glTexImage2d() per sostituire la texture attuale con i miei nuovi dati di texture dal nuovo frame? – DRiFTy