├── .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 | 
16 | 
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
--------------------------------------------------------------------------------