使用QT 4.7.4窗口显示带有libvlc 2.1.0的视频

时间:2013-09-28 16:08:23

标签: c++ qt vlc

我整天都在我的QT项目中用VLC显示视频。

如果我不使用第libvlc_media_player_set_hwnd行,视频就有效。如果没有此行,VLC会自动生成一个窗口。非常重要的是我可以选择自己的窗口或子窗口区域来显示视频。

错误是: main vout display error: Failed to set on top

我使用不同的QT课程来显示视频。 QVideoWidget,QWidget,QFrame和QMainWindow。它没有改变任何东西。 (操作系统是Windows)

互联网上有很多不同的解决方案。我想它应该适用于下面的代码。

我也尝试过不同版本的libvlc,但错误始终是一样的。

play()方法:

void MainWindow::play()
{

    libvlc_instance_t * inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;

    /* Load the VLC engine */
    inst = libvlc_new (0, NULL);

    if(!inst)
        std::cout << "Can't load video player plugins" << std::endl;


    m = libvlc_media_new_path (inst, "content.avi");

    /* Create a media player playing environment */
    mp = libvlc_media_player_new_from_media (m);

    HWND windowID = reinterpret_cast<HWND>(this->winId());

    /* It works without this line */
    libvlc_media_player_set_hwnd(mp, windowID);


    /* play the media_player */
    libvlc_media_player_play (mp);

    Sleep(uint(10000)); /* Let it play a bit */

    /* Stop playing */
    libvlc_media_player_stop (mp);

    /* Free the media_player */
    libvlc_media_player_release (mp);

    libvlc_release (inst);

}

main.cpp中:

QApplication a(argc, argv);
MainWindow w;
w.show();

w.play();

return a.exec();

提前感谢您提供有用的信息。

达里安

3 个答案:

答案 0 :(得分:1)

<强>解

感谢您的建议。您的两个提示在我的应用程序中正常工作。 我的错误是线 睡眠(UINT(10000));

我想如果我不使用libvlc_media_player_set_hwnd,VLC将创建自己的事件循环。 但在我设置HWND的情况下,我自然不得不使用自己的事件循环。 由于睡眠以及随后的停止和释放,VLC在Qt事件循环开始之前完成。

在其他方法中移动这些行,合理使用可以解决问题。

答案 1 :(得分:0)

我用这一行来说明视频应该播放的位置。它对我有用。 videoWidget只是普通的QWidget。

libvlc_media_player_set_hwnd(m_player, (void*)ui->videoWidget->winId());

所以试试这个:

libvlc_media_player_set_hwnd(mp, (void*)this->winId());

修改:添加了工作示例

适用于Mac和Windows,Qt 4.8.1测试也是Qt 5.1.1,VLC SDK是2.2.0-git-20130728-0003

#include <QApplication>
#include <QMainWindow>
#include <QDebug>
#include <vlc/vlc.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QMainWindow *window = new QMainWindow;
    QWidget *videoWidget = new QWidget;
    window->setCentralWidget(videoWidget);

    libvlc_media_player_t *m_player;
    libvlc_media_t *m_media;
    libvlc_instance_t *m_vlc;

    // load the vlc engine
    m_vlc = libvlc_new(0, NULL);

    // open media
    m_media = libvlc_media_new_path(m_vlc, "test.mp4");

    if (m_media == 0) {
        qDebug() << "not possible to open file";
        return 0;
    }

    m_player = libvlc_media_player_new_from_media(m_media);

    // no need to keep the media now
    libvlc_media_release(m_media);

#if defined(Q_OS_WIN) // Windows
    libvlc_media_player_set_hwnd(m_player, (void*)videoWidget->winId());
#elif defined(Q_OS_MAC) // Mac
    libvlc_media_player_set_nsobject(m_player, (void *)videoWidget->winId());
#else //Linux
    int windid = _videoWidget->winId();
    libvlc_media_player_set_xwindow (m_player, windid );
#endif

    libvlc_media_player_play(m_player);

    window->show();
    return a.exec();
}

但不幸的是输出窗口显示错误:

main vout display error: Failed to set on top

但一切都按预期工作。

答案 2 :(得分:0)

我使用QFrame和libvlc_media_player_set_hwnd(player,reinterpret_cast(winId)); 但我通过libvlc_media_player_new创建了播放器,然后将媒体设置为它。尝试做同样的事情吗?