2013年11月5日 星期二

iOS -- 使用四分割畫面播放串流

此篇主要測試如何在iOS設備的螢幕上,將畫面進行四分割並各自分別播放影片

測試環境設定


測試數據如下:

一、循序解碼與播放

Machine
Stream #
Render Method
decode time
render time
iPad2
1 Stream
UIImage
1.0~1.2ms
12.7~13.2ms
1 Stream
OpenGLES
1.1~1.2ms
11.3~11.7ms
1 Stream
OpenGLES optimized
1.1~1.2ms
9.1~9.6ms
4Stream
UIImage
2~9ms
6~7ms
4Stream
OpenGLES
1.1~1.2ms
11.3~11.7ms
4Stream
OpenGLES optimized
1~5ms
9.1~12ms
iPad4
1 Stream
UIImage
<1ms
7ms
1 Stream
OpenGLES
<1ms
6~7ms
1 Stream
OpenGLES optimized
<1ms
3.3~3.6ms
4Stream
UIImage
1~3 ms
3~4 ms
4Stream
OpenGLES
1~2ms
6~7ms
4Stream
OpenGLES optimized
<1ms
3.3~3.6ms

表格中欄位意義說明如下

  • render method
  • UIImage:將影像轉換為UIImage進行呈現。此部份作法參考 iFrameExtractor
  • OpenGLES:將影像透過OpenGLES進行呈現。此部份作法參考 kxmovies
  • OpenGLES Optimized:將影像透過OpenGLES進行呈現。作法同kxmovies,但減少複製記憶體的次數。
  • decode time 
  • 使用 ffmpeg library 將一張 720p H.264 影像還原為 YUV Frame所需時間。
  • render time 
  • 將一張 720p 的 YUV Frame 轉換 UIImage 所需時間, 
  • 或是使用 OpenGLES 直接使用 YUV Frame 進行繪圖所需的 CPU時間。

測試結果:

  • 當處理一部影片時,使用 OpenGLES處理 H.264 720p  影像較快
  • 當處理四部影片時,若將 H.264 720p 先轉換成一個較小的 RGB UIImage,進行播放會有機會較快,但此時CPU會非常忙碌,效能差異很大
  • 當處理四部影片時,使用 OpenGLES處理 H.264 720p ,CPU解開每張frame的時間不會變長。
  • 減少複製 720p 影像的次數,可以明顯增進效能。
  • iPad2 要進行四畫面 720p 24fps 播放,目前程式無法達成,可考慮進行進一步的優化。
  • iPad4 要進行四畫面 720p 24fps 播放,目前程式使用UIImage或OpenGLES optimized都可以達成。
  • 此處雖然程式依序播放四部影片,但實際上 ffmpeg
    avcodec_decode_video2() 會自行使用 multi-thread 加速 decode 時間。


二、使用一個 thread 負責解碼,一個 thread 進行播放

ToBeContinue.....