(最初的环境是 MSVC2015-32bit+Qt5.9,新的配置为 MSVC2019-64bit+Qt5.15,更新时间 2021-5-30)
0.前言
项目中要用到视频播放,Qt 封装的视频库里用得多的第三方库就是 QtAV 和 vlc-qt 了(其他的主要是自己去封装 FFmpeg,当然 Qt 自带的的多媒体库基本也够用了只是要额外装解码器),具体的可以百度或者 github 上去了解,本文主要是记录 vlc-qt 的编译和使用过程。
《错过》----顾城
隔膜的薄冰溶化了,湖水是那样透彻,被雪和谜掩埋的生命,都在春光中复活。
一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活……
本文目录
1.准备工作-vlc库
下载链接:http://download.videolan.org/vlc/
vlc-qt 1.1 的发行版用的 vlc 2.2.4,实测 2.2.6 和 2.2.8 也是可以使用的,也有人用 3.0。如果编译器是 mscv2015-32bit,可以选的 win32 那个链接 http://download.videolan.org/vlc/2.2.6/win32/vlc-2.2.6-win32.7z (需要带 sdk 的压缩包),如果是 64bit 就下 win64 那个。
可以把需要的文件复制到 Qt 安装目录去,这里参考:https://blog.csdn.net/octdream/article/details/82079907
不过 vlc 也没必要复制,因为 vlc-qt install 的时候已经打包好了需要的东西,我之前也是依葫芦画瓢。
把 plugins 和两个 dll 文件复制到 Qt 安装目录下的 bin 目录中(如:D:\Qt\Qt5.9.8\5.9.8\msvc2015\bin)
把 sdk/include/vlc 目录复制到 Qt 安装目录下的 include 目录中(如:D:\Qt\Qt5.9.8\5.9.8\msvc2015\include)
把 sdk/lib 下面的几个 lib 文件复制到qt安装目录下面的lib目录中(如:D:\Qt\Qt5.9.8\5.9.8\msvc2015\lib)
这里我们还要设置一个环境变量,就是我们 plugins 文件夹的位置,如:
VLC_PLUGIN_PATH D:/Qt/Qt5.9.8/5.9.8/msvc2015/bin/plugins
也可以直接 CMake gui 里 Add Entry:
2.准备工作-CMake
下载链接:https://cmake.org/download/
随便下一个版本新点的就行了,我下的 cmake-3.14.3-win64-x64.msi
安装好 CMake 还要设置一个环境变量,指到包含 bin 及 lib 的一级,例如:
CMAKE_PREFIX_PATH D:/Qt/Qt5.9.8/5.9.8/msvc2015
(可以确认下环境变量生效没,没有的话参考https://blog.csdn.net/mldr001czb/article/details/80295894)
也可以直接 CMake gui 里 Add Entry:
3.准备工作-vlc-qt
版本的原因我下的github的源码 ,不然就可以不用编译了。利用git clone:
git clone git://github.com/vlc-qt/vlc-qt.git
cd vlc-qt
git submodule init
git submodule update
4.编译
准备好需要的东西之后就可以编译了,作者有个简易的编译说明:https://github.com/vlc-qt/vlc-qt/blob/master/BUILDING.md
(因为我出错的次数很多,所以重复了很多次,无奈)
首先,在 vlc-qt 目录旁边或者文件夹下分别建两个用来放 build 文件和 install 文件的文件夹(我的叫 vlc-qtbuild 和 vlc-qtinstall),打开 CMake 的 gui 程序,选择 source 即 vlc-qt 源码文件夹,选择 build 即新建的 vlc-qtbuild 文件夹。(后来觉得还是 bulid 和 install 放到 vlc-qt 目录下好点)
然后点击Configure试一下
如果现在就点 Generate 的话是不行的,有些参数还得改一下:
CMAKE_INSTALL_PREFIX 可以改成自己创建的文件夹(我是 vlc-qtinstall )方便管理;
还有就是 LIBVLCCORE_LIBRARY 和 LIBVIC_LIBRARY 的链接是不正确的,分别改成:libvlccore.lib 和 libvlc.lib;
然后是点击 Add Entry 添加一个变量,Name 填 CMAKE_DEBUG_POSTFIX,Type 选 String,Value 填 d,描述不用写,这样如果是 debug 版的可以带 d 后缀;
然后是 vlc-qt\config\Dependencies.cmake 文件中的Qt版本改为自己的;
一顿瞎操作之后,终于可以点 Configure 和 Generate 生成 vs2015 工程了。
(如果路径不匹配才需要改这一步)Generate 成功之后再去改一下 build 文件夹下的 cmake_install.cmake 文件,不然编译会出错,如下图中红色圈出来的已经把目录的 msvc2015/include/ 换为了 msvc2015/bin/
改好之后用 vs2015 打开 build 文件夹下的 VLC-Qt.sln 工程文件,这时候还有一个要改的地方,分别修改 Core,PluginQml,Qml,Widgets 工程的属性>>配置>>链接器>>命令行>>其它选项下填入:
/SAFESEH:NO
关闭 SAFESEH 警告,不关闭会把这个警告认为错误。貌似有些人需要删掉已有的命令行内容,有的直接追加在后面就行,我是直接加在后面的。
修改好四个的属性后,直接在 ALL_BUILD 工程上右键菜单点生成,就可以生成动态库了,生成成功后再在 INSTALL 工程上右击生成,就可将库提取到安装目录里了,即在 CMake 的的时设置的那个目录(vlc-qtinstall)。我分别生成了 debug 和 release 的(切换后记得再改下属性>>命令行>>其他选项的内容)。
install 的时候可能会报 vlcqt not found(如下图),我是 debug 报的,我又去生成 release 没遇到,完了又回头再次点生成 debug 版的,那个提示莫名其妙消失了。这个问题目前还没彻底决绝,对 qml 有影响,因为没正常生成 qmltypes ,所以属性不能正常提示。
install 完成后,在对应目录(vlc-qtinstall)下应该已经有了四个文件,编译也就完成了。
5.使用
如果图方便,可以把编译出来的文件放到 Qt 环境中,也可以在项目里设置依赖路径。
把 bin 目录下的所有 dll 文件拷贝到 Qt 的 bin 目录下(如:D:\Qt\Qt5.9.8\5.9.8\msvc2015\bin)
将 include 目录下的所有文件夹包括:VLCQtCore、VLCQtQml、VLCQtWidgets 拷贝到 Qt 的 include 目录下(如:D:\Qt\Qt5.9.8\5.9.8\msvc2015\include)
将 lib 目录下的所有文件包括 cmake 文件夹及所有的 lib 文件拷贝到 Qt 的 lib 目录下(如: D:\Qt\Qt5.9.8\5.9.8msvc2015\lib)
将 qml 目录下的文件夹 VLCQt 拷贝到 Qt 的 qml 目录下。
然后我们可以参考 vlc-qt/examples 里的例子。
widgets 的话,可以直接跑示例,pro 文件的 lib 配置可能要改一下:
//如果是qml就加lVLCQtQml,widgets就用lVLCQtWidgets
CONFIG(debug, debug|release) {
LIBS += -lVLCQtCored -lVLCQtWidgetsd
} else {
LIBS += -lVLCQtCore -lVLCQtWidgets
}
qml 的话,我把示例的代码 copy 的一部分然后放到自己的项目中:
先把 pro 改一下
//xxx.pro
CONFIG(debug, debug|release) {
LIBS += -lVLCQtCored -lVLCQtQmld
} else {
LIBS += -lVLCQtCore -lVLCQtQml
}
使用 VLCQt 组件
//Player.qml
import QtQuick 2.9
import QtQuick.Controls 2.2
import VLCQt 1.1
Rectangle {
width: 640
height: 480
color: "black"
VlcPlayer {
id: player
//logLevel: Vlc.DebugLevel
//logLevel: Vlc.ErrorLevel
//audioTrack:Vlc.MPEG2Audio
//videoTrack: Vlc.MPEG4Video
//网络视频流测试
url: "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov"
//本地文件测试
//url:"file:///C:/Users/zhaozhao/Videos/Avicii.mp4"
}
VlcVideoOutput {
id: video
source: player
anchors.fill: parent
anchors.bottomMargin: 30
}
Row{
x:2
y:2
spacing: 10
Text {
id: length
color: "white"
text: "length:"+player.length
}
Text {
id: position
color: "white"
text: "position:"+player.position
}
}
Slider{
height: 30
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
from:0
to:1
value:0
onValueChanged: {
player.position=value;
}
}
}
//main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Test VLCQt")
color: "darkCyan"
//只是一个简单的测试,具体功能可以参照示例和api
Player{
anchors.fill: parent
anchors.margins: 10
}
}
(程序发布的时候记得把相关依赖复制出来)
这样简单的使用测试也就完成了
(2020-01-01)在 MSVC2017+Qt5.12.6 下编译成功,但是运行报错::-1: error: LNK1181: 无法打开输入文件“VLCQtCore.lib”。
(2021-02-25)评论里有小伙伴改了配置文件可以正常运行了(qt5.13.0+msvc2017_64)。
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/lib/ -lVLCQtCore
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/lib/ -lVLCQtCored
else:unix: LIBS += -L$$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/lib/ -lVLCQtCore
INCLUDEPATH += $$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/include
DEPENDPATH += $$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/include
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/lib/ -lVLCQtQml
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/lib/ -lVLCQtQmld
else:unix: LIBS += -L$$PWD/../../../qt5.13.0/5.13.0/msvc2017_64/lib/ -lVLCQtQml
6.参考
博客-编译使用:https://blog.csdn.net/wj2itp08/article/details/78391261
博客-编译:https://blog.csdn.net/octdream/article/details/82079907
博客-使用:https://blog.csdn.net/octdream/article/details/82256113