2

我一整天都在尝试在我的 QT 项目中显示带有 VLC 的视频。

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

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

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

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

我也尝试了不同版本的 libvlc,但错误总是一样的。

播放()方法:

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);

}

主.cpp:

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

w.play();

return a.exec();

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

达里安

4

3 回答 3

1

解决方案

感谢您的建议。您的两个提示在我的应用程序中都可以正常工作。我的错误是 Sleep(uint(10000));

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

将这些线移到其他方法中,合理使用即可解决问题。

于 2013-09-30T19:22:17.317 回答
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

但一切都按预期工作。

于 2013-09-28T17:36:04.300 回答
0

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

于 2013-09-29T00:54:44.567 回答