2011-12-19 39 views
1

我是iOS的新手,但我在Android上實現了基於FFmpeg的播放例程。我打算在iOS上再次執行此操作。如何在iOS應用中將幀從FFmpeg渲染到屏幕?

看來我可以使用OpenGL ES 1.1/2.0將幀從FFmpeg視頻畫到屏幕上。但是,OpenGL ES似乎很難。另外,由於視頻紋理的寬度,我遇到了一些限制。我不得不將視頻幀分成許多圖像,並將它們繪製到屏幕上以組成幀。

是否有更簡單的方法在iOS上使用OpenGL ES呈現此視頻?有沒有其他方法可以在iOS中快速繪製2-D視頻幀?

+0

你是什麼意思?而且,爲什麼「將整個視頻圖像分割爲多個紋理並將它們繪製爲」一個「」,而不是一次繪製整個圖像? – appas 2011-12-19 15:10:57

+0

我嘗試解釋它。我使用'連續',因爲播放應該頻繁更新視頻圖像。它通常高達30 fps(某些視頻大於30 fps)。 OpenGL-ES可以做到最好的性能,但我對我們很難受。我希望將許多解決方案與我們的團隊進行比較也許「連續」說,「性能是根據」 – qrtt1 2011-12-19 15:16:44

+0

紋理的寬度應該是2的冪。 例如,視頻尺寸爲640x480,它們不是2的冪。 我應該將其分割以適應不同的紋理尺​​寸。 – qrtt1 2011-12-19 17:07:57

回答

1

啊。所以你想渲染一個非POT源。這可以在不分割爲多個紋理的情​​況下完成 - 通過創建最接近的POT大小的紋理,對其進行渲染並僅傳輸實際包含圖像的部分。 查看示例(C++)here。相關部分:

//Calculating the texture size 
double exp = ceil(log((double)max(Texture.HardwareHeight, Texture.HardwareWidth))/log(2.0)); 
texsize = min(pow(2, exp), (double)maxSize); 

然後

//draw the original frame 1:1 into the (larger) texture 
float ymax = min(2.0f*((float)Texture.HardwareHeight/(float)texsize) - 1.0f, 1.0f);  //clamping is for cards with 
float xmax = min(2.0f*((float)Texture.HardwareWidth/(float)texsize) - 1.0f, 1.0f);  //smaller max hardware texture than the current frame size 

當作爲紋理座標繪製時使用的1.0這些最大值來代替。

+0

感謝您的反饋。我有一個非常重要的術語'non-POT':D – qrtt1 2011-12-21 07:14:57

相關問題