1. 程式人生 > >FFmpeg解碼流程+SDL播放流程及分屏處理

FFmpeg解碼流程+SDL播放流程及分屏處理

FFmpeg解碼視訊流程

FFmpeg解碼一個視訊流程如下圖所示:


SDL播放視訊流程

SDL2.0顯示YUV的流程圖:


對比SDL1.2的流程圖,發現變化還是很大的。幾乎所有的API都發生了變化。但是函式和變數有一定的對應關係:

SDL_SetVideoMode()————SDL_CreateWindow()

SDL_Surface————SDL_Window

SDL_CreateYUVOverlay()————SDL_CreateTexture()

SDL_Overlay————SDL_Texture

不再一一例舉。

下圖為SDL1.x顯示YUV的流程圖。


簡單解釋各個變數的作用:

SDL_Window就是使用SDL的時候彈出的那個視窗。在SDL1.x版本中,只可以建立一個一個視窗。在SDL2.0版本中,可以建立多個視窗。
SDL_Texture用於顯示YUV資料。一個SDL_Texture對應一幀YUV資料。
SDL_Renderer用於渲染SDL_Texture至SDL_Window。
SDL_Rect用於確定SDL_Texture顯示的位置。注意:一個SDL_Texture可以指定多個不同的SDL_Rect,這樣就可以在SDL_Window不同位置顯示相同的內容(使用SDL_RenderCopy()函式)。
它們的關係如下圖所示:


SDL實現分屏

下圖舉了個例子,指定了4個SDL_Rect,可以實現4分屏的顯示。


SDL_Rect用於確定SDL_Texture顯示的位置。一個SDL_Texture可以指定多個不同的SDL_Rect.

SDL_Rect sdlRect;

sdlRect.x=0;
sdlRect.y=0;
sdlRect.w=screen_w;
sdlRect.h=screen_h;
SDL_Rect sdlRect2;
sdlRect2.x = screen_w;  //此處確定第二分屏顯示位置
sdlRect2.y = 0;
sdlRect2.w = screen_w;
sdlRect2.h = screen_h;

// 複製渲染不同的SDLRect


SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
SDL_RenderCopy( sdlRenderer, sdlTexture, NULL, &sdlRect2 );  



注意:分屏和自定義外掛多視窗播放是不一樣的方式。