qt中用SDL 1.3实现播放视频双窗口(附源代码)

原创 2010年11月05日 09:35:00

开发环境:vs2008 + xp或mingw + gcc

  
    这个问题在开发视频软件thinkvd的对比效果前也一直困惑着我,在网上找了些资料,也没有结果, 现在把实现的过程简单记录下来,供大家参考。当时是以为sdl代码比较复杂,所有在这以前从来没有去看过SDL的源代码,尽管我下了它的1.26, 1.3源代码。

先说要实现的目标:在QT的一个window中放两个视频播放画面,一个是原始视频,一个是效果视频。如图:

思路:
1。跳过由sdl直接创建弹出窗口,那么它的窗口应该是QT指定的窗口。
2。给SDL传递窗口Handle,由SDL_getenv("SDL_WINDOWID")来实现
3。在SDL调用系统函数CreateWindow前把它Filter下来,否则会生成一个独立的窗口。
4。更改当前窗口的消息循环.

  印象中当时是参考1.26版本源代码来实现的,由于1.26与1.3相差比较大,因此走了一些弯路。
当时花了很多时间在处理消息循环上, 最终才形成下面的代码。

下面是SDL中需要更改的地方:
sdl1.3/src/video/win32/SDL_win32window.h:
extern void WIN_DestroyWindow(_THIS, SDL_Window * window);
extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window,
                                    struct SDL_SysWMinfo *info);
+ HWND SDL_WindowId;
#endif /* _SDL_win32window_h */

sdl1.3/src/video/win32/SDL_win32window.c:
 //在int WIN_CreateWindow(_THIS, SDL_Window * window)函数中

if ((window->flags & SDL_WINDOW_FULLSCREEN)
    || window->y == SDL_WINDOWPOS_CENTERED) {
    y = bounds.y + (bounds.h - h) / 2;
} else if (window->x == SDL_WINDOWPOS_UNDEFINED) {
    if (bounds.x == 0) {
        y = CW_USEDEFAULT;
    } else {
        y = bounds.y;
    }
} else {
    y = bounds.y + window->y + rect.top;
}
+// for inter window
+             
+ {
+  BOOL SDL_windowid;
+  char *windowid;
+  LONG rtv;
+  windowid = SDL_getenv("SDL_WINDOWID");
+  SDL_windowid = (windowid != NULL);
+  if ( SDL_windowid ) {
+   SDL_WindowId = (HWND)SDL_strtoull(windowid, NULL, 0);
+   if ( SDL_WindowId == NULL ) {
+    SDL_SetError("Couldn't get user specified window");
+    return(-1);
+   }
+
+   /* DJM: we want all event's for the user specified
+   window to be handled by SDL.
+   */
+   //userWindowProc = (WNDPROCTYPE)GetWindowLongPtr(SDL_Window, GWLP_WNDPROC);
+   //rtv = SetWindowLongPtr(SDL_WindowId, GWLP_WNDPROC, (LONG_PTR)DefWindowProc);
+   //SDL_SetError("return = %d", rtv);
+  }
+ }
+
+ if (SDL_WindowId)
+ {
+  hwnd = SDL_WindowId;
+  SetWindowPos(hwnd, NULL, x, y, 0, 0, (SWP_NOCOPYBITS | SWP_NOSIZE));
+ }
+ else
+ {
+    hwnd =
+        CreateWindow(SDL_Appname, TEXT(""), style, x, y, w, h, NULL, NULL,
+                     SDL_Instance, NULL);
+ }

由于1.3版本的改变,只需要设置hwnd,不再象1.26那样还要处理消息循环相关的,具体可跟踪代码,在这后面有个函数:SetupWindowData里面的实现

QT中调用方法:
char windowid[32];
memset(windowid, 0, 32);
sprintf(windowid, "SDL_WINDOWID=0x%lx",  state->window_ids[i]); //window_ids[i]是QT中窗口的Wid
SDL_putenv(windowid);
//sprintf(windowid, "SDL_WINDOW_PARENTID=0x%lx",  state->window_ids[i+1]);
//SDL_putenv(windowid);

