/ / Android Video Player pomocou NDK, OpenGL ES a FFmpeg - android, opengl-es, ffmpeg, android-ndk, android-video-prehrávač

Android Video prehrávač pomocou NDK, OpenGL ES a FFmpeg - Android, opengl-es, ffmpeg, android-ndk, android-video-prehrávač

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ď č. 1

Jedný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ť.