sdl 绘制 yuv视频

2019-08-22  本文已影响0人  shuinan

sdl提供跨平台的视频绘制,功能很强大,还一直保持更新,很不错,下面时相关介绍。

https://blog.csdn.net/leixiaohua1020/article/details/38868499 最简单的基于FFMPEG+SDL的视频播放器 

利用他在指定的窗口上绘制,很方便

不过,我们还需要在保持图像本身的比例不变下,提供两种绘制模式: 

1. 填满绘制窗口;

2. 显示全部图形,窗口空余部分保持底色

在指定的窗口中绘制,调用这个:SDL_CreateWindowFrom

sdl支持多种格式的图像: 多种yuv  多种 rgb, 有相关的配套接口,上面的例子中也有介绍。

不过,绘制方式还是有些麻烦。

sdl缺省方式,会自动拉伸图像、填满窗口。 试验了SDL_SetHint几个参数,没感觉到效果。

另外发现sdl提供类似opengl的设置viewport和scale,

SDL_RenderSetViewport(m_renderer, &rect);

SDL_RenderSetScale(m_renderer, r, r);

但是在sdl本身的拉伸作用下,不见效。

看来需要利用填写数据函数了SDL_RenderCopyEx,这个函数可以设置绘制区域和提供的图像区域,如下,目标达到。

int winWidth, winHeight;

SDL_GetWindowSize(m_window, &winWidth, &winHeight);

float wScale = (float)winWidth / (float)m_lastWidth;

float hScale = (float)winHeight / (float)m_lastHeight;

SDL_Rect winRect, imageRect;

SDL_Rect* ptrWinRect = nullptr;

SDL_Rect* ptrImageRect = nullptr;

if (m_renderMode == xrtc::RENDER_MODE_FIT) {

float r = MIN_(wScale, hScale);

// clip window to fit image

winRect.h = r * m_lastHeight;

winRect.w = r * m_lastWidth;

winRect.x = (int)(winWidth - winRect.w) / 2;

winRect.y = (int)(winHeight - winRect.h) / 2;

ptrWinRect = &winRect;

}

else {

// clip image to fit window

float r = MIN_(1 / wScale, 1 / hScale);

imageRect.h = r * winHeight;

imageRect.w = r * winWidth;

imageRect.x = (int)(m_lastWidth - imageRect.w) / 2;

imageRect.y = (int)(m_lastHeight - imageRect.h) / 2;

ptrImageRect = &imageRect;

}

SDL_RenderCopyEx(m_renderer, m_texture, ptrImageRect, ptrWinRect, 0, nullptr, SDL_FLIP_NONE);

上一篇下一篇

猜你喜欢

热点阅读