Dobre, to je to, čo mám zatiaľ. Postavil som FFmpeg na Android a môžem ho používať dobre. Po odovzdaní vybraného názvu súboru zo strany java sa mi podarilo načítať video do súboru FFmpeg. Aby som ušetril na výkone, píšem video prehrávač v NDK, skôr než prechádzam snímky z FFmpeg do javy cez JNI. Chcem poslať snímky z videa na povrch OpenGL. Mám problém prísť na to, ako získať jednotlivé snímky videa a vykresliť ich na povrch OpenGL. Uviazol som na pokuse to prísť už pár týždňov bez šťastia. Dúfajme, že ma niekto môže nasmerovať správnym smerom.
Vďaka!
odpovede:
20 pre odpoveď č. 1Jedným zo spôsobov, ktorý vám zabúda, je nakreslenie pixelov vášho rámu do textúry a potom vykreslenie tejto textúry pomocou OpenGL.
Chvíľu som napísal blogový príspevok o tom, ako to dosiahnuť, predovšetkým pre videohry založené na pixloch typu old-skool, ale platí to aj pre vašu situáciu. Príspevok je Natívne kódovanie systému Android v jazyku C, a zriadil som úložisko github s príkladom, Pomocou tejto techniky som bol schopný získať 60 FPS, dokonca aj na hardvér prvej generácie.
UPRAVIŤ týkajúce sa glTexImage2D vs glTexSubImage2D pre tento prístup.
Volanie glTexImage2D pridelí videopamäťpre svoju textúru a skopírujte pixely, ktoré odovzdáte do tejto pamäte (ak neprechádzate NULL). Volanie glTexSubImage2D zaktualizuje pixely, ktoré určíte v už pridelenej textúre.
Ak aktualizujete všetko textúry potom je malý rozdiel volanie jedného alebo druhého, v skutočnosti glTexImage2D je zvyčajne rýchlejší. Ak však aktualizujete iba časť textúry, glTexSubImage2D vyhrá na rýchlosti.
Musíte použiť veľkosť textúry power-of-2pokrytie obrazovky na zariadeniach s vysokým rozlíšením vyžaduje textúru 1024 x 512 a textúru 512 x 512 pri stredných rozlíšeniach. Textúra je väčšia ako plocha obrazovky (hi-res je 800x400-ish), čo znamená, že musíte iba aktualizovať jej časť, takže glTexSubImage2D je spôsob, ako ísť.