測試環境設定
- 機型為 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.....