├── .gitignore ├── Demo_VLC_Qt.pro ├── README.md ├── eg.flv ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui ├── vlc_win32.zip ├── 软件使用说明1.png └── 软件使用说明2.png /.gitignore: -------------------------------------------------------------------------------- 1 | # C++ objects and libs 2 | *.slo 3 | *.lo 4 | *.o 5 | *.a 6 | *.la 7 | *.lai 8 | *.so 9 | *.so.* 10 | *.dll 11 | *.dylib 12 | 13 | # Qt-es 14 | object_script.*.Release 15 | object_script.*.Debug 16 | *_plugin_import.cpp 17 | /.qmake.cache 18 | /.qmake.stash 19 | *.pro.user 20 | *.pro.user.* 21 | *.qbs.user 22 | *.qbs.user.* 23 | *.moc 24 | moc_*.cpp 25 | moc_*.h 26 | qrc_*.cpp 27 | ui_*.h 28 | *.qmlc 29 | *.jsc 30 | Makefile* 31 | *build-* 32 | *.qm 33 | *.prl 34 | 35 | # Qt unit tests 36 | target_wrapper.* 37 | 38 | # QtCreator 39 | *.autosave 40 | 41 | # QtCreator Qml 42 | *.qmlproject.user 43 | *.qmlproject.user.* 44 | 45 | # QtCreator CMake 46 | CMakeLists.txt.user* 47 | 48 | # QtCreator 4.8< compilation database 49 | compile_commands.json 50 | 51 | # QtCreator local machine specific files for imported projects 52 | *creator.user* 53 | -------------------------------------------------------------------------------- /Demo_VLC_Qt.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2017-05-23 沙振宇 4 | # 5 | #------------------------------------------------- 6 | 7 | QT += core gui 8 | 9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 10 | 11 | TARGET = Demo_VLC_Qt 12 | TEMPLATE = app 13 | 14 | #添加相关库 15 | 16 | INCLUDEPATH += $$PWD/vlc_win32/include/ 17 | INCLUDEPATH += $$PWD/vlc_win32/include/vlc/ 18 | LIBS += -L$$PWD/vlc_win32 19 | LIBS += -llibvlc -llibvlccore 20 | 21 | SOURCES += main.cpp\ 22 | mainwindow.cpp 23 | 24 | HEADERS += mainwindow.h 25 | 26 | FORMS += mainwindow.ui 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 1、Qt的应用开发 之 Demo_VLC_Qt 2 | Qt+VLC简单的使用显示视频示例,vlc播放视频,要比QMediaPlayer实用的多,并且同时运行20个视频时不会出现卡顿。
3 |
4 | # 2、更新信息 5 | 开发者:沙振宇(沙师弟专栏)
6 | 创建时间:2017-5-23
7 | 最后一次更新时间:2019-12-5
8 | 此项目CSDN博客:Qt+VLC简单的使用显示视频Demo
9 | 此项目博客地址:https://shazhenyu.blog.csdn.net/article/details/72673677
10 |
11 | # 3、使用方法 12 | ## 3.1、使用前 13 | 使用前先解压vlc_win32.zip,再使用哦~
14 | ## 3.2、软件使用过程 15 | ![image](https://github.com/ShaShiDiZhuanLan/Demo_VLC_Qt/blob/master/%E8%BD%AF%E4%BB%B6%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E1.png) 16 | ![image](https://github.com/ShaShiDiZhuanLan/Demo_VLC_Qt/blob/master/%E8%BD%AF%E4%BB%B6%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E2.png) 17 | -------------------------------------------------------------------------------- /eg.flv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShaShiDiZhuanLan/Demo_VLC_Qt/abeec73ae73f63a0170b04109694a5f3467de4af/eg.flv -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | /*-----------Qt+VLC简单的使用显示视频Demo-------------- 2 | # 3 | # Project created by QtCreator 4 | # Author: 沙振宇 5 | # CreateTime: 2017-05-23 6 | # UpdateTime: 2019-12-19 7 | # Info: Qt+VLC简单的使用显示视频Demo 8 | # Url:https://shazhenyu.blog.csdn.net/article/details/72673677 9 | # Github:https://github.com/ShaShiDiZhuanLan/Demo_VLC_Qt 10 | # 11 | #-------------------------------------------------*/ 12 | #include "mainwindow.h" 13 | #include 14 | 15 | int main(int argc, char *argv[]) 16 | { 17 | QApplication a(argc, argv); 18 | MainWindow w; 19 | w.show(); 20 | 21 | return a.exec(); 22 | } 23 | -------------------------------------------------------------------------------- /mainwindow.cpp: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------- 2 | # 3 | # Project created by QtCreator 4 | # Author: 沙振宇 5 | # CreateTime: 2017-05-23 6 | # UpdateTime: 2019-12-19 7 | # Info: Qt+VLC简单的使用显示视频Demo 8 | # Url:https://shazhenyu.blog.csdn.net/article/details/72673677 9 | # Github:https://github.com/ShaShiDiZhuanLan/Demo_VLC_Qt 10 | # 11 | #-------------------------------------------------*/ 12 | #include "mainwindow.h" 13 | #include "ui_mainwindow.h" 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include "vlc/vlc.h" 20 | #include 21 | 22 | MainWindow::MainWindow(QWidget *parent) : 23 | QMainWindow(parent), 24 | ui(new Ui::MainWindow) 25 | { 26 | ui->setupUi(this); 27 | m_fileDialog = new QFileDialog(this); 28 | m_fileDialog->setWindowTitle(tr("Open Video")); 29 | m_fileDialog->setDirectory("."); 30 | m_fileDialog->setNameFilter(tr("Video Files(*.mp4 *.mp3 *flv *3gp *rmvb)")); 31 | m_fileDialog->hide(); 32 | } 33 | 34 | MainWindow::~MainWindow() 35 | { 36 | delete ui; 37 | } 38 | 39 | //加载 40 | bool MainWindow::load(const QString &filepath) 41 | { 42 | if(filepath.isEmpty()){ 43 | qDebug() << "filepath isEmpty"; 44 | return false; 45 | } 46 | if(!QFile::exists(filepath)){ 47 | qDebug() << "QFile no exists"; 48 | return false; 49 | } 50 | bool bload = loadVlc(QDir::toNativeSeparators(filepath).toUtf8().constData()); 51 | if(!bload){ 52 | qDebug() << "bload no isEmpty"; 53 | return false; 54 | } 55 | return true; 56 | } 57 | 58 | //播放 59 | void MainWindow::play() 60 | { 61 | if(libvlc_Ended == libvlc_media_get_state(m_media)){ 62 | stop();//vlc这个设定太奇怪了,当自然播放结束,重新播放还得主动调用一次stop(); 63 | } 64 | libvlc_media_player_play(m_mediaPlayer); 65 | } 66 | 67 | //暂停 68 | void MainWindow::pause() 69 | { 70 | if((bool)libvlc_media_player_is_playing(m_mediaPlayer)){ 71 | m_bPlaying = false; 72 | libvlc_media_player_set_pause(m_mediaPlayer, 1);//暂停 73 | } 74 | } 75 | 76 | //停止 77 | void MainWindow::stop() 78 | { 79 | m_bPlaying = false; 80 | libvlc_media_player_stop(m_mediaPlayer); 81 | } 82 | 83 | //加载 84 | bool MainWindow::loadVlc(const QString &filepath) 85 | { 86 | m_vlcInstance = libvlc_new(0, NULL); 87 | m_media = libvlc_media_new_path(m_vlcInstance, filepath.toUtf8().data()); 88 | if(!m_media){ 89 | freeVlc(); 90 | return m_media; 91 | } 92 | qDebug() << "loadVlc" << qPrintable(filepath); 93 | m_mediaPlayer = libvlc_media_player_new_from_media(m_media); 94 | if(!m_mediaPlayer){ 95 | freeVlc(); 96 | return false; 97 | } 98 | libvlc_media_parse(m_media); 99 | libvlc_event_manager_t *em = libvlc_media_player_event_manager(m_mediaPlayer); 100 | libvlc_event_attach(em, libvlc_MediaPlayerTimeChanged, vlcEvents, this); 101 | libvlc_event_attach(em, libvlc_MediaPlayerEndReached, vlcEvents, this); 102 | libvlc_event_attach(em, libvlc_MediaPlayerStopped, vlcEvents, this); 103 | libvlc_event_attach(em, libvlc_MediaPlayerPlaying, vlcEvents, this); 104 | libvlc_event_attach(em, libvlc_MediaPlayerPaused, vlcEvents, this); 105 | 106 | libvlc_media_player_set_hwnd(m_mediaPlayer, (void *)ui->label->winId()); 107 | return true; 108 | } 109 | 110 | //VLC事件 111 | void MainWindow::vlcEvents(const libvlc_event_t *ev, void *param) 112 | { 113 | Q_UNUSED(param); 114 | switch (ev->type) { 115 | case libvlc_MediaPlayerTimeChanged: 116 | break; 117 | case libvlc_MediaPlayerEndReached://不能在回调里调用stop();否则会卡死 118 | break; 119 | case libvlc_MediaPlayerStopped: 120 | qDebug() << "libvlc_MediaPlayerStopped"; 121 | break; 122 | case libvlc_MediaPlayerPlaying: 123 | qDebug() << "libvlc_MediaPlayerPlay"; 124 | break; 125 | case libvlc_MediaPlayerPaused: 126 | qDebug() << "libvlc_MediaPlayerPaused"; 127 | break; 128 | } 129 | } 130 | 131 | //释放 132 | void MainWindow::freeVlc() 133 | { 134 | if(m_media){ 135 | libvlc_media_release(m_media); 136 | m_media = Q_NULLPTR; 137 | } 138 | if(m_mediaPlayer){ 139 | libvlc_media_player_stop(m_mediaPlayer); 140 | libvlc_media_player_release(m_mediaPlayer); 141 | m_mediaPlayer = Q_NULLPTR; 142 | } 143 | if(m_vlcInstance){ 144 | libvlc_release(m_vlcInstance); 145 | m_vlcInstance = Q_NULLPTR; 146 | } 147 | } 148 | 149 | void MainWindow::on_pushButton_clicked() 150 | { 151 | if(ui->pushButton->text() == "play") { 152 | play(); 153 | ui->pushButton->setText("pause"); 154 | } else if(ui->pushButton->text() == "pause") { 155 | pause(); 156 | ui->pushButton->setText("play"); 157 | } 158 | } 159 | 160 | void MainWindow::on_pB_Stop_clicked() 161 | { 162 | stop(); 163 | ui->pushButton->setText("play"); 164 | } 165 | 166 | void MainWindow::on_pB_Open_clicked() 167 | { 168 | if(m_vlcInstance) { 169 | freeVlc(); 170 | } 171 | m_fileDialog->show(); 172 | if(m_fileDialog->exec() == QDialog::Accepted) { 173 | QString path = m_fileDialog->selectedFiles()[0]; 174 | ui->lB_Path->setText(path); 175 | load(path); 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /mainwindow.h: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------- 2 | # 3 | # Project created by QtCreator 4 | # Author: 沙振宇 5 | # CreateTime: 2017-05-23 6 | # UpdateTime: 2019-12-19 7 | # Info: Qt+VLC简单的使用显示视频Demo 8 | # Url:https://shazhenyu.blog.csdn.net/article/details/72673677 9 | # Github:https://github.com/ShaShiDiZhuanLan/Demo_VLC_Qt 10 | # 11 | #-------------------------------------------------*/ 12 | #ifndef MAINWINDOW_H 13 | #define MAINWINDOW_H 14 | 15 | #include 16 | #include 17 | #include 18 | 19 | namespace Ui { 20 | class MainWindow; 21 | } 22 | struct libvlc_media_track_info_t; 23 | struct libvlc_media_t; 24 | struct libvlc_instance_t; 25 | struct libvlc_media_player_t; 26 | struct libvlc_event_t; 27 | 28 | class MainWindow : public QMainWindow 29 | { 30 | Q_OBJECT 31 | 32 | public: 33 | explicit MainWindow(QWidget *parent = 0); 34 | ~MainWindow(); 35 | 36 | bool load(const QString &filepath);//加载 37 | void play();//播放 38 | void pause();//暂停 39 | void stop();//停止 40 | bool loadVlc(const QString &filepath);//加载 41 | void freeVlc();//释放 42 | 43 | protected: 44 | static void vlcEvents(const libvlc_event_t *ev, void *param);//VLC事件 45 | private slots: 46 | void on_pushButton_clicked();//播放/暂停 47 | void on_pB_Stop_clicked();//停止 48 | void on_pB_Open_clicked();//打开文件 49 | 50 | private: 51 | Ui::MainWindow *ui; 52 | 53 | libvlc_instance_t *m_vlcInstance = Q_NULLPTR; 54 | libvlc_media_t *m_media = Q_NULLPTR; 55 | libvlc_media_player_t *m_mediaPlayer = Q_NULLPTR; 56 | 57 | QFileDialog *m_fileDialog = Q_NULLPTR; 58 | QTimer *m_timer = Q_NULLPTR; 59 | 60 | QMutex m_mutex; 61 | qint64 m_duration = 0; 62 | bool m_bPlaying = false; 63 | }; 64 | 65 | #endif // MAINWINDOW_H 66 | -------------------------------------------------------------------------------- /mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 722 10 | 508 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 16777215 23 | 30 24 | 25 | 26 | 27 | Please enter "Open" 28 | 29 | 30 | 31 | 32 | 33 | 34 | play 35 | 36 | 37 | 38 | 39 | 40 | 41 | Open 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | Agency FB 50 | 24 51 | 52 | 53 | 54 | background-color: rgb(170, 255, 0); 55 | 56 | 57 | Please enter "play" 58 | 59 | 60 | Qt::AlignCenter 61 | 62 | 63 | 64 | 65 | 66 | 67 | stop 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /vlc_win32.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShaShiDiZhuanLan/Demo_VLC_Qt/abeec73ae73f63a0170b04109694a5f3467de4af/vlc_win32.zip -------------------------------------------------------------------------------- /软件使用说明1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShaShiDiZhuanLan/Demo_VLC_Qt/abeec73ae73f63a0170b04109694a5f3467de4af/软件使用说明1.png -------------------------------------------------------------------------------- /软件使用说明2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShaShiDiZhuanLan/Demo_VLC_Qt/abeec73ae73f63a0170b04109694a5f3467de4af/软件使用说明2.png --------------------------------------------------------------------------------