在前面的章节中,我们曾说过 libVLC 是异步播放的。也就是说,无法立刻得到要想的结果(例如:媒体时长),倘若要获取这些信息,必须通过事件通知和回调来实现。

1

基本步骤

1. 创建事件管理器 - libvlc_event_manager_t,可选的方式有:

  • libvlc_media_event_manager():媒体相关的事件管理器。

    比如,要监听媒体的改变状态(libvlc_MediaStateChanged),就需要用到它。

  • libvlc_media_list_event_manager():媒体列表相关的事件管理器。

    比如,要监听媒体列表停止(libvlc_MediaListPlayerStopped),就需要用到它。

  • libvlc_media_player_event_manager():播放器相关的事件管理器。

    比如,要监听播放器的音量(libvlc_MediaPlayerAudioVolume),就需要用到它。

2. 通过 libvlc_event_attach() 订阅所感兴趣的事件,如果要退订事件,可使用 libvlc_event_detach()。

3. 编写事件处理程序(回调函数),在里面处理所订阅的各个事件。

libVLC 的事件类型有很多,具体可参考 LibVLC asynchronous events(详见:https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__event.html)。

2

实现方式

以一个网络流为例,来获取播放器的位置、最新时长和总时长。

首先,要创建一个事件列表,并订阅它们。需要注意的是 libvlc_event_attach(),它的最后一个参数是用户数据,这里暂时没有用到,所以指定为 nullptr:

