簡體   English   中英

iOS影片播放

[英]iOS video playback

在我的應用程序中,我應該以不尋常的方式播放視頻。 諸如用於特殊目的的交互式播放器之類的東西。

這里的主要問題:

  • 視頻分辨率可以從200 * 200px到1024 * 1024 px
  • 我應該有能力將速度從-60 FPS更改為60 PFS(在這種情況下,視頻的播放速度應視所選速度而變慢或變快,負數表示視頻應向后播放)
  • 我應該在視頻上繪制線條和對象,並用圖像縮放它。
  • 我應該具有“縮放圖像”並將其平移(如果其內容大於屏幕尺寸)的能力
  • 我應該有能力更改此視頻的亮度,對比度和反轉顏色

現在我正在做下一件事:

  • 我將視頻分割為JPG幀
  • 每秒創建N次計時器(播放速度控制)
  • 每個計時器都使用OpenGL在即時貼上繪制新紋理(下一個JPG幀)
  • 用於與OpenGL ES轉換(轉換,縮放)一起播放的縮放和平移

在我使用320 * 240像素之前,一切看起來都很好,但是如果我使用512 * 512px,我的播放率就會下降。 也許定時器問題,也許是OpenGL。 有時,如果我試圖以較高的播放速率(大於10-15 FPS)打開大紋理,則應用程序會因內存警告而崩潰。

解決此問題的最佳實踐是什么? 我應該挖掘哪個方向? 也許cocos2d或其他游戲引擎可以幫助我嗎? Mb JPG不是紋理的最佳解決方案,我應該使用PNG或PVR還是其他?

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

您無需為此而煩惱Cocos 2d或任何游戲引擎。 我強烈建議您對OpenGL ES 2.0和着色器進行一些實驗。 將OpenGL用於視頻非常簡單明了,將游戲引擎添加到混合中是不必要的開銷和抽象。

將圖像數據上載到紋理時,請勿在每一幀都創建一個新紋理。 相反,創建兩個紋理:一個用於亮度,一個用於色度數據,然后在每個幀中簡單地重復使用這些紋理。 我懷疑您的內存問題是由每幀使用許多圖像和新紋理引起的,並且可能沒有刪除舊紋理。

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

可是等等! 還有更多。

Cocos2D可以通過對Sprite Sheet的強大支持而在很大程度上為您提供幫助。

但是,最大的幫助可能來自TexturePacker的打包紋理。 使用PVR.CCZ壓縮可以加快處理速度,足以讓您在更大的視頻尺寸下獲得更好的幀速率。

弗拉德,簡短的答案是,您可能永遠無法同時獲得列出的所有這些功能。 以60 FPS的速度播放1024 x 1024視頻確實很費力,我非常懷疑iOS硬件是否能夠跟上60 FPS的那種數據傳輸速率。 甚至設備上的h.264硬件也只能在1080p時達到30FPS。 可能是可以的,但是要在視頻上疊加圖形渲染並期望能夠同時編輯亮度/對比度,這是太多時間了。

您應該專注於實際可能發生的事情,而不是嘗試執行所有功能。 如果要查看將iPad硬件推向極限的Xcode應用示例,請查看我的Fireworks示例項目。 此代碼可同時在屏幕上顯示多個已解碼的h.264視頻。 該實現是基於CoreGraphics API構建的,但是關鍵是由於零拷貝優化,Apple將紋理上傳到OpenGL的速度非常快。 通過這種方法,可以將大量視頻流式傳輸到設備。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM