Autore Topic: Camera Preview e framerate(?)  (Letto 609 volte)

Offline pipe

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Camera Preview e framerate(?)
« il: 23 Aprile 2014, 15:27:49 CEST »
0
Ciao a tutti.. una domanda:
sto sviluppando per miei test un'applicazione che prevede l'utilizzo della camera de telefono (ho un nexus 4). Praticamente mi piacerebbe avere il preview fluido e perfetto della nuova applicazione che google ha sviluppato per le foto e i video.. ma in ogni caso mi chiedo perchè è così orrendo il preview, una questione di frame rate? Forse perchè usano l'ndk?

Qualche anima che mi aiuta a fare chiarezza?
Grazie mille.

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Camera Preview e framerate(?)
« Risposta #1 il: 23 Aprile 2014, 17:15:14 CEST »
0
Lungi da me fare pubblicità da quattro soldi ma ho fatto una cosa del genere e il concetto di fluido è estremamente relativo.

Se provi la versione free c'è un tool che usa la preview della camera e ci applica un effetto sopra.

[APP] Agente Segreto - Android Developers Italia

Vedi se quello è abbastanza fluido sul tuo telefono, se non è abbastanza fluido la vedo dura visto che ho usato NDK.

 :-(

Offline pipe

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Camera Preview e framerate(?)
« Risposta #2 il: 23 Aprile 2014, 17:20:23 CEST »
0
Lungi da me fare pubblicità da quattro soldi ma ho fatto una cosa del genere e il concetto di fluido è estremamente relativo.

Se provi la versione free c'è un tool che usa la preview della camera e ci applica un effetto sopra.

[APP] Agente Segreto - Android Developers Italia

Vedi se quello è abbastanza fluido sul tuo telefono, se non è abbastanza fluido la vedo dura visto che ho usato NDK.

 :-(

Esatto! Quindi conviene usare l'ndk per avere una preview decisamente fluida.. Qualche dritta per un inizio rapido?

grazie :)

ps. bella l'app! :)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Camera Preview e framerate(?)
« Risposta #3 il: 23 Aprile 2014, 17:54:45 CEST »
0
Grazie!

In generale conviene usare NDK, dipende poi da quello che vuoi fare con la app.

Se hai come mintarget almeno api level 11 o superiori esiste la SurfaceTexture | Android Developers . In pratica puoi mandare ad una texture OpenGL es il frame preview corrente e a quel punto la visualizzazione e gli effetti (almeno quelli che puoi fare con shader glsl) dovrebbero essere molto veloci. Il vantaggio è che non usi NDK e sarà sicuramente molto veloce... lo svantaggio è che oltre a dover imparare OpenGL ES (se non lo conosci già) non girerà su dispositivi 2.3 o inferiori. Nel mio caso siccome la app è compatibile con android 2.3 non ho usato questo sistema.

In generale siccome la preview viene riscalata se usi una surfaceview (o una surfacetexture) ti conviene utilizzare una dimensione bassa per la preview. chiedi al device quali sono le size supportate per le preview e ne cerchi una che sia un compromesso tra dimensione e velocità.

Se nella app devi applicare un effetto che ha bisogno di rileggere i pixel del frame della preview come nel mio caso NDK è praticamente una scelta obbligata. Questo perché quando ti vengono restituiti i pixel questi non sono in formato RGB/ARGB ma un formato YUV NV21. I formati solitamente disponibili sono questi: ImageFormat | Android Developers . In questo caso puoi provare a chiedere al device di restituirti i pixel in un altro formato ma il problema è che non tutti i device supportano tutti i formati. Nella mia app ho quindi mantenuto YUV NV21.

Il problema di NV21 e di YUV in generale è che devi decodificare tutto il frame trasformandolo in RGB, dopodiché per ogni pixel devi applicare l'effetto. In pratica il vantaggio dell'NDK sta tutto qua, il resto del codice può anche essere java. Infatti la parte di codice che ho scritto in C con NDK fa quello che ho appena descritto.

C'è poi un altro problema, che non vedi nella versione FREE ma è presente nella PRO: il salvataggio di immagini ad alta risoluzione.
Per farla breve nella versione free salvo la preview e il salvataggio è istantaneo. Ma se riguardi le immagini la risoluzione è oggettivamente bassa. Per salvare le immagini ad alta risoluzione devi far fare una foto al device. Purtroppo poiché è normale avere fotocamere con 8mpixel o più, le immagini che ti arrivano in tutte le callback, RAW incluse, sono in realtà delle JPG. Se scompatti la JPG in java è facile avere un out of memory error. Quindi nel caso della versione PRO per salvare in alta risoluzione ho dovuto fare:

1- scatta foto
2- prendi l'immagine JPG dalla callback
3- invia la JPG ad NDK
4- in NDK decomprimi la JPG in RGB, applica l'effetto e ricodifica una nuova JPG
5- in java scrivi su file la JPG restituita da NDK.

Non proprio la cosa più divertente del mondo.

Se invece vuoi fare altri tipi di effetti puoi piazzare due surfaceview una sopra all'altra, in quella sotto metti la preview e l'altra la metti sopra con sfondo trasparente e fai un effetto in overlay. Non ho seguito questa strada perché per l'effetto termocamera sarebbe stato impossibile. A quel punto visto che avevo fatto tutto il giro ho fatto tutti e 3 gli effetti con NDK.

 :-)

Offline pipe

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Camera Preview e framerate(?)
« Risposta #4 il: 23 Aprile 2014, 18:26:41 CEST »
0
Wow! Grazie per la spiegazione dettagliata.. In pratica sto studiando per sviluppare un prototipo di un'applicazione a realtà aumentata Niente di inedito eh :D è pura curiosità.. E non penso di voler mantenere una retrocompatibilità così elevata. Credo di partire addirittura dalla 4.. Ok credo che provero la surface texture.. Grazie per i consigli!!

Post unito: [time]23 Aprile 2014, 20:33:25 CEST[/time]
macchè .. ho implementato la texture, ma non è cambiato un gran che, va sempre "a scatti" non è fluido nei movimenti.. a questo punto non saprei proprio.. inoltre ho dato un'occhiata al progetto openCamera il quale non implementa con ndk.. bhooo mo mi spulcio meglio il codice, magari qualche preferenza della camera..

Ciao.

Post unito: 24 Aprile 2014, 01:09:13 CEST
Non so se è una soluzione, ma pare che questo lag sia scomparso settando nelle Camera.Parameters. setRecordingHint() a true. bho.. :-P
« Ultima modifica: 24 Aprile 2014, 01:09:13 CEST da pipe, Reason: Merged DoublePost »