0

我想ffplay通过隐藏其 SDL 视频播放器窗口来进行修改。相反,我想将叠加层作为逐像素位图获取,以便在我的程序的其他地方使用。

现在ffplay可以简化如下:

  1. 创建SDL_Surface *screenSDL_SetVideoMode()

  2. 创建SDL_Overlay *bmpSDL_CreateYUVOverlay()并将其关联screen

    重复直到视频结束

  3. 解码电影帧并填充 bmp

  4. 使用将 bmp 渲染到屏幕上SDL_DisplayYUVOverlay()

根据本文的提示,我已将步骤 1 替换为如下:

/* Don't want video player window showing on screen
* int flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL;
* screen = SDL_SetVideoMode(w, h, 24, flags);
*/
Uint32 rmask, gmask, bmask, amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x00000000;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0x00000000;
#endif
screen = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 24, rmask, gmask, bmask, amask);

和第 4 步为

SDL_DisplayYUVOverlay(bmp, &rect);
SDL_SaveBMP(screen, filenameN); N++;

问题:如果我只修改第 4 步,位图文件将得到正确保存,这是我想要的,除了视频播放窗口可见。另一方面,如果我也修改第 2 步,窗口将成功隐藏,位图全部变黑。

我是 SDL 的新手,所以除了解决方案之外,解释一下我的方法为什么不起作用会很有帮助。

4

1 回答 1

0

用于SDL_putenv("SDL_VIDEODRIVER=dummy");使用不产生输出的虚拟视频驱动程序。

于 2012-07-22T09:11:06.527 回答