vlc-qt的编译与使用(MSVC+Qt5)_vlc-qt的使用-程序员宅基地

技术标签: Qt  vlc-Qt  vlc  Qt 略知一二  

(最初的环境是 MSVC2015-32bit+Qt5.9,新的配置为 MSVC2019-64bit+Qt5.15,更新时间 2021-5-30)

0.前言

项目中要用到视频播放,Qt 封装的视频库里用得多的第三方库就是 QtAV 和 vlc-qt 了(其他的主要是自己去封装 FFmpeg,当然 Qt 自带的的多媒体库基本也够用了只是要额外装解码器),具体的可以百度或者 github 上去了解,本文主要是记录 vlc-qt 的编译和使用过程。

《错过》----顾城

隔膜的薄冰溶化了,湖水是那样透彻,被雪和谜掩埋的生命,都在春光中复活。

一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活……

本文目录

1.准备工作-vlc库

2.准备工作-CMake

3.准备工作-vlc-qt

4.编译

5.使用

6.参考


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

下载链接:https://vlc-qt.tano.si/ 

版本的原因我下的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版本改为自己的;

一顿瞎操作之后,终于可以点 ConfigureGenerate 生成 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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gongjianbo1992/article/details/94591352

智能推荐

EasyDarwin开源流媒体云平台之EasyRMS录播服务器功能设计_开源录播系统-程序员宅基地

文章浏览阅读3.6k次。需求背景EasyDarwin开发团队维护EasyDarwin开源流媒体服务器也已经很多年了,之前也陆陆续续尝试过很多种服务端录像的方案,有:在EasyDarwin中直接解析收到的RTP包,重新组包录像;也有:在EasyDarwin中新增一个RecordModule,再以RTSPClient的方式请求127.0.0.1自己的直播流录像,但这些始终都没有成气候;我们的想法是能够让整套EasyDarwin_开源录播系统

oracle Plsql 执行update或者delete时卡死问题解决办法_oracle delete update 锁表问题-程序员宅基地

文章浏览阅读1.1w次。今天碰到一个执行语句等了半天没有执行:delete table XXX where ......,但是在select 的时候没问题。后来发现是在执行select * from XXX for update 的时候没有commit,oracle将该记录锁住了。可以通过以下办法解决: 先查询锁定记录 Sql代码 SELECT s.sid, s.seri_oracle delete update 锁表问题

Xcode Undefined symbols 错误_xcode undefined symbols:-程序员宅基地

文章浏览阅读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:

项目05(Mysql升级07Mysql5.7.32升级到Mysql8.0.22)_mysql8.0.26 升级32-程序员宅基地

文章浏览阅读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

高通编译8155源码环境搭建_高通8155 qnx 源码-程序员宅基地

文章浏览阅读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 源码

firebase 与谷歌_Firebase的好与不好-程序员宅基地

文章浏览阅读461次。firebase 与谷歌 大多数开发人员都听说过Google的Firebase产品。 这就是Google所说的“ 移动平台,可帮助您快速开发高质量的应用程序并发展业务。 ”。 它基本上是大多数开发人员在构建应用程序时所需的一组工具。 在本文中,我将介绍这些工具,并指出您选择使用Firebase时需要了解的所有内容。 在开始之前,我需要说的是,我不会详细介绍Firebase提供的所有工具。 我..._firsebase 与 google

随便推点

k8s挂载目录_kubernetes(k8s)的pod使用统一的配置文件configmap挂载-程序员宅基地

文章浏览阅读1.2k次。在容器化应用中,每个环境都要独立的打一个镜像再给镜像一个特有的tag,这很麻烦,这就要用到k8s原生的配置中心configMap就是用解决这个问题的。使用configMap部署应用。这里使用nginx来做示例,简单粗暴。直接用vim常见nginx的配置文件,用命令导入进去kubectl create cm nginx.conf --from-file=/home/nginx.conf然后查看kub..._pod mount目录会自动创建吗

java计算机毕业设计springcloud+vue基于微服务的分布式新生报到系统_关于spring cloud的参考文献有啥-程序员宅基地

文章浏览阅读169次。随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,高校各种管理系统层出不穷。高校作为学习知识和技术的高等学府,信息技术更加的成熟,为新生报到管理开发必要的系统,能够有效的提升管理效率。一直以来,新生报到一直没有进行系统化的管理,学生无法准确查询学院信息,高校也无法记录新生报名情况,由此提出开发基于微服务的分布式新生报到系统,管理报名信息,学生可以在线查询报名状态,节省时间,提高效率。_关于spring cloud的参考文献有啥

VB.net学习笔记(十五)继承与多接口练习_vb.net 继承多个接口-程序员宅基地

文章浏览阅读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 继承多个接口

【Nexus3】使用-Nexus3批量上传jar包 artifact upload_nexus3 批量上传jar包 java代码-程序员宅基地

文章浏览阅读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代码

关于去隔行的一些概念_mipi去隔行-程序员宅基地

文章浏览阅读6.6k次,点赞6次,收藏30次。本文转自http://blog.csdn.net/charleslei/article/details/486519531、什么是场在介绍Deinterlacer去隔行处理的方法之前,我们有必要提一下关于交错场和去隔行处理的基本知识。那么什么是场呢,场存在于隔行扫描记录的视频中,隔行扫描视频的每帧画面均包含两个场,每一个场又分别含有该帧画面的奇数行扫描线或偶数行扫描线信息,_mipi去隔行

ABAP自定义Search help_abap 自定义 search help-程序员宅基地

文章浏览阅读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