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

  1. <span style="font-family: Arial, Verdana, sans-serif; white-space: normal; background-color: rgb(255, 255, 255); ">用的是widnowsXP的系统。给播放器中加入SDL的窗口的目的是为了播放视频,为了使用ffmpeg。</span>  

当然了直接用QT+ffmpeg也可以,不过我目前还不会。而且QT就是个壳,SDL+ffmpeg才是想要表达的重点。

因为GTK+SDL+ffmpeg也是可以的。

windows上的Unix环境用的是MinGW,把SDL的库装到这个mingw目录下,对应的lib和include,跟Linux下面一样。

然后在QT的creator里就可以用-lSDL这种了,并且可以包含<SDL/SDL.h>了。如果不行,看看环境变量里面的路径什么的包含对了么。


程序就是基于上一篇播放器的外壳进行增加的。增量式开发,~增一点测试一点~安全第一~~O(∩_∩)O~

主要是对于MyWindow那个class里面增加方法,也就是函数,然后在构造函数中调用函数来初始化SDL的窗口。

如何关联QT的widget和SDL的窗口是个关键,说实话没有好的办法,SDL的官网上也是用的这种很山寨的办法,就是提供什么窗口ID。

  1. /* SDL_Surface对象,作为一块graphical memory存在,用于进行绘制 */  
  2. SDL_Surface *pSDLSurface;  
  3.   
  4. /* 把一个QT的窗口交给SDL使用 */  
  5. void MyWindow::CreateSDLWindow(void)  
  6. {  
  7.     QWidget *widget = ui->SDLWindow;  
  8.   
  9.     {  
  10.         char winID[32] = {0};  
  11.         /* 获取窗口的大小 */  
  12.         QSize size = ui->SDLWindow->baseSize();  
  13.   
  14.         sprintf(winID, "SDL_WINDOWID=0x%lx", (long unsigned int)widget->winId());  
  15.   
  16.         SDL_putenv(winID);  
  17.   
  18.         if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {  
  19.             qDebug("Cannot initialize SDL.");  
  20.         }  
  21.   
  22.         pSDLSurface = SDL_SetVideoMode(size.width(), size.height(), 0, SDL_HWSURFACE);  
  23.         if (!pSDLSurface) {  
  24.             qDebug("SDL Cannot set video mode");  
  25.         }  
  26.     }  
  27. }  


看到了没,一个sprintf把一句

  1. SDL_WINDOWID=0x%lx  

给赋值了,然后用SDL_putenv来给了环境变量,话说我是真不知道这个东西怎么传递的,而且在Linux下还是用的putenv()的函数。~~所谓的hack方法。

搞完了这个之后,运行程序就会看到原来灰白色的主窗口现在变成了黑色的。说明~成功了,下一步就可以在这个上面用一些SDL的东西来搞搞了。

最后把代码都贴上来吧,没改动的就算了。

mainwidnow.h

  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <QFileDialog>  
  6. #include <QMessageBox>  
  7. #include <stdio.h>  
  8. #include <SDL/SDL.h>  
  9.   
  10. #define FILE_NAME_LENGTH    128  
  11.   
  12. extern SDL_Surface *pSDLSurface;  
  13.   
  14. namespace Ui {  
  15.     class MyWindow;  
  16. }  
  17.   
  18. class MyWindow : public QMainWindow  
  19. {  
  20.     Q_OBJECT  
  21.   
  22. public:  
  23.     explicit MyWindow(QWidget *parent = 0);  
  24.     ~MyWindow();  
  25.     /* 获取当前播放还是暂停的状态 */  
  26.     int  getPlayState(void);  
  27.     /* 设置当前播放还是暂停的状态 */  
  28.     void setPlayState(int i);  
  29.   
  30. private:  
  31.     Ui::MyWindow *ui;  
  32.     /* 表示当前是播放还是暂停的状态的变量 */  
  33.     int  iPlayPause;  
  34.     /* 表示要播放的文件名称 */  
  35.     char caFileName[FILE_NAME_LENGTH];  
  36.   
  37.     /* 保存打开的文件名称(包括路径) */  
  38.     void SaveFileName(QString file);  
  39.     /* 获取文件名称(包括路径) */  
  40.     char *GetFileName(void);  
  41.   
  42.     void CreateSDLWindow(void);  
  43.   
  44. public slots:  
  45.     /* 快退 */  
  46.     void SlotsBackward(void);  
  47.     /* 快进 */  
  48.     void SlotsForward(void);  
  49.     /* 播放暂停 */  
  50.     void SlotsPlayPause(void);  
  51.     /* 停止 */  
  52.     void SlotsStop(void);  
  53.     /* 打开文件选择对话框 */  
  54.     void SlotsOpenFile(void);  
  55. };  
  56.   
  57. #endif // MAINWINDOW_H  


