使用VLC开源库开发播放器

2023-11-10

使用VLC开发播放器,分为如下几步:

1. 下载VLC开源库

下载VLC开源库,可在官网上下载,

地址如下:http://download.videolan.org/pub/videolan/vlc/

可以在该网站下载想要的版本(32位或64位,Release或Debug等)

 

2. 建立项目工程以及相关播放界面开发

以建立Qt项目为例,根据VS向导进行创建工程,并通过Qt的Designer布局绘制播放的窗口(其他如MFC界面库同理,根据VS向导生成),这里主要是通过界面要拿到播放窗口的句柄,供图像的绘制。

 

3. 配置开发环境

注:本教程配置的VS环境,如果是Linux环境,请自行配置环境变量和链接路径。

前提:将VLC的库和头文件放在.sln同级目录下的VlcSDK目录下

首先,需要在工程属性中,C/C++ > 常规 > 附加包含目录中添加 $(SolutionDir)VlcSDK供编译时能够找到VLC的相关头文件。

其次,需要配置链接时的库目录和库文件,需要在工程属性中,链接器 > 常规 中添加$(SolutionDir)VlcSDK供链接时能够找到相关的.lib文件,还需要在 链接器 > 输入 中添加libvlc.lib和libvlccore.lib 文件供链接使用(注意:该方式为静态链接动态库,也可以通过动态链接动态库的方式,此时就不要想配置链接库目录和链接库lib文件了)。

如下图:

 

4. VLC的API查找与使用

使用Vlc开源库的主要API如下:

//创建实例,引入头文件#include "vlc/vlc.h"

m_vlcInstance = libvlc_new(0, NULL);

 

//创建媒体对象实例以及传入播放文件的路径

libvlc_media_t* media = libvlc_media_new_path(m_vlcInstance, filepath.toUtf8().data());

 

//创建播放器实例

libvlc_media_player_t* mediaPlayer = libvlc_media_player_new_from_media(media);

 

//设置事件回调

libvlc_event_manager_t *em = libvlc_media_player_event_manager(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);

其中vlcEvents 为回调函数,原形为void vlcEvents(const libvlc_event_t *ev, void *param);可根据ev->type判断当前播放的状态,如libvlc_MediaPlayerStopped、libvlc_MediaPlayerPaused、libvlc_MediaPlayerEndReached等等状态。

 

//设置播放比例与播放窗口的句柄

        libvlc_video_set_aspect_ratio(mediaPlayer, "1:1");

        libvlc_video_set_mouse_input(mediaPlayer, false);

        libvlc_video_set_key_input(mediaPlayer, false);

libvlc_media_player_set_hwnd(mediaPlayer, (void *)wid);

注:上述wid为播放窗口的句柄;设置libvlc_video_set_mouse_input(mediaPlayer, false);和libvlc_video_set_key_input(mediaPlayer, false);即表示vlc不接收键盘事件和鼠标事件,只有这样设置,才不影响我们自己通过接收鼠标和键盘控制相关操作,否则,自己没发控制对播放界面的操作,包括双击放大,右键菜单等等。

 

5. 运行控制与释放

运行程序后,可通过如下API进行控制操作:

//开始播放
libvlc_media_player_play(mediaPlayer);

//暂停播放

libvlc_media_player_set_pause(mediaPlayer);

//停止播放

libvlc_media_player_stop(mediaPlayer);

//判断是否正在播放

libvlc_media_player_is_playing(mediaPlayer);

 

推出程序或切换播放实例时,需要释放之前创建的实例,注意调用如下API:

libvlc_media_release(media);

libvlc_media_player_release(mediaPlayer);

libvlc_release(m_vlcInstance);

以上释放操作,需要先调用停止播放的接口,将播放中的播放器停止后,才能释放相关实例。

 