void attachEvents(libvlc_event_manager_t *eventManager){    // 事件列表    list events = {        libvlc_MediaPlayerPositionChanged,        libvlc_MediaPlayerTimeChanged,        libvlc_MediaPlayerLengthChanged    };// 订阅事件for (const libvlc_event_e &e : events) {        libvlc_event_attach(eventManager, e, handleEvents, nullptr);    }}

然后,在事件处理程序(回调函数)中处理它们。对于每一个事件(例如:libvlc_MediaPlayerPositionChanged)来说,都有一个结构体(例如:media_player_position_changed)与之对应,通过它便能很容易地访问具体的信息了:

static void handleEvents(const libvlc_event_t *event, void *userData){    switch (event->type) {    case libvlc_MediaPlayerPositionChanged:        cout <"Position: " <u.media_player_position_changed.new_position <endl;        break;    case libvlc_MediaPlayerTimeChanged:        cout <"New Time: " <u.media_player_time_changed.new_time <endl;        break;    case libvlc_MediaPlayerLengthChanged:        cout <"Length: " <u.media_player_length_changed.new_length <endl;        break;    default:        break;    }}

最后,是对上述实现的具体调用,来一起看看吧:

int main(){    const char * rtspMrl = "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov";

    libvlc_instance_t *instance;    libvlc_media_player_t *player;    libvlc_media_t *media;    libvlc_event_manager_t *eventManager;

    instance = libvlc_new(0, nullptr);    media = libvlc_media_new_location(instance, rtspMrl);    player = libvlc_media_player_new_from_media(media);

    // 创建事件管理器    eventManager = libvlc_media_player_event_manager(player);    // 订阅事件    attachEvents(eventManager);

    libvlc_media_player_play(player);    waitPlaying(player);

    libvlc_media_release(media);    libvlc_media_player_release(player);    libvlc_release(instance);

    return 0;}

3

测试程序

运行程序,可以看到播放位置和时长在实时改变,如下所示:

如果想获取更多的媒体信息,方法与上述实现类似。

·END·

作者:一去、二三里爱学习,爱编程,爱生活。欢迎来撩,一起畅谈程序人生!

点个在看,么么哒!

.net from 关闭事件_libVLC 事件机制相关推荐

  1. Java中事件监听机制

    Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...

  2. 关于事件监听机制的总结(Listener和Adapter)

    记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.) 附上事件监听机制的分析图: 一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以 ...

  3. spring中的事件监听机制

    Spring event listener 介绍 example 简单原理解释 自定义事件.监听和发布 事件 监听器 发布者 测试 更加一般的事件 @EventListener原理 介绍 exampl ...

  4. Spring容器的事件监听机制(简单明了的介绍)

    文章目录 前言 事件 1. 定义事件 2. 定义监听器 3. 定义发布器 Spring容器的事件监听机制 1.事件的继承类图 监听器的继承类图 总结 前言 上一篇我们介绍了SpringFactorie ...

  5. Springboot事件监听机制:工作原理

    目录 前言 1.观察者模式 1.1观察者模式的核心元素 1.2观察者模式的工作流程 2.springboot事件监听机制的基本工作原理 2.1事件发布器是什么时候在哪里产生的呢? 2.2事件监听器是什 ...

  6. Node中的事件轮询机制

    文章目录 2 node中的事件循环模型 2-1 一些属性 2-2 循环模型 node事件循环总共有==六个阶段== process.nextTick()函数 __实例__ 2 node中的事件循环模型 ...

  7. nodejs的事件轮询机制

    /* 面试题:nodejs的事件轮询机制*/setTimeout(function() {console.log('setTimeout()') }, 0)setImmediate(function( ...

  8. JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件

    JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...

  9. JavaScript学习笔记(五)---cookie、Proxy、服务器、PHP语言、http协议、同步异步、事件轮循机制、ajax编写、接口

    JavaScript学习笔记(五)---cookie.Proxy.服务器.PHP语言.http协议.同步异步.事件轮循机制.ajax编写.接口 1.cookie 1.1cookie概念 1.2cook ...

  10. java中事件监听_Java中的事件监听机制

    鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...

最新文章

  1. 青出于蓝而胜于蓝,这是一款脱胎于 Jupyter Notebook 的新型编程环境
  2. 团队项目-个人博客-4.20
  3. 8.2 动力系统的贝叶斯推理
  4. 在MonoTouch中正确而简单的使用 Sqlite 数据库
  5. javascript小游戏_javaScript小游戏——网页版别踩白块
  6. nvarchar转换为numeric时出错_Oracle转换Postgres
  7. aspjpeg已过期_Persits.Jpeg.1错误’800a0004′ AspJpeg组件过期解决方法 - YangJunwei
  8. 如何在ASP.NET Core中上传文档
  9. 磁盘IO单线程顺序写时最快的,如果多线程写,磁盘的磁头要不断重新寻址,所以写入速度反而会慢...
  10. Java23种设计模式(一)
  11. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by (转)
  12. centos7安装mysql教程详解(含常见问题的解决方案)
  13. html设置背景图片自动适应屏幕大小,css适应屏幕 CSS背景图片自适应屏幕大小
  14. 如何将超大文件传输给别人,超大文件如何传输
  15. Excel 从入门到精通免费视频教程-值得收藏
  16. 人工智能、机器学习和模式识别以及神经网络
  17. Makefile:14: config-host.mak: No such file or directory
  18. 一个大牛的acm历程(看着就要颤抖)
  19. 用python输出所有的玫瑰花数_python玫瑰花
  20. “当智慧遇见极简”,锐捷与千位信息化大咖共话智慧校园极简之道

热门文章

  1. cocoa设计模式笔记
  2. MG3000系列设备IP修改内容
  3. mac上配置rails开发环境
  4. WM 仓库管理T-CODE
  5. 将C#的Dic转成Lua的Table将C#的List转成Lua的Table
  6. 面向对象的超级面试题,涉及封装多态继承等多方面考核,异常烧脑,90%的面试官必问题目,不会这个的,只是会搬砖的码农
  7. JAVA构造方法与构造方法的执行原理简单理解(栈与堆)
  8. python数据分析 制图_Python与开源GIS:数据处理、空间分析与地图制图
  9. nodejs mysql 执行多条sql语句
  10. 疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)