我整天都在我的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();
提前感谢您提供有用的信息。
达里安
答案 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创建了播放器,然后将媒体设置为它。尝试做同样的事情吗?