使用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进行控制,在这里就不再赘述。

其开发出来的效果如下:

使用VLC开源库开发播放器相关推荐

  1. 网易云信亮相LiveVideoStackCon2022,解构基于WebRTC的开源低延时播放器实践

    8 月 5 日- 6 日,LiveVideoStackCon 2022 音视频技术大会上海站隆重召开,作为音视频领域颇具影响力的技术大会,此次大会吸引了众多行业专家,融汇新概念.新技术.新趋势和新思想 ...

  2. iOS 开发 - 播放器Demo开发记录

    iOS 开发 - 播放器Demo开发记录 标签: ios 2014-12-22 14:14 518人阅读 评论(0) 收藏 举报  分类: Mac OS X(50)  版权声明:本文为博主原创文章,未 ...

  3. 开源ckplayer 网页播放器, 跨平台 html5 mobile ,flv f4v mp4 rtmp协议

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 开源ck ...

  4. C++基于ffmpeg和QT开发播放器~学习笔记

    C++基于ffmpeg和QT开发播放器 B站网址 https://www.bilibili.com/video/BV1h44y1t7D8?p=2&spm_id_from=pageDriver ...

  5. 乐库网页播放器与动态切换图片新闻

    乐库网页播放器: <html> <head> </head> <body> <script type="text/javascript& ...

  6. 开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !

    开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 ! 博客分类: Javascript /Jque ...

  7. java音乐播放器脚本之家,分享|3 个开源的音乐播放器:Aqulung、Lollypop 和 GogglesMM...

    音乐是生活的一部分.维基百科关于音乐发展历史的文章有这样一段不错的描述说:"全世界所有的人们,包括哪怕是最孤立.与世隔绝的部落,都会有自己的特色音乐--"好吧,我们开源人就构成了一 ...

  8. 【超详细】开源JZVideo饺子播放器播放器配置使用以及其自定义

    文章目录 特点 配置 添加依赖 添加布局 添加逻辑 修改AndroidManifest.xml 小问题 展示图 自定义 自定义UI 编写自定义类 重新应用控件 应用 总结 参考链接 继续找播放器,找到 ...

  9. 软件经验|GDAL空间数据开源库开发介绍

    GDAL(Geospatial Data Abstraction Library)是使用C/C++语言编写的用于读写空间数据的一套跨平台开源库.GDAL库可以读取.写入.转换.处理各种栅格数据格式,它 ...

最新文章

  1. 10种排序算法基础总结
  2. Java程序员从笨鸟到菜鸟之(八十)细谈Spring(九)spring+hibernate声明式事务管理详解
  3. 95-10-170-启动-KafkaRequestHandlerPool
  4. 句句真研—每日长难句打卡Day10
  5. Apple设备的列表中的手机却不能更新iOS 14怎么办
  6. Knockout应用开发指南 第一章:入门
  7. (原創) 這學期C++完美的Ending (C/C++) (日記)
  8. 详解 inner join with another 'dataframe' df1.join(df2, $df1Key === $df2Key)
  9. java毕业生设计药品管理系统演示录像 2021计算机源码+系统+mysql+调试部署+lw
  10. 细说.NET中的多线程 (六 使用MemoryBarrier,Volatile进行同步)
  11. Spring Boot对Ajax跨域访问的支持实现
  12. 计算机电子表格课程导入,又到了每年此刻,教你把课程表导入日历
  13. 以AI赋能企业数智化转型 容联“云端”服贸会完美收官
  14. 如何做一个优秀的团队成员
  15. 五金与机械行业的WMS系统方案
  16. 微信小程序富文本编辑器获取内容
  17. 学java难不难?java应该怎么学?
  18. Python入门(二)之Python的集成开发环境(IDE)
  19. NPOI创建Word
  20. 贝叶斯神经网络BNN

热门文章

  1. 模糊查询 oracle语句,Oracle特殊符号的模糊查询
  2. Python Cartopy地图投影【1】
  3. [转贴]智者的四句箴言
  4. php 防止僵尸程序,PHP多进程编程之僵尸进程问题
  5. 如何使用tar 进行文件归档,看完你就懂了
  6. 程序员女装史——从入门到穿女装,到底发生了什么?
  7. scp命令的使用方法
  8. 用Python批量重命名文件
  9. iOS学习之键盘设置以及IQKeyboardManager
  10. 微信小程序动画(七):让页面动起来