好吧,這是我迄今爲止。我在android上構建了FFmpeg,並且能夠很好地使用它。我已經能夠從java端傳入選定的文件名後將視頻加載到FFmpeg中。爲了節省性能,我在NDK中編寫視頻播放器,而不是通過JNI將幀從FFmpeg傳遞到Java。我想從視頻發送幀到OpenGL表面。我無法弄清楚如何獲取每幀視頻並將其渲染到OpenGL表面。我一直在試圖解決這個問題,現在幾個星期沒有運氣。希望有人能指出我正確的方向。Android視頻播放器使用NDK,OpenGL ES和FFmpeg
謝謝!
好吧,這是我迄今爲止。我在android上構建了FFmpeg,並且能夠很好地使用它。我已經能夠從java端傳入選定的文件名後將視頻加載到FFmpeg中。爲了節省性能,我在NDK中編寫視頻播放器,而不是通過JNI將幀從FFmpeg傳遞到Java。我想從視頻發送幀到OpenGL表面。我無法弄清楚如何獲取每幀視頻並將其渲染到OpenGL表面。我一直在試圖解決這個問題,現在幾個星期沒有運氣。希望有人能指出我正確的方向。Android視頻播放器使用NDK,OpenGL ES和FFmpeg
謝謝!
想到的一個方法是將幀的像素繪製到紋理中,然後使用OpenGL渲染該紋理。
我寫了一篇博客文章,回想如何去做這件事,主要是針對基於老式基於像素的視頻遊戲,但它也適用於您的情況。這個職位是Android Native Coding in C,我設立了一個github repository with an example。使用這種技術,即使在第一代硬件上,我也能夠獲得60 FPS。
編輯關於glTexImage2D vs glTexSubImage2D這種方法。
調用glTexImage2D將爲您的紋理分配視頻內存,並將傳遞給它的像素複製到該內存中(如果不傳遞NULL)。調用glTexSubImage2D將更新您在已經分配的紋理中指定的像素。
如果你更新全部的紋理,那麼調用一個或另一個幾乎沒有什麼區別,實際上glTexImage2D通常更快。但是,如果你只更新紋理的一部分glTexSubImage2D在速度上勝出。
您必須使用2次冪的紋理大小,因此在覆蓋高分辨率設備上的屏幕時,需要1024x512紋理和中等分辨率下的512x512紋理。紋理比屏幕區域大(高分辨率是800x400-ish),這意味着您只需要更新它的一部分,所以glTexSubImage2D就是要走的路。
嗨Kieran,我試圖轉換格式並使用FFmpeg和Android ndk播放音頻或視頻。我無法在網上找到任何資源或指導。經過很長時間的搜索,我發現這個鏈接https://github.com/havlenapetr/FFMpeg。但我無法編譯和運行這個例子。請幫助我或給我參考鏈接 - 我怎麼可以在Android中使用FFmpeg文件播放音頻/視頻....謝謝 – praveenb 2011-01-31 13:11:48
Praveenb, 我很難得到FFmpeg,最終在Android上編譯和使用。我不得不使用一些配置腳本。我也沒有使用最新版本的FFmpeg。我下載了一個稍微老一點的版本,它仍然使用了sws_scale函數來使它工作。我可以盡我所能幫助您實現目標,讓我知道您現在在哪裏以及您遇到哪些類型的錯誤。它不應該很難讓靜態庫建立。 – DRiFTy 2011-02-15 16:50:26