6. 完成以上操作后,基本的播放器即已成型,接下来就是都界面的各种美化以及操作的各种完善,例如:播放进度可通过libvlc_time_t libvlc_media_player_get_length( libvlc_media_player_t *p_mi );libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi );以及void libvlc_media_player_set_time( libvlc_media_player_t *p_mi, libvlc_time_t i_time );等API进行控制,在这里就不再赘述。

 

其开发出来的效果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用VLC开源库开发播放器 的相关文章

  • httpclient下载文件

    private static CloseableHttpClient client static PoolingHttpClientConnectionManager connectionManager new PoolingHttpCli
  • 抓httpclient发送的http请求包

    1 使用fiddler或者Charles抓不到httpclient发送的http请求包 2 需要使用以下代码 HttpHost proxy new HttpHost 127 0 0 1 8888 http 127 0 0 1 8888地址为
  • 大数据:HDFS的Shell常用命令操作

    文章目录 一 HDFS的Shell介绍 二 HDFS常用命令操作 01 创建目录 1 创建单层目录 3 创建多层目录 02 查看目录 03 上传本地文件到HDFS 04 查看文件内容 05 下载HDFS文件到本地 06 删除HDFS文件 0
  • char、varchar、nchar、nvarchar的区别

    对于程序中的string型字段 SQLServer中有char varchar nchar nvarchar四种类型来对应 暂时不考虑text和ntext 开建立数据库中 对这四种类型往往比较模糊 这里做一下对比 定长或变长 所谓定长就是长

