无法在SDL_Surface上显示YUV覆盖

时间:2012-06-28 17:36:13

标签: sdl

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

现在ffplay可以简化如下:

  1. SDL_Surface *screen
  2. 创建SDL_SetVideoMode()
  3. SDL_Overlay *bmp创建SDL_CreateYUVOverlay()并将其与screen

    相关联

    重复直到视频结束

  4. 解码电影帧并填充bmp
  5. 使用SDL_DisplayYUVOverlay()
  6. 将bmp渲染到屏幕上

    根据this article的提示,我已将步骤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的新手,因此除了解决方案之外,解释为什么我的方法不起作用将会有所帮助。

1 个答案:

答案 0 :(得分:0)

使用SDL_putenv("SDL_VIDEODRIVER=dummy");使用dummy视频驱动程序,该驱动程序不会产生任何输出。