2012-08-06 336 views
2

在我的應用程序中,我應該以不同尋常的方式播放視頻。 像特殊用途的互動播放器。這裏iOS視頻播放

主要問題:

  • 視頻分辨率可以從200 * 200像素高達1024 * 1024像素
  • 我應該從-60 FPS改變速度,以60 PFS(在這種情況下,視頻的能力應該根據選定的速度播放更慢或更快,負面意味着視頻應向後播放)
  • 我應該在視頻上繪製線條和對象,並使用圖像進行縮放。
  • 我應該有能力放大圖像,如果平移它的內容超過屏幕大小
  • 我應該改變這種視頻

現在我正在做下一件事的亮度,對比度和反轉顏色的能力:

  • 我splited我的視頻幀JPG
  • 爲每秒N次(播放速度控制)
  • 每個計時器滴答IM d創建計時器用OpenGL rawing新的紋理(下一JPG幀)
  • 的縮放和平移IM使用OpenGL ES變換(平移,縮放)打

一切看起來很正常,直到我用320 * 240像素,但如果我使用512 * 512px我的播放速度正在下降。也許定時器行爲問題,可能是OpenGL。有時候,如果我試圖以高播放速度(超過10-15 FPS)打開大紋理,應用程序會因爲內存警告而崩潰。

解決此問題的最佳做法是什麼?我應該挖掘什麼方向?也許cocos2d或其他遊戲引擎對我有幫助? Mb JPG不是紋理的最佳解決方案,我應該使用PNG或PVR或者其他的?

+1

爲什麼要轉換爲任何類型的圖像?爲什麼不把原始幀作爲紋理上傳?將幀壓縮爲JPG或PNG圖像對於視頻而言將非常昂貴。 – 2012-08-06 16:30:30

+0

我在播放視頻前準備這些JPG幀。我的意思是,我只是使用已經創建的JPG文件。或者你說,我可以爲我的紋理使用另一種(最有效的)格式? – 2012-08-07 09:52:22

回答

1

JPEG幀將解壓縮非常昂貴。第一步:使用PNG。

但是等等!還有更多。

Cocos2D可以幫助你主要通過它的great support for sprite sheets

然而,最大的幫助可能來自打包的紋理la TexturePacker。使用PVR.CCZ壓縮可以加速瘋狂的數量,足以讓您在更大的視頻尺寸下獲得更好的幀速率。

2

將視頻數據保存爲視頻並使用AVAssetReader來獲取原始幀。使用kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange作爲色彩空間,並在GLES中進行YUV-> RGB色彩空間轉換。這意味着將更少的數據存儲在內存中,並使圖像處理的大部分更簡單(因爲您將使用亮度和色度數據而不是RGB值)。

您無需爲此煩擾Cocos 2d或任何遊戲引擎。我強烈建議對OpenGL ES 2.0和着色器進行一點實驗。使用OpenGL進行視頻非常簡單直接,在混合中添加遊戲引擎是不必要的開銷和抽象。

將圖像數據上傳到紋理時,請不要在每一幀都創建一個新紋理。相反,創建兩個紋理:一個用於亮度,另一個用於色度數據,並且每個幀都重複使用這些紋理。我懷疑你的記憶問題是由於每幀使用許多圖像和新紋理,並且可能不會刪除舊紋理而引起的。

1

弗拉德,簡單的答案是,你可能永遠無法獲得你列出的所有這些功能在同一時間工作。以60 FPS播放視頻1024 x 1024的視頻確實會有一定的延伸,我非常懷疑iOS硬件將能夠跟上60FPS的數據傳輸速率。即使設備上的h.264硬件在1080p下也只能做到30FPS。這可能是有可能的,但是爲了將圖形渲染到視頻上並且期望能夠同時編輯亮度/對比度,它同時是太多東西。

您應該專注於實際可能實現的目標,而不是嘗試執行每項功能。如果你想看一個將iPad硬件推向極限的Xcode應用程序示例,請查看我的Fireworks示例項目。此代碼同時在屏幕上顯示多個已解碼的h.264視頻。該實現是圍繞CoreGraphics API構建的,但關鍵是Apple的紋理上傳到OpenGL的速度非常快,原因是零拷貝優化。採用這種方法,可以將很多視頻流式傳輸到設備。

+0

鏈接中斷,@MoDJ我可以在哪裏找到您的示例項目? – CAMOBAP 2015-11-19 10:53:33

+0

更新後的鏈接和說明,請現在試用。 – MoDJ 2015-11-20 22:33:44