• 22118阅读
  • 7回复

QT中嵌入SDL [复制链接]

上一主题 下一主题
离线tcg1983
 

只看楼主 倒序阅读 楼主  发表于: 2009-11-23
— 本帖被 XChinux 设置为精华(2011-01-26) —

前段时间在做一个音视频编码板卡的PC跨平台程序,使用QT框架,其中有块功能是往QT里嵌入SDL,来播放YUV格式帧数据,现在已经在windows和linux下完成。
我浏览论坛的时候,发现好多同僚在做我以前的准备工作。在这里我把我的一些经验写出来,希望对这些同僚有点帮助,当然可能有有一些错误,请指出来,大家一起进步。
一.
yay-20060421-2.zip这个包是一个使用SDL的YUV的播放器源代码,在Linux下可用。
二.
至于往QT里嵌入SDL,你可以这样
这个是.pro文件部分代码:
unix {
-lSDL \

-lSDLmain

}

win32 {

LIBS += -L./lib/Win32Lib \

-lSDL \

-lSDLmain

}

Windows下的SDL库文件有3个sdl.lib, SDLmain.lib 和sdl.dll。将sdl.lib,SDLmain.lib 放在./lib/Win32Lib目录下,

讲sdl.dll跟你的执行文件放在一起。

Linux下一般都为帮你安装好SDL,如果没安装还没关系,下一个,配置下环境变量。Linux下的SDL静态库为libSDL.a和libSDLmain.a。

三.SDL实现代码,参考yay-20060421-2.zip 里面的代码就行。往QT里嵌入SDL的代码其实很恶心,也最重要!在初始化的时候加上这么一段代码:

/*set sdl env*/
char variable[64];

#ifdef Q_OS_WIN
sprintf(variable, "SDL_WINDOWID=0x%lx", frame_pre->winId());
#else
sprintf(variable, "SDL_WINDOWID=0x%lx", this->winId());
#endif

putenv(variable);

把QT的窗口句柄的winId值,赋给SDL的环境变量就可以了,但这在windows下和linux下有点区别,frame_pre为MainWindow下的一个frame。你不能将MainWindow的句柄赋给SDL,但在Linux下,你又必须把MainWindow的句柄赋给SDL,不能把frame的窗口句柄赋给SDL,具体是为什么,我没去研究,可能是跟windows和linux的窗口机制不一样有关,哪为知道为什么的请告诉我为什么。
附件: yay-20060421-2.zip (21 K) 下载次数:470
离线foxyz

只看该作者 1楼 发表于: 2009-11-23
原创内容,顶你一下
离线nmiirq

只看该作者 2楼 发表于: 2009-11-23
好贴,顶一下!
离线goonman

只看该作者 3楼 发表于: 2009-11-23
LZ太牛了,如何将QT的窗口句柄的winId值,赋给SDL的环境变量,我是新手,楼主说得稍微详细点,我现在也是想在Qt中显示yuv视频,非常感谢。
[ 此帖被goonman在2009-11-24 18:10重新编辑 ]
离线wd007

只看该作者 4楼 发表于: 2009-11-23
这个是一定要顶的,建议加精。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线tcg1983

只看该作者 5楼 发表于: 2009-11-25
引用第3楼goonman于2009-11-23 18:40发表的  :
LZ太牛了,如何将QT的窗口句柄的winId值,赋给SDL的环境变量,我是新手,楼主说得稍微详细点,我现在也是想在Qt中显示yuv视频,非常感谢。


其实说的很详细了。
/*set sdl env*/
char variable[64];

#ifdef Q_OS_WIN
sprintf(variable, "SDL_WINDOWID=0x%lx", ->winId());
#else
sprintf(variable, "SDL_WINDOWID=0x%lx", this->winId());
#endif

putenv(variable);


this 一般就是MainWin的句柄,frame_pre是MainWin里的一个frame控件,你在初始化的时候用。如果程序运行过程中要重设SDL, 那这段代码也要在SDL初始化之前重新写一遍。
离线lhca
只看该作者 6楼 发表于: 2011-01-26
在mac下该如何做呢???

似乎mac不支持putenv,  
离线lihuayu
只看该作者 7楼 发表于: 2011-10-19
请问LZ,我这样写但是运行后点击PLAY,会蹦出一个SDL窗口,视频在这个窗口里播放,之前那个QT窗口鼠标点击没有反应了,当关闭SDL窗口,QT窗口也关闭了,这是怎么回事呀?
DEMO::DEMO(QWidget *parent) :
    QWidget(parent)
    //ui(new Ui::DEMO)
{
   // ui->setupUi(this);
    setWindowTitle("Media Player");
    resize(400,400);

    mediaObject = new Phonon::MediaObject(this);

    videoWidget = new Phonon::VideoWidget(this);

    /*set sdl env*/
        char variable[64];
        #ifdef Q_OS_WIN
        sprintf(variable, "SDL_WINDOWID=0x%lx", videoWidget->winId());
        #else
        sprintf(variable, "SDL_WINDOWID=0x%lx", this->winId());
        #endif
        printf("SDL_WINDOWID = %s \n",variable);
        SDL_putenv(variable);
      /*  char variable[64];
          sprintf(variable, "SDL_WINDOWID=0x%lx",QWidget::winId());
          putenv(variable);*/

    videoWidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
   // videoWidget->setScaleMode(Phonon::VideoWidget::ScaleAndCrop);
    //videoWidget->setAttribute(QT::WA_PaintOnScreen);
    //videoWidget->setAttribute(QT::WA_NoSystemBackground);
    videoWidget->show();
    Phonon::createPath(mediaObject, videoWidget);



    audioOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
    Phonon::createPath(mediaObject, audioOutput);

    QLabel *label = new QLabel("Volume:");
    volumeSlider = new Phonon::VolumeSlider;请楼主
快速回复
限100 字节
 
上一个 下一个