使用SDL_CreateWindowFrom绑定MFC窗口时H264视频渲染模糊问题
SDL绑定MFC窗口渲染H264画面模糊问题
Windows开发环境下存在以下现象:
- 使用
SDL_CreateWindow()创建窗口的控制台程序,渲染H264视频时画面清晰 - 使用
SDL_CreateWindowFrom()绑定MFC窗口时,渲染H264视频画面模糊,手部晃动区域的模糊情况尤为明显
测试流程:
- 将每帧H264帧数据保存为带0x00000001起始码的.264文件
- 程序读取H264文件并转换为AVFrame
- 交由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
相关产品推荐
相关产品推荐