随机推荐

  • 阿里巴巴面试总结:测试工程师

    阿里巴巴的面试是网上预约的时间 武汉一共有两天 五号和六号 原先是担心自己准备的不够充分 就把时间往后面移 最后定的是六号的下午四点半到六点的场 基本也就是武汉的最后一场 后来才发现 武汉可以说的上是全国比较晚面试的了 而今年马云又放出了风
  • 自然语言处理面试34题:NLP面试考点,精准详尽解析

    篇幅有限 本文不会把每一题的参考答案都加载出来 会摘出一些摘要 完整解析见题库 添加老师微信 julyedukefu14 回复 6 领取最新升级版 名企AI面试100题 电子书 1 了解Google最新的模型bert么 Google AI
  • 天空图立方体贴图转化为辐照度立方体贴图

    创建立方体贴图 注意 立方体贴图的大小决定被转化的辐照度贴图的精度 irradianceCubeMap new CubeMap 32 调用 CubeMap CubeMap int CubeSize CubeSize CubeSize ini
  • 一文带你读懂聚类

    1 聚类思想 作为无监督学习的一个重要方法 聚类是将样本集D划分为若干互不相交的子集 即样本簇 聚类的思想就是把属性相似的样本归到一类 对于每一个数据点 我们可以把它归到一个特定的类 同时每个类之间的所有数据点在某种程度上有着共性 比如空间
  • 写给程序员的机器学习入门 (四) - 训练过程中常用的技巧

    人工智能学习离不开实践的验证 推荐大家可以多在FlyAI AI竞赛服务平台多参加训练和竞赛 以此来提升自己的能力 FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台 每周免费提供项目开源算法样例 支持算法能力变现以及快
  • python手机端下载-Python3,x:如何进行手机APP的数据爬取

    Python3 x 如何进行手机APP的数据爬取 一 简介 平时我们的爬虫多是针对网页的 但是随着手机端APP应用数量的增多 相应的爬取需求也就越来越多 因此手机端APP的数据爬取对于一名爬虫工程师来说是一项必备的技能 我们知道 网页爬取的
  • SQLI-LABS Less-17

    Update 数据库更新注入 具体情况 具体分析 函数 check input 对 uname 进行检查 从 uname 处是无法注入了 而对 passwd 进行了更新 可以利用这个 updata 进行注入 注意 这里必须的 uname 必
  • 因为计算机中丢失VCRUNTIME140怎么办?为什么会丢失VCRUNTIME140.dll

    vcruntime140 dll是一个Windows动态链接库 其主要功能是为C C 编译的程序提供运行时支持 这个库在Microsoft Visual Studio 2015中被引入 其名称中的 140 代表版本号 在我们打开运行软件或者
  • MySQL的索引类型和实现原理

    一 按表列属性分类 1 单列索引 以表的单个列字段创建的索引 2 联合索引 以表的多个列字段组合创建的索引 在查询条件使用索引的从左字段顺序才会生效 遵循最左匹配原则 单列索引和联合索引又包括 普通索引 非主键 非唯一列的索引 主键索引 基
  • 计蒜客T1115——字符串判等

    水题不解释 考研复习压力偶尔写一道换换心情还不错 这里有一个比较有趣的知识点 对于同时输入多个字符串时还要允许空格的输入 那么普通的cin函数就不能满足要求了 这里采用getline函数解决 如下 string s1 s2 getline
  • Docker基本命令使用——(1)

    Docker常用命令 docker images 列出本地主机上的镜像 a 列出本地所有的镜像 含中间映像层 q 只显示镜像ID digests 显示镜像的摘要信息 no trunc 显示完整的镜像信息 docker search xxx
  • 3000帧动画图解MySQL为什么需要binlog、redo log和undo log

    全文建立在MySQL的存储引擎为InnoDB的基础上 先看一条SQL如何入库的 这是一条很简单的更新SQL 从MySQL服务端接收到SQL到落盘 先后经过了MySQL Server层和InnoDB存储引擎 Server层就像一个产品经理 分
  • produces在@requestMapping中的使用方式和作用

    转载自 https blog csdn net jaryle article details 72965885 produces可能不算一个注解 因为什么呢 它是注解 requestMapping注解里面的属性项 它的作用是指定返回值类型
  • 1787.使所有区间的异或结果为零

    题意 给你一个整数数组 nums 和一个整数 k 区间 left right left lt right 的 异或结果 是对下标位于 left 和 right 包括 left 和 right 之间所有元素进行 XOR 运算的结果 nums
  • ROS 仿真

    欢迎访问我的博客首页 ROS仿真 1 依赖与官方包 参考 1 依赖与官方包 我们需要一些 ROS 官方给出的包 可以使用 apt 命令安装 也可以下载源码编译 编译这些包需要用到的依赖及其安装方法是 sudo apt get install
  • 记一次线程爆满导致服务器崩溃的问题排查

    记一次线程爆满导致服务器崩溃的问题排查 1 重启服务器 2 修改最大线程数 3 查找线程最大的java程序 4 导出问题程序的线程日志 5 找到问题代码 6 解决方案 问题介绍 测试服务器突然无法连接 ssh登录不上 只有重启才能解决 重启
  • Redis第七讲 Redis存储模型详解

    Redis存储模型 每次在Redis数据库中创建一个键值对时 至少会创建两个对象 一个是键对象 一个是值对象 而Redis中的每个对象都是由 redisObject 结构来表示 redisObject的结构与对象类型 内存编码 内存回收 共
  • SDA、SFDA、CFDA改名为NMPA

    再见CFDA 国家药监局英文简称改为NMPA 通知公告 1 新成立的国家药品监督管理局 是否还监管食品 答 国家药品监督管理局作为新组建的政府部门 隶属于新成立的国家市场监督管理总局 相比较原来的国家食品药品监督管理总局 国家药品监督管理局
  • JavaScript与生俱来的特性---异步与回调

    线程是建立在进程的基础上的一次程序运行单位 一个进程中可以有多个线程 js单线程就意味着 所有任务需要排队 前一个任务结束 才会执行后一个任务 如果前一个任务耗时很长 后一个任务就不得不一直等着 如果是因为计算量大 CPU忙不过来 倒也合乎
  • 使用VLC开源库开发播放器

    使用VLC开发播放器 分为如下几步 1 下载VLC开源库 下载VLC开源库 可在官网上下载 地址如下 http download videolan org pub videolan vlc 可以在该网站下载想要的版本 32位或64位 Rel