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目录和动态库拷贝到运行目录,才能够运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java instanceof

目录 简介 示例 注意事项 应用场景 简介 instanceof 是 Java 的保留关键字也称为类型比较运算符&#xff0c;因为它将实例与类型进行比较它的作用是测试它左边的对象是否是它右边的类的实例&#xff0c;返回 boolean 的数据类型instanceof是Java中的二元运算符&#xff0c…

海外代理IP在跨境电商中的五大应用场景

在我国跨境电商的发展中&#xff0c;海外代理IP的应用日益广泛&#xff0c;它不仅帮助商家成功打入国际市场&#xff0c;还为他们在多变的全球电商竞争中保持优势。下面是海外代理IP在跨境电商中五个关键的应用场景。 1、精准的市场分析 了解目标市场的消费者行为、产品趋势以…

[蓝桥杯 2023 省 B] 飞机降落(暴搜DFS+贪心)

总结&#xff1a;为什么你看到题想不出来怎么写呢&#xff0c;我想不到这道题还会用到dfs的思想&#xff0c;顶多能知道可能会有贪心&#xff0c;还是得多做题。 这道题让我想起来导弹拦截和借教室&#xff0c;记得有空做做&#xff01;&#xff01;不要研究难题&#xff0c;把…

打造专属云存储:私有Docker Registry全面解读与实战部署

在容器技术大行其道的今天&#xff0c;Docker Registry作为容器镜像的中央仓库&#xff0c;扮演着至关重要的角色。当公开的官方镜像库无法满足企业对安全性、可控性及定制化的需求时&#xff0c;搭建私有Docker Registry就显得尤为必要。本文旨在深入剖析私有Docker Registry的…

题目15—三数之和

题目来源于LeetCode 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重…

2000-2021年各省社会消费水平数据(原始数据+计算结果)(无缺失)

2000-2021年各省社会消费水平数据&#xff08;原始数据计算结果&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;各省年鉴、国家统计局 3、范围&#xff1a;31省 4、指标&#xff1a;社会消费品零售总额&#xff08;亿元&a…

Echarts横向柱形图

项目原型图如下: 实际上就是设置两个y轴&#xff0c;第一个显示底色柱子&#xff0c;另一个只显示真实数据的柱子,在这里只显示y轴,x轴不显示.. this.middleLeftOption {tooltip: {trigger: axis,axisPointer: {}},legend: {data: [回退次数],y: bottom},grid: {left: 3%,righ…

国内 AI 工具集

序号 类型 AI工具名称 入口 功能 聊天/内容生成 1 文心一言 https://yiyan.baidu.com 综合型AI&#xff1a;内容生成、文档分析、图像分析、图表制作、脑图…… 2 通义千问 https://tongyi.aliyun.com 综合型AI&#xff1a;内容生成、文档分析、图像分析…… 3 Kimi(月之暗面…

理论学习:with torch.no_grad()

如果不加上“with torch.no_grad():”&#xff0c;模型参数会发生改变吗&#xff1f; 如果不使用with torch.no_grad():&#xff0c;在进行模型推理&#xff08;即计算outputs_cls net(inputs[batch_size//2:])这一步&#xff09;时&#xff0c;模型参数不会发生改变&#xf…

JAVA实战手册-开篇总述

该专题以实战为出发点&#xff0c;总结概述了实际工作中常用的java知识点&#xff0c;掌握了这些知识点&#xff0c;日常工作开发以及面试都不在话下。 话不多说&#xff0c;直入正题&#xff0c;以下为JAVA知识点概括总结&#xff08;总计涵盖了10大类78小项&#xff09; 针对…

关于防火墙

文章目录 一、安全技术和防火墙1、安全技术2、防火墙的分类2.1 按保护范围划分2.2 按实现方式划分2.3 按网络协议划分2.3.1 包过滤防火墙2.3.2 应用层防火墙 二、Linux 防火墙的基本认识1、Netfilter2、防火墙工具介绍2.1 Iptables2.2 Firewalld2.2.1 软件包2.2.2 管理工具 2.3…

【企业战略转型】某音响制造公司发展战略转型管理咨询项目纪实

案例&#xff1a;【客户评价】日本M汽车音响有限公司田总经理&#xff1a;受经济大环境的影响&#xff0c;我公司原有的依赖企业下订单的业务模式受到很大的影响&#xff0c;企业进入“不进则退”的重要转型阶段。当企业生存的关键因素&#xff0c;我们作为典型的OEM汽车音响代…

利用Python爬虫获取xx数据

目录 一、前言 二、requests 请求库 1、requests 安装 2、requests 的基本使用 三、Beautiful Soup 1、Beautiful Soup 安装 2、BeautifulSoup对象介绍与创建 3、BeautifulSoup对象的find方法 四、总结 一、前言 什么是爬虫&#xff1f; 网络爬虫&#xff08;又被称为…

Hack The Box-Devvortex

目录 信息收集 nmap whatweb WEB web信息收集 wfuzz 漏洞探索 漏洞发现 反弹shell 提权 get user hashcat get root 信息收集 nmap 端口信息收集┌──(root?ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.242 --min-rate 10000 Starting Nmap 7…

python基于vue考试分析系统的设计和实现-flask-django-nodejs-php

接着&#xff0c;本文还讨论了该系统的设计目的&#xff0c;还讨论了系统的需求&#xff0c;并提出了整体的设计方案。对于该系统的设计和实现&#xff0c;也都进行了较为详细的讨论&#xff0c;并在此基础上&#xff0c;对考试分析系统系统展开了一些具体的测试。随着电子技术…

解决IDEA创建SpringBoot项目没有Java版本8

原因&#xff1a; spring2.X版本在2023年11月24日停止维护了&#xff0c;因此创建spring项目时不再有2.X版本的选项&#xff0c;只能从3.1.X版本开始选择 而Spring3.X版本不支持JDK8&#xff0c;JDK11&#xff0c;最低支持JDK17&#xff0c;因此JDK11也无法选择了 当然&…

【代码】YOLOv8标注信息验证

此代码的功能是标注信息验证&#xff0c;将原图和YOLOv8标注文件&#xff08;txt&#xff09;放在同一个文件夹中&#xff0c;作为输入文件夹 程序将标注的信息还原到原图中&#xff0c;并将原图和标注后的图像一同保存&#xff0c;以便查看 两个draw_labels函数&#xff0c;分…

[Linux] 进程间通信基础

&#x1f4bb;文章目录 &#x1f4c4;前言进程间通信基础概念 管道概念管道的工作原理模拟实现shell中的管道 共享内存概念接口的介绍共享内存的使用 &#x1f4d3;总结 &#x1f4c4;前言 你是否了解进程间是如何通信的呢&#xff1f;你是否知道管道的工作原理呢&#xff1f;管…

关于Web端 —— UI自动化测试

在手工测试阶段&#xff0c;针对项目输出了测试用例&#xff0c;如果这些测试用例需要在版本迭代的过程中&#xff0c;需要进行回归测试&#xff0c;通过手工重复地执行测试用例&#xff0c;将会耗费大量的人力。 为此应运而生就有了自动化测试&#xff0c;通过使用自动化工具…

【docker】Docker打包SpringBoot镜像

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 前置说明 最为原始的打包方式spring-boot-maven-plugin插件jib-maven-plugin插件dockerfle-maven-plugin插件 最为原始的方式 也就是使用Docker的打…