(最初的环境是 MSVC2015-32bit+Qt5.9,新的配置为 MSVC2019-64bit+Qt5.15,更新时间 2021-5-30)
项目中要用到视频播放,Qt 封装的视频库里用得多的第三方库就是 QtAV 和 vlc-qt 了(其他的主要是自己去封装 FFmpeg,当然 Qt 自带的的多媒体库基本也够用了只是要额外装解码器),具体的可以百度或者 github 上去了解,本文主要是记录 vlc-qt 的编译和使用过程。
《错过》----顾城
隔膜的薄冰溶化了,湖水是那样透彻,被雪和谜掩埋的生命,都在春光中复活。
一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活……
本文目录
下载链接: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:
下载链接: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:
版本的原因我下的github的源码 ,不然就可以不用编译了。利用git clone:
git clone git://github.com/vlc-qt/vlc-qt.git
cd vlc-qt
git submodule init
git submodule update
准备好需要的东西之后就可以编译了,作者有个简易的编译说明: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)下应该已经有了四个文件,编译也就完成了。
如果图方便,可以把编译出来的文件放到 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
博客-编译使用:https://blog.csdn.net/wj2itp08/article/details/78391261
博客-编译:https://blog.csdn.net/octdream/article/details/82079907
博客-使用:https://blog.csdn.net/octdream/article/details/82256113
文章浏览阅读3.6k次。需求背景EasyDarwin开发团队维护EasyDarwin开源流媒体服务器也已经很多年了,之前也陆陆续续尝试过很多种服务端录像的方案,有:在EasyDarwin中直接解析收到的RTP包,重新组包录像;也有:在EasyDarwin中新增一个RecordModule,再以RTSPClient的方式请求127.0.0.1自己的直播流录像,但这些始终都没有成气候;我们的想法是能够让整套EasyDarwin_开源录播系统
文章浏览阅读1.1w次。今天碰到一个执行语句等了半天没有执行:delete table XXX where ......,但是在select 的时候没问题。后来发现是在执行select * from XXX for update 的时候没有commit,oracle将该记录锁住了。可以通过以下办法解决: 先查询锁定记录 Sql代码 SELECT s.sid, s.seri_oracle delete update 锁表问题
文章浏览阅读3.4k次。报错信息error:Undefined symbol: typeinfo for sdk::IConfigUndefined symbol: vtable for sdk::IConfig具体信息:Undefined symbols for architecture x86_64: "typeinfo for sdk::IConfig", referenced from: typeinfo for sdk::ConfigImpl in sdk.a(config_impl.o) _xcode undefined symbols:
文章浏览阅读249次。背景《承接上文,项目05(Mysql升级06Mysql5.6.51升级到Mysql5.7.32)》,写在前面需要(考虑)检查和测试的层面很多,不限于以下内容。参考文档https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.htmllink推荐阅读以上链接,因为对应以下问题,有详细的建议。官方文档:不得存在以下问题:0.不得有使用过时数据类型或功能的表。不支持就地升级到MySQL 8.0,如果表包含在预5.6.4格_mysql8.0.26 升级32
文章浏览阅读3.7k次。一.安装基本环境工具:1.安装git工具sudo apt install wget g++ git2.检查并安装java等环境工具2.1、执行下面安装命令#!/bin/bashsudoapt-get-yinstall--upgraderarunrarsudoapt-get-yinstall--upgradepython-pippython3-pip#aliyunsudoapt-get-yinstall--upgradeopenjdk..._高通8155 qnx 源码
文章浏览阅读461次。firebase 与谷歌 大多数开发人员都听说过Google的Firebase产品。 这就是Google所说的“ 移动平台,可帮助您快速开发高质量的应用程序并发展业务。 ”。 它基本上是大多数开发人员在构建应用程序时所需的一组工具。 在本文中,我将介绍这些工具,并指出您选择使用Firebase时需要了解的所有内容。 在开始之前,我需要说的是,我不会详细介绍Firebase提供的所有工具。 我..._firsebase 与 google
文章浏览阅读1.2k次。在容器化应用中,每个环境都要独立的打一个镜像再给镜像一个特有的tag,这很麻烦,这就要用到k8s原生的配置中心configMap就是用解决这个问题的。使用configMap部署应用。这里使用nginx来做示例,简单粗暴。直接用vim常见nginx的配置文件,用命令导入进去kubectl create cm nginx.conf --from-file=/home/nginx.conf然后查看kub..._pod mount目录会自动创建吗
文章浏览阅读169次。随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,高校各种管理系统层出不穷。高校作为学习知识和技术的高等学府,信息技术更加的成熟,为新生报到管理开发必要的系统,能够有效的提升管理效率。一直以来,新生报到一直没有进行系统化的管理,学生无法准确查询学院信息,高校也无法记录新生报名情况,由此提出开发基于微服务的分布式新生报到系统,管理报名信息,学生可以在线查询报名状态,节省时间,提高效率。_关于spring cloud的参考文献有啥
文章浏览阅读3.2k次。Public MustInherit Class Contact '只能作基类且不能实例化 Private mID As Guid = Guid.NewGuid Private mName As String Public Property ID() As Guid Get Return mID End Get_vb.net 继承多个接口
文章浏览阅读1.7k次。1.美图# 2.概述因为要上传我的所有仓库的包,希望nexus中已有的包,我不覆盖,没有的添加。所以想批量上传jar。3.方案1-脚本批量上传PS:nexus3.x版本只能通过脚本上传3.1 批量放入jar在mac目录下,新建一个文件夹repo,批量放入我们需要的本地库文件夹,并对文件夹授权(base) lcc@lcc nexus-3.22.0-02$ mkdir repo2..._nexus3 批量上传jar包 java代码
文章浏览阅读6.6k次,点赞6次,收藏30次。本文转自http://blog.csdn.net/charleslei/article/details/486519531、什么是场在介绍Deinterlacer去隔行处理的方法之前,我们有必要提一下关于交错场和去隔行处理的基本知识。那么什么是场呢,场存在于隔行扫描记录的视频中,隔行扫描视频的每帧画面均包含两个场,每一个场又分别含有该帧画面的奇数行扫描线或偶数行扫描线信息,_mipi去隔行
文章浏览阅读1.7k次。DATA L_ENDDA TYPE SY-DATUM. IF P_DATE IS INITIAL. CONCATENATE SY-DATUM(4) '1231' INTO L_ENDDA. ELSE. CONCATENATE P_DATE(4) '1231' INTO L_ENDDA. ENDIF. DATA: LV_RESET(1) TY_abap 自定义 search help