mainwindow.cpp

    1. #include "mainwindow.h"  
    2. #include "ui_mywindow.h"  
    3.   
    4. MyWindow::MyWindow(QWidget *parent) :  
    5.     QMainWindow(parent),  
    6.     ui(new Ui::MyWindow)  
    7. {  
    8.     ui->setupUi(this);  
    9.   
    10.     Qt::WindowFlags flags = 0;  
    11.     flags |= Qt::WindowMinimizeButtonHint; /* 禁止最大化 */  
    12.     setWindowFlags(flags);  
    13.     //QSize size = ui->MyScreen->baseSize();  
    14.     //setFixedSize(size.width(),size.height());  
    15.     setFixedSize(400,450); /* 禁止改变窗口大小 */  
    16.   
    17.     iPlayPause = 0;  
    18.     connect(ui->Backward,   SIGNAL(clicked()), this, SLOT(SlotsBackward()));  
    19.     connect(ui->Forward,    SIGNAL(clicked()), this, SLOT(SlotsForward()));  
    20.     connect(ui->PlayPause,  SIGNAL(clicked()), this, SLOT(SlotsPlayPause()));  
    21.     connect(ui->Stop,       SIGNAL(clicked()), this, SLOT(SlotsStop()));  
    22.     connect(ui->OpenFile,   SIGNAL(clicked()), this, SLOT(SlotsOpenFile()));  
    23.   
    24.     CreateSDLWindow();  
    25. }  
    26.   
    27. MyWindow::~MyWindow()  
    28. {  
    29.     delete ui;  
    30. }  
    31.   
    32. /* 快退 */  
    33. void MyWindow::SlotsBackward(void)  
    34. {  
    35.     qDebug("Backward");  
    36. }  
    37.   
    38. /* 快进 */  
    39. void MyWindow::SlotsForward(void)  
    40. {  
    41.     qDebug("Forward");  
    42. }  
    43.   
    44.   
    45. /* 第一次点下去从播放变为暂停,以后每次布尔状态切换播放和暂停状态 */  
    46. void MyWindow::SlotsPlayPause(void)  
    47. {  
    48.     if (getPlayState()==0) {  
    49.         qDebug("Play: %s", GetFileName());  
    50.         setPlayState(1);  
    51.     } else {  
    52.         qDebug("Pause");  
    53.         setPlayState(0);  
    54.     }  
    55. }  
    56.   
    57. /* 停止当前的播放 */  
    58. void MyWindow::SlotsStop(void)  
    59. {  
    60.     qDebug("Stop");  
    61. }  
    62.   
    63. /* 获取当前的播放状态,播放还是暂停 */  
    64. int MyWindow::getPlayState(void)  
    65. {  
    66.     return iPlayPause;  
    67. }  
    68.   
    69. /* 设置当前的播放状态,播放还是暂停 */  
    70. void MyWindow::setPlayState(int i)  
    71. {  
    72.     iPlayPause = i;  
    73. }  
    74.   
    75. /* 与OPEN按钮关联的动作,显示文件选择对话框,让用户选择想要打开的文件 */  
    76. void MyWindow::SlotsOpenFile(void)  
    77. {  
    78.     qDebug("Open File");  
    79.     QFileDialog *fd = new QFileDialog(this);  
    80.     fd->setModal(QFileDialog::ExistingFile);    /* 设置模式为存在的文件 */  
    81.     fd->setViewMode(QFileDialog::Detail);       /* 设置显示模式为详细 */  
    82.     fd->setFilter("Video (*.mpeg *.avi)");      /* 设置过滤器,显示特定后缀名的文件 */  
    83.     if (fd->exec() == QDialog::Accepted) {  
    84.         QString file = fd->selectedFiles()[0];  /* 取得选择的文件,包括了绝对路径 */  
    85.         //qDebug(file.toAscii().data());  
    86.         SaveFileName(file);  
    87.     }  
    88. }  
    89.   
    90. /* 将想要打开的媒体文件的名字保存到一个数组里面,方便使用 */  
    91. void MyWindow::SaveFileName(QString file)  
    92. {  
    93.     memset(caFileName, 0, FILE_NAME_LENGTH);  
    94.     strcpy(caFileName, file.toAscii().data());  
    95. }  
    96.   
    97. /* 获取想要打开的媒体文件的名字 */  
    98. char* MyWindow::GetFileName(void)  
    99. {  
    100.     return caFileName;  
    101. }  
    102.   
    103.   
    104. /* SDL_Surface对象,作为一块graphical memory存在,用于进行绘制 */  
    105. SDL_Surface *pSDLSurface;  
    106.   
    107. /* 把一个QT的窗口交给SDL使用 */  
    108. void MyWindow::CreateSDLWindow(void)  
    109. {  
    110.     QWidget *widget = ui->SDLWindow;  
    111.   
    112.     {  
    113.         char winID[32] = {0};  
    114.         /* 获取窗口的大小 */  
    115.         QSize size = ui->SDLWindow->baseSize();  
    116.   
    117.         sprintf(winID, "SDL_WINDOWID=0x%lx", (long unsigned int)widget->winId());  
    118.   
    119.         SDL_putenv(winID);  
    120.   
    121.         if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {  
    122.             qDebug("Cannot initialize SDL.");  
    123.         }  
    124.   
    125.         pSDLSurface = SDL_SetVideoMode(size.width(), size.height(), 0, SDL_HWSURFACE);  
    126.         if (!pSDLSurface) {  
    127.             qDebug("SDL Cannot set video mode");  
    128.         }  
    129.     }  
    130. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值