我想ffplay
通过隐藏其 SDL 视频播放器窗口来进行修改。相反,我想将叠加层作为逐像素位图获取,以便在我的程序的其他地方使用。
现在ffplay
可以简化如下:
创建
SDL_Surface *screen
自SDL_SetVideoMode()
创建
SDL_Overlay *bmp
自SDL_CreateYUVOverlay()
并将其关联screen
重复直到视频结束
解码电影帧并填充 bmp
使用将 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 的新手,所以除了解决方案之外,解释一下我的方法为什么不起作用会很有帮助。