2016-10-18 52 views
2

我想在iOS中使用OpenGL ES 2.0播放視頻。我無法獲得示例代碼或如何實現此目標的起點。任何人都可以幫助我嗎?如何在iOS中使用OpenGL播放視頻?

+1

我在谷歌上搜索過。您提到的鏈接僅顯示如何顯示圖像或3D模型。我想用OpenGL播放視頻。基本上,我想將視頻幀作爲紋理傳遞給OpenGL着色器。 @AmitSrivastava –

+0

即使我無法找到如何開始解決這個問題。 – Parth

+1

@ R.Jari:你是否成功地在openGL下玩過ios視頻​​?如果是,你會介意分享代碼嗎?感謝您的提前! – loki

回答

2

您正在尋找的是實時獲取視頻的原始緩衝區。我相信你需要查看AVFoundation並以某種方式提取CVPixelBufferRef。如果我沒有記錯,你有幾種方法;一個是在特定時間點播,另一個是在塊中快速迭代幀的處理,而你可能需要的是實時接收幀。因此,你可以提取一個原始的RGB緩衝區,它需要被推送到紋理,然後繪製到渲染緩衝區。

我建議你創建一次紋理(每個視頻)並儘量使其儘可能小,但要確保視頻幀適合。您可能需要(兩功率)紋理POT因此要獲得從視頻的寬度紋理尺寸,你需要這樣的東西:

GLInt textureWidth = 1.0f; 
while(textureWidth<videoWidth) textureWidth <<= 1; // Multiplies by 2 

所以紋理大小預計會更大然後視頻。要將數據推送到紋理,您需要使用紋理子圖像glTexSubImage2D。它需要一個指向你的原始數據和矩形參數的指針,在那裏保存數據然後是(0, 0, sampleWidth, sampleHeight)。此外,紋理座標必須進行計算,使其不在範圍[0,1]中,而是對於x[0, sampleWidth/textureWidth]

,那麼你只需要把它放在一起:

  • 有一個系統,以保持生成視頻的原始樣本緩衝區
  • 製作紋理以適應視頻大小
  • 在新的樣本更新紋理使用glTexSubImage2D
  • 將數據加載到紋理後,將紋理繪製爲全屏矩形(請注意線程)

您可能需要注意視頻方向,轉換。因此,如果可能的話,請使用設備上以不同方向錄製的一些視頻測試您的系統。我認爲現在有一個支持來接收已經正確定位的緩衝區。但是默認情況下,樣本至少曾經是「錯誤的」;縱向錄製的視頻仍然具有風景中的樣本,但是該資產提供了轉換矩陣或方向。