libVLC windows开发环境搭建
1.简介
LibVLC是一个强大的开源库,它构成了VLC媒体播放器的核心部分。
LibVLC提供了一系列的功能接口,使得VLC能够处理流媒体的接入、音频和视频输出、插件管理以及线程系统等核心任务。
- 跨平台性:VLC作为一个跨平台的多媒体播放器,可以运行在多种操作系统和计算机体系结构上。
- 协议支持:LibVLC不仅支持播放本地视频文件,还支持播放基于各种流媒体协议(如RTMP、RTSP)的视频。
- API一致性:在不同操作系统下,如Linux和Windows,LibVLC提供的API基本一致,这为开发者跨平台开发提供了便利。
- 扩展性:VLC作为一个流媒体服务器和多媒体框架,是可扩展的,能够通过LibVLC提供的API接口添加新组件和功能。
2.环境搭建
下载地址Index of /pub/videolan/vlc/last/
我这里使用的是64位的库。


下载完成解压文件。
主要需要plugins文件和sdk路径下的lib和include目录。

新建vs工程,新建目录3rd,将sdk路径下的lib和include目录复制到3rd目录下。

配置包含目录和库目录,如下图所示。



至此,开发环境已经搭建好了。
3.常用接口
LibVLC提供了一系列接口,用于实现多媒体播放和管理功能。以下是一些常用的接口及其作用:
- libvlc_new - 创建一个新的libVLC实例。
- libvlc_release - 释放libVLC实例。
- libvlc_media_player_new - 创建一个新的媒体播放器对象。
- libvlc_media_player_release - 释放媒体播放器对象。
- libvlc_media_new_path / libvlc_media_new_location - 从本地文件路径或网络位置创建媒体对象。
- libvlc_media_release - 释放媒体对象。
- libvlc_media_player_set_media - 将媒体对象与播放器关联。
- libvlc_media_player_play - 开始播放媒体。
- libvlc_media_player_pause - 暂停播放。
- libvlc_media_player_stop - 停止播放。
- libvlc_media_player_set_hwnd - 设置视频输出窗口(适用于Windows)。
- libvlc_media_player_get_time - 获取当前播放时间。
- libvlc_media_player_set_time - 设置播放位置(时间)。
- libvlc_media_player_get_length - 获取媒体的长度。
- libvlc_media_player_get_state - 获取当前播放器状态。
- libvlc_audio_set_volume - 设置音量。
- libvlc_audio_get_volume - 获取音量。
- libvlc_media_player_is_playing - 检查媒体是否正在播放。
- libvlc_media_parse - 解析媒体以获取更多信息(如元数据、跟踪信息等)。
4.示例

#pragma once#include <QtWidgets/QWidget>
#include "ui_showWidget.h"
#include <QMenu>
#include <QActionGroup>
#include <vlc/vlc.h>
#include <QDebug>
#include <QFileDialog>
#include <QThread>class showWidget : public QWidget
{Q_OBJECTpublic:showWidget(QWidget *parent = nullptr);~showWidget();private slots:void slotOpenFile();void slotPlay();private:static void vlcEvents(const libvlc_event_t *ev, void *param);private:Ui::showWidgetClass ui;private:libvlc_instance_t *vlc_base = nullptr;libvlc_media_t *vlc_media = nullptr;libvlc_media_player_t *vlc_mediaPlayer = nullptr;QActionGroup *m_TimeSpeedGrp = nullptr;QMenu m_SpeedMenu;static showWidget *pThis;
};#include "showWidget.h"
#include <QTimer>#pragma execution_character_set("utf-8")showWidget* showWidget::pThis = nullptr;showWidget::showWidget(QWidget *parent): QWidget(parent)
{ui.setupUi(this);this->setWindowTitle("视频播放器");connect(ui.btnOpen, &QPushButton::clicked, this, &showWidget::slotOpenFile);connect(ui.btnPlay, &QPushButton::clicked, this, &showWidget::slotPlay);
}showWidget::~showWidget()
{libvlc_release(vlc_base); //减少libvlc实例的引用计数,并销毁
}void showWidget::slotOpenFile()
{/*选择文件*/QString filename = QFileDialog::getOpenFileName(this, "选择打开的文件", "D:/", tr("*.*"));std::replace(filename.begin(), filename.end(), QChar('/'), QChar('\\'));vlc_base = libvlc_new(0, NULL);vlc_media = libvlc_media_new_path(vlc_base, filename.toUtf8().data());if (!vlc_media) {return;}vlc_mediaPlayer = libvlc_media_player_new_from_media(vlc_media);if (!vlc_mediaPlayer) {return;}libvlc_media_parse(vlc_media);libvlc_event_manager_t *em = libvlc_media_player_event_manager(vlc_mediaPlayer);libvlc_event_attach(em, libvlc_MediaPlayerTimeChanged, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerEndReached, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerStopped, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerPlaying, vlcEvents, this);libvlc_event_attach(em, libvlc_MediaPlayerPaused, vlcEvents, this);libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow->winId());QTimer::singleShot(1000, this, &showWidget::slotPlay);
}void showWidget::slotPlay()
{libvlc_media_player_play(vlc_mediaPlayer);
}void showWidget::vlcEvents(const libvlc_event_t *ev, void *param)
{qint64 pos;switch (ev->type) {case libvlc_MediaPlayerTimeChanged:qDebug() << "VLC媒体播放器时间已更改";break;case libvlc_MediaPlayerEndReached:qDebug() << "VLC播放完毕.";break;case libvlc_MediaPlayerStopped:qDebug() << "VLC停止播放";break;case libvlc_MediaPlayerPlaying:qDebug() << "VLC开始播放";break;case libvlc_MediaPlayerPaused:qDebug() << "VLC暂停播放";break;}
}
编译好的程序,需要把plugins目录和动态库拷贝到运行目录,才能够运行。
编译错误解决:
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2065: “libvlc_media_read_cb”: 未声明的标识符
\VLC\sdk\include\vlc/libvlc_media.h(368): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2513: “int”: 在“=”前没有声明变量
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2143: 语法错误: 缺少“;”(在“(”的前面)
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2062: 意外的类型“void”
\VLC\sdk\include\vlc/libvlc_media.h(478): error C2061: 语法错误: 标识符“libvlc_media_read_cb”
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2065: “libvlc_media_read_cb”: 未声明的标识符
\VLC\sdk\include\vlc/libvlc_media.h(368): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2513: “int”: 在“=”前没有声明变量
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2143: 语法错误: 缺少“;”(在“(”的前面)
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2062: 意外的类型“void”
\VLC\sdk\include\vlc/libvlc_media.h(478): error C2061: 语法错误: 标识符“libvlc_media_read_cb”
打开vlc.h加上: typedef __int64 ssize_t;
相关文章:
libVLC windows开发环境搭建
1.简介 LibVLC是一个强大的开源库,它构成了VLC媒体播放器的核心部分。 LibVLC提供了一系列的功能接口,使得VLC能够处理流媒体的接入、音频和视频输出、插件管理以及线程系统等核心任务。 跨平台性:VLC作为一个跨平台的多媒体播放器&#x…...
【Netty】Netty的使用和常用组件详解
目录 一、简述 1.1 什么是Netty 1.2 Netty 的优势 1.3 为什么不用 Netty5? 1.4 为什么 Netty 使用 NIO 而不是 AIO? 1.5 为什么不用 Mina? 二、第一个 Netty 程序 2.1 Bootstrap、EventLoop(Group) 、Channel 2.1.1 Bootstrap 2.1.…...
Legacy|电脑Windows系统如何迁移到新安装的硬盘?系统迁移详细教程!
前言 前面讲了很多很多关于安装系统、重装系统的教程。但唯独没有讲到电脑换了新的硬盘之后,怎么把旧系统迁移到新的硬盘上。 今天小白就来跟各位小伙伴详细唠唠: 开始之前需要把系统迁移的条件准备好,意思就是在WinPE系统下,可…...
Windows 11 安装 Scoop
[Windows 11 安装 Scoop](Windows 11 安装 Scoop) 0. 引言 Scoop 从命令行安装您熟悉和喜爱的程序,差异最小。 它的主要功能如下: 消除权限弹出窗口 隐藏 GUI 向导样式的安装程序 防止PATH污染安装大量程序 避免安装和卸载程序的意外副作用 自动查…...
新能源汽车小三电系统
小三电系统 新能源电动汽车的"小三电"系统,一般指车载充电机(OBC)、车载 DC/DC 变换器,和高压直流配电盒(PDU)。一辆纯电动汽车一般配备一台OBC 和一台车载 DC/DC 变换器。OBC将外部输入的交流电转化为直流电输出给电池,DC/DC衔接…...
面试问答示范
文章目录 请做个自我介绍您的学历是统招吗?可以在学信网查询吗是全日制吗是双证吗?请介绍一下你上家公司的情况。介绍一下你们公司的服务器架构(网络架构)。说说你在工作中处理过的最棘手的技术问题讲一讲上家公司做过的项目为什么…...
嵌入式3-22
4.输入一个秒数,输出几时几分几秒 eg:输入3670 1小时1分钟10秒 5,输入一个数,使用条件运算符实现,如果是水仙花则赋值1否则赋值0 6.终端输入一个年份,使用条件运算符实现,如果是润年则赋值1否则赋值0 …...
JAVA Synchronized对象锁和类锁区别(牛逼)
一个类就像一个四合院,四合院的大门叫做构造方法,盖房子必须经过大门,每new一个对象,就表示在四合院里再盖一间新房子,大门上面的锁,叫做构造锁,里面每一间房子就是一个实例,每间房子…...
力扣算法题之好数对的数目
c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…...
C++ vector 删除
erase函数原型 iteratorerase(iterator position);//a.erase(p),删除迭代器p所指向的元素,a为容器对象 iteratorerase(iterator first, iterator last);//a.erase(b,c),删除迭代器b,c区间内的元素,a为容器对象 //返回值都是一个迭代器,该迭代…...
ASP.NET-WebFoms常见前后端交互方式
在 ASP.NET Web Forms 中,实现前后端交互是开发 Web 应用程序的重要部分。通过合适的数据传递方式,前端页面能够与后端进行有效的通信,并实现数据的传递、处理和展示。本文介绍了ASP.NET Web Forms开发中常见的前后端交互方式,包括…...
LWC 学习资源
Lightning Web Components 開発者ガイドlibraryblogs Lightning Web Component (LWC)のご紹介 LWCからデータベースにアクセスする方法 - QiitaLightning Web Component 間の通信の基礎 - Qiita Sodech Developer Blog LWCとApexを連携させてREST コールアウトを実行する Taig…...
Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射
Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射 一、基本类型二、时间类型三、Decimal类型四、Boolean values布尔值五、Spatial types空间类型六、Debezium技术总结 Debezium MySQL 连接器表示对带有事件的行的更改,这些事件的结构类似于该…...
通过JWT完成token登录验证
前言 什么是JWT? 全称是JSON Web token,是用于对应用程序上的用户进行身份验证的标记,使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据 使用JWT的优势 提高了程序的可伸缩性,也极大的提高了应用程序的安全…...
【漏洞复现】福建科立迅通信指挥调度平台down_file.php sql注入漏洞
漏洞描述 福建科立迅通信调度平台 20240318 以及之前版本存在一个严重漏洞,影响了文件 api/client/down_file.php 的一个未知功能。攻击者可以通过操纵参数 uuid 发起 SQL 注入攻击。攻击者可以远程发起攻击。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守…...
软考79-上午题-【面向对象技术3-设计模式】-结构型设计模式02
一、组合模式 1-1、意图 将对象组合成树型结构,以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组 合对象的使用具有一致性。 示例:对象:文件、文件夹 1-2、结构 Component 为组合中的对象声明接口;在适…...
前端面试拼图-知识广度
摘要:最近,看了下慕课2周刷完n道面试题,记录并添加部分可参考的文档,如下... 1. 移动端H5 click有300ms延迟, 如何解决? 背景:double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…...
Android 开发 地图 polygon 显示信息
问题 Android 开发 地图 polygon 显示信息 详细问题 笔者进行Android项目开发,接入高德地图绘制区域后,需要在指定区域(位置)内显示文本信息,如何实现 实现效果 解决方案 代码 import com.amap.api.maps.model.T…...
flink1.18.0报错 an implicit exists from scala.Int => java.lang.Integer, but
完整报错 type mismatch;found : Int(100)required: Object Note: an implicit exists from scala.Int > java.lang.Integer, but methods inherited from Object are rendered ambiguous. This is to avoid a blanket implicit which would convert any scala.Int to a…...
掌握C语言结构体,开启编程新世界
✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱博客 所属栏目:C语言 (感谢您的光临,您的光临蓬荜生辉) 前言 前面我们也涉及到了结构体的讲解,但是只是粗略的讲了一下。 接下…...
MICROCHIP微芯 24AA02UIDT-I/OT SOT23 EEPROM
特性: 预编程的32位序列号: 在所有UID系列EEPROM中唯一 可扩展至48位、64位、128位、256位及其 他长度 单电源供电,工作电压低至1.7V 低功耗CMOS技术: -读取电流最大为1mA。 -待机电流最大1A。 2线串行接口,兼容12CTM Schmitt触发输入用于噪声抑制 输出斜…...
前沿AI教材编写工具,低查重生成专业教材,释放创作无限可能!
教材格式的复杂性一直是所有编写者共同面临的问题。从标题的字体大小到层级的划分,再到参考文献的格式,是遵循GB/T7714还是某家出版机构的标准,这些要求常常让人眼花缭乱。习题的排版又应该是单栏还是双栏,这些细节的调整不仅耗时…...
从零构建差速机器人MPC控制器:C++实现与OSQP实战
1. 差速机器人MPC控制入门指南 第一次接触差速机器人控制时,我被各种数学公式和算法绕得头晕。直到发现MPC(模型预测控制)这个神器,才真正体会到什么叫"用未来指导现在"的控制方法。简单来说,MPC就像下棋时提…...
GLM-4.1V-9B-Base效果展示:中文菜单图片→菜品识别→价格/辣度/推荐指数
GLM-4.1V-9B-Base效果展示:中文菜单图片→菜品识别→价格/辣度/推荐指数 1. 模型介绍 GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型,专门针对中文场景下的图像理解任务进行了优化。不同于普通的图像识别模型,它能够结合视觉内容和自…...
蓝牙HC-05调试避坑指南:从AT指令到手机控制LED的完整流程
HC-05蓝牙模块实战指南:从AT指令解析到手机控制LED全流程 当你第一次拿到HC-05蓝牙模块时,是否被那些神秘的AT指令和复杂的配置过程困扰?本文将带你深入HC-05的核心功能,避开那些新手常踩的"坑",实现从基础配…...
从零搞懂Transformer,从位置编码到自注意力,大模型的核心逻辑全拆解
平时我们用ChatGPT聊天、用翻译软件做中英互译、用AI写文案,甚至让AI帮忙编代码,背后最核心的“功臣”,都是2017年Google团队提出的Transformer模型。这个看起来复杂的模型,其实打破了传统AI的局限,靠着高效的计算能力…...
nli-distilroberta-base生产环境:低延迟NLI服务在实时对话系统中的嵌入
nli-distilroberta-base生产环境:低延迟NLI服务在实时对话系统中的嵌入 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的轻量级自然语言推理(NLI)服务,专门为生产环境优化设计。它能快速判断两个句子之间的逻辑关系,为实…...
BilibiliDown:如何高效管理你的B站视频收藏库?
BilibiliDown:如何高效管理你的B站视频收藏库? 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirro…...
Qwen3.5-2B轻量化教程:从模型下载、环境配置到7860界面访问完整链路
Qwen3.5-2B轻量化教程:从模型下载、环境配置到7860界面访问完整链路 1. 前言:认识Qwen3.5-2B轻量化模型 Qwen3.5-2B是Qwen3.5系列中的轻量化多模态基础模型,仅有20亿参数规模,专为低功耗设备优化设计。这个版本特别适合需要在端…...
别再死记硬背公式了!用Python模拟动画带你直观理解雷达的瑞利散射与米散射
用Python动画解密雷达散射:从瑞利到米氏的视觉之旅 当我在大学第一次接触雷达气象学时,那些关于散射理论的数学公式让我头疼不已——直到我发现用代码把它们变成会动的图像。本文将带你用Python重现这个"顿悟时刻",通过动态可视化理…...
