測試環境設定
- 機型為 iPad2 與 iPad4
- 影片為 rtsp://mm2.pcslab.com/mm/7h800.mp4,預先將前30秒的檔案內容載入記憶體
- 程式碼 https://github.com/alb423/4FrameTest
測試數據如下:
一、循序解碼與播放
| 
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.....