由于自己也没有深入地应用,在此只作入门介绍,具体应用还要需要进一步SDL熟悉。
在window下,开发者最好对win32及directshow比较了解,否则对后面的sdl_window,sdl_texture,sdl_overlay,render等会比较困惑. 至于双窗口之间如何通信等,个人没有去应用,感觉它不如QT实现便捷。

有什么问题可在后面留言.

SDL视频显示

1、SDL SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年11月03日 19:04
  • 602

从零开始学习音视频编程技术(很好的系列)——QT+SDL+FFMPEG

http://blog.yundiantech.com/?log=blog&page=1 http://blog.yundiantech.com/?log=blog&page=1 ...
  • STN_LCD
  • STN_LCD
  • 2017年05月31日 21:06
  • 514

SDL窗体嵌入到MFC/QT窗口控件上的方法总结

MFC嵌入方法: SDL_Window* SDL_CreateWindowFrom(const void* data); API详细介绍: Use this function to crea...
  • szfhy
  • szfhy
  • 2017年07月06日 10:44
  • 743

qt中用SDL 1.3实现播放视频双窗口

思路: 1。跳过由sdl直接创建弹出窗口,那么它的窗口应该是QT指定的窗口。 2。给SDL传递窗口Handle,由SDL_getenv("SDL_WINDOWID")来实现 3。在SDL调用系统...
  • dkqiang
  • dkqiang
  • 2012年03月23日 14:27
  • 1902

在QT搭建的播放器外壳中嵌入SDL的窗口

用的是widnowsXP的系统。给播放器中加入SDL的窗口的目的是为了播放视频,为了使用ffmpeg。 当然了直接用QT+ffmpeg也可以,不过我目前还不会。而且QT就是个壳,SDL+ffmpeg...
  • xbl1986
  • xbl1986
  • 2011年11月11日 10:01
  • 7310

SDL2嵌入到Qwidget中

在网上看到许多人用qt做播放器只用了SDL2的音频部分,然后就图片刷新。这种方案好处是简单,坏处是没有利用到sdl2 的硬件加速。 搜了一下发现大多数没有这方面的记录,所以就写下这篇文章,直接上代码吧...
  • WaitForDone
  • WaitForDone
  • 2016年12月20日 13:36
  • 811

在QT和SDL搭建的框架中使用OPENGL在SDL窗口上进行绘图

基于前篇关于QT+SDL的播放器框架。我们得以获取一个SDL的窗口。 又看到SDL上支持了OPENGL,因此,试想,我们是否可以用OPENGL来绘图呢,如果可以,可以通过这个渠道来学习OPENGL相...
  • xbl1986
  • xbl1986
  • 2011年11月12日 10:55
  • 5321

QT SDL_HideWindow 崩溃

遇到该问题,解决办法不知道 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 尊敬SDL2的开发组你们好:  很高兴能够使用你们开发的SDL2库。就像你们介绍的...
  • u011430225
  • u011430225
  • 2016年09月09日 14:05
  • 703

Qt mac sdl窗口指针

QWidget *t_newWidget = new QWidget(NULL);t_newWidget->resize(300,400);t_newWidget->show(); NSVi...
  • lanxiaziyi
  • lanxiaziyi
  • 2017年03月06日 17:53
  • 872

SDL播放视频

SDL视频播放SDL视频显示的流程SDL视频显示函数简介SDL_Init():初始化SDL系统 SDL_GreateWindow():创建窗口SDL_Window SDL_GreateRender...
  • xy1213236113
  • xy1213236113
  • 2017年08月25日 15:24
  • 188
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt中用SDL 1.3实现播放视频双窗口(附源代码)
举报原因:
原因补充:

(最多只允许输入30个字)