You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SDL_CreateWindowFrom绑定MFC窗口时H264视频渲染模糊问题

SDL绑定MFC窗口渲染H264画面模糊问题

Windows开发环境下存在以下现象:

  • 使用SDL_CreateWindow()创建窗口的控制台程序,渲染H264视频时画面清晰
  • 使用SDL_CreateWindowFrom()绑定MFC窗口时,渲染H264视频画面模糊,手部晃动区域的模糊情况尤为明显

测试流程:

  1. 将每帧H264帧数据保存为带0x00000001起始码的.264文件
  2. 程序读取H264文件并转换为AVFrame
  3. 交由SDL进行渲染

SDL相关代码:

class EMSDL {
public:
    EMSDL() {}
    ~EMSDL() {}

    static void delay(long ms) {
        SDL_Delay(ms);
    }

    void initSDL(int width, int height) {
        
        int ret = SDL_Init(SDL_INIT_VIDEO);
        if (ret)
        {
            LOG << "Failed";
            return;
        }

        //for MFC HWND
        //pSDLWindow = SDL_CreateWindowFrom(hWnd);

        //for console
        pSDLWindow = SDL_CreateWindow("EMEET_SDL",
            0,
            0,
            width,
            height,
            SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
        if (!pSDLWindow)
        {
            LOG << "Failed";
            return;
        }

        pSDLRenderer = SDL_CreateRenderer(pSDLWindow, -1, SDL_RENDERER_PRESENTVSYNC);
        if (!pSDLRenderer)
        {
            LOG << "Failed";
            return;
        }

        pSDLTexture = SDL_CreateTexture(pSDLRenderer,
            SDL_PIXELFORMAT_IYUV,//SDL_PIXELFORMAT_YV12
            SDL_TEXTUREACCESS_STREAMING,
            width,
            height);

        if (!pSDLTexture)
        {
            LOG << "Failed";
            return;
        }
    }

    void uninitSDL() {

        if (pSDLTexture) {
            SDL_DestroyTexture(pSDLTexture);
            pSDLTexture = nullptr;
        }
        if (pSDLRenderer) {
            SDL_DestroyRenderer(pSDLRenderer);
            pSDLRenderer = nullptr;
        }
        if (pSDLWindow) {
            SDL_DestroyWindow(pSDLWindow);
            pSDLWindow = nullptr;
        }
        SDL_Quit();
    }

    void render(AVFrame* frame) {

        SDL_UpdateYUVTexture(pSDLTexture,
            NULL,
            frame->data[0], frame->linesize[0],
            frame->data[1], frame->linesize[1],
            frame->data[2], frame->linesize[2]);

        SDL_RenderClear(pSDLRenderer);
        // Texture to Renderer
        SDL_Rect        sdlRect;
        sdlRect.x = 0;
        sdlRect.y = 0;
        sdlRect.w = frame->width;
        sdlRect.h = frame->height;

        SDL_RenderCopy(pSDLRenderer, pSDLTexture, &sdlRect, &sdlRect);

        // update and show
        SDL_RenderPresent(pSDLRenderer);
        //
        //SDL_PollEvent(&event);
    } 

    bool checkQuitEvent() {

        //handle events
        int myEvent = SDL_PollEvent(&event);
        //SDL_WaitEvent(&event);
        switch (event.type) {
        case SDL_KEYDOWN:
        {
            printf("key down! key code = %d, key name= %s\n", event.key.keysym.sym, SDL_GetKeyName(event.key.keysym.sym));
            if (event.key.keysym.sym == SDLK_ESCAPE || event.key.keysym.sym == SDLK_q) {
                return true;
            }
        }break;
        case SDL_QUIT: {
            return true;
        }break;
        }

        return false;
    }


protected:
    SDL_Window* pSDLWindow = nullptr;
    SDL_Renderer* pSDLRenderer = nullptr;
    SDL_Surface* pSDLSurface = nullptr;
    SDL_Texture* pSDLTexture = nullptr;
    SDL_Event event;
};

内容的提问来源于stack exchange,提问作者SleepingBug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:15:40