首页 > 其他分享 >libVLC 事件机制

libVLC 事件机制

时间:2024-03-19 20:04:01浏览次数:19  
标签:libvlc showWidget media vlc libVLC 事件 机制 event

1.简介

libVLC是一个开源的多媒体框架,它提供了丰富的功能,其中包括一个灵活且强大的事件机制。在libVLC中,事件机制主要用于通知应用程序有关播放、媒体状态更改或其他重要事件的信息。

libVLC的事件模型基于订阅-发布模式,主要包含以下关键组件:

  • 事件类型(libvlc_event_type_t):定义了一系列预定义的事件,如媒体打开、播放、暂停、停止、结束等。

  • 事件管理器(libvlc_event_manager_t):每个libVLC对象(如媒体播放器、媒体列表等)都有一个关联的事件管理器,用于注册和触发事件。

  • 注册事件监听器(libvlc_event_attach):应用程序通过调用此函数来订阅特定类型的事件,并提供一个回调函数,当该事件发生时,libVLC会调用这个回调函数。

  • 事件解注册(libvlc_event_detach):当不再需要监听某个事件时,可以调用此函数取消对该事件的订阅。

2.事件的类型

enum libvlc_event_e {
    /* Append new event types at the end of a category.
     * Do not remove, insert or re-order any entry.
     * Keep this in sync with lib/event.c:libvlc_event_type_name(). */
    libvlc_MediaMetaChanged=0,
    libvlc_MediaSubItemAdded,
    libvlc_MediaDurationChanged,
    libvlc_MediaParsedChanged,
    libvlc_MediaFreed,
    libvlc_MediaStateChanged,
    libvlc_MediaSubItemTreeAdded,

    libvlc_MediaPlayerMediaChanged=0x100,
    libvlc_MediaPlayerNothingSpecial,
    libvlc_MediaPlayerOpening,
    libvlc_MediaPlayerBuffering,
    libvlc_MediaPlayerPlaying,
    libvlc_MediaPlayerPaused,
    libvlc_MediaPlayerStopped,
    libvlc_MediaPlayerForward,
    libvlc_MediaPlayerBackward,
    libvlc_MediaPlayerEndReached,
    libvlc_MediaPlayerEncounteredError,
    libvlc_MediaPlayerTimeChanged,
    libvlc_MediaPlayerPositionChanged,
    libvlc_MediaPlayerSeekableChanged,
    libvlc_MediaPlayerPausableChanged,
    libvlc_MediaPlayerTitleChanged,
    libvlc_MediaPlayerSnapshotTaken,
    libvlc_MediaPlayerLengthChanged,
    libvlc_MediaPlayerVout,
    libvlc_MediaPlayerScrambledChanged,
    libvlc_MediaPlayerESAdded,
    libvlc_MediaPlayerESDeleted,
    libvlc_MediaPlayerESSelected,
    libvlc_MediaPlayerCorked,
    libvlc_MediaPlayerUncorked,
    libvlc_MediaPlayerMuted,
    libvlc_MediaPlayerUnmuted,
    libvlc_MediaPlayerAudioVolume,
    libvlc_MediaPlayerAudioDevice,
    libvlc_MediaPlayerChapterChanged,

    libvlc_MediaListItemAdded=0x200,
    libvlc_MediaListWillAddItem,
    libvlc_MediaListItemDeleted,
    libvlc_MediaListWillDeleteItem,
    libvlc_MediaListEndReached,

    libvlc_MediaListViewItemAdded=0x300,
    libvlc_MediaListViewWillAddItem,
    libvlc_MediaListViewItemDeleted,
    libvlc_MediaListViewWillDeleteItem,

    libvlc_MediaListPlayerPlayed=0x400,
    libvlc_MediaListPlayerNextItemSet,
    libvlc_MediaListPlayerStopped,

    /**
     * \deprecated Useless event, it will be triggered only when calling
     * libvlc_media_discoverer_start()
     */
    libvlc_MediaDiscovererStarted=0x500,
    /**
     * \deprecated Useless event, it will be triggered only when calling
     * libvlc_media_discoverer_stop()
     */
    libvlc_MediaDiscovererEnded,

    libvlc_RendererDiscovererItemAdded,
    libvlc_RendererDiscovererItemDeleted,

    libvlc_VlmMediaAdded=0x600,
    libvlc_VlmMediaRemoved,
    libvlc_VlmMediaChanged,
    libvlc_VlmMediaInstanceStarted,
    libvlc_VlmMediaInstanceStopped,
    libvlc_VlmMediaInstanceStatusInit,
    libvlc_VlmMediaInstanceStatusOpening,
    libvlc_VlmMediaInstanceStatusPlaying,
    libvlc_VlmMediaInstanceStatusPause,
    libvlc_VlmMediaInstanceStatusEnd,
    libvlc_VlmMediaInstanceStatusError
};

找几个常用的事件,如下所示。

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;
	}

3.代码示例

#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_OBJECT

public:
    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;
};



#include "showWidget.h"
#include <QTimer>

#pragma execution_character_set("utf-8")

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;
	}

	// 创建libvlc实例和媒体播放器
	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;
	}
}

标签:libvlc,showWidget,media,vlc,libVLC,事件,机制,event
From: https://blog.csdn.net/wzz953200463/article/details/136853007

相关文章

  • 3. 注意力机制
    深度学习中的注意力机制(AttentionMechanism)是一种模仿人类视觉和认知系统的方法,它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制,神经网络能够自动地学习并选择性地关注输入中的重要信息,提高模型的性能和泛化能力。最典型的注意力机制包括自注意力机......
  • openGauss Copy接口支持容错机制
    Copy接口支持容错机制可获得性本特性自openGauss1.0.0版本开始引入。特性简介支持将Copy过程中的部分错误导入到指定的错误表中,并且保持Copy过程不被中断。客户价值提升Copy功能的可用性和易用性,提升对于源数据格式异常等常见错误的容忍性和鲁棒性。特性描述openGauss提......
  • DOM事件流
      DOM事件流描述了在HTML文档中,事件是如何从触发元素传播到文档根节点的过程。DOM事件流  DOM事件流分为三个阶段:捕获阶段(CapturingPhase)、目标阶段(TargetPhase)和冒泡阶段(BubblingPhase)。捕获阶段(CapturingPhase):事件从文档根节点开始向下传播,经过父级元素直到......
  • langchain chatchat运行机制源码解析
    langchainchatchat的简介就不多说了,大家可以去看github官网介绍,虽然当前版本停止了更新,下个版本还没有出来,但作为学习还是很好的。一、关键启动过程:1、start_main_server入口2、run_controller启动fastchatcontroller端口200013、run_openai_api启动fastchat对外提供的类......
  • elementUI中点击触发两次点击事件原理及解决方法
    ​ 最近在研究vue3,在学习vue3和element-plus的过程中,突然发现el-radio的一个问题,element的版本号如下"element-plus":"2.2.27",​ 代码如下:<template> <divclass="button-group"><el-radio-groupv-model="buttonGroup">......
  • python垃圾回收机制
    Python中的垃圾回收机制是自动的,它主要使用了引用计数来追踪和回收内存。1、引用计数当一个对象被创建时,就会被分配一块内存,然后将其引用计数设置为1。当另一个变量引用该对象时,引用计数就会增加1。当一个对象的引用计数变为0时,说明该对象没有任何引用,Python解释器就会将......
  • Python环境下基于注意力机制的小样本轴承故障诊断
    传统的基于特征提取与分类相结合的轴承智能诊断算法,对信号处理要求很高的专家经验,既费时又缺乏通用性。基于深度学习的智能轴承故障诊断方由于具有强大的特征提取能力,避免了繁琐复杂的特征提取工作,但是大多数研究都是在标准数据集下进行的,这意味着模型能够使用足量的数据进行训......
  • Mysql之刷盘机制
    一、刷盘机制总览刷盘过程mysql刷脏数据在写redo之后,逻辑跟oracle一致。checkpoint/commit->内存中的redo到redolog文件->内存中的脏数据到数据盘。但是mysql多一个环节,就是把binlog从binlogcache写入到binlog文件中。binlogcache不是共享内存,是为每个client分......
  • matinal:SAP ABAP OO面向对象编程中的触发和处理事件
    ......
  • 深入理解 C# Unity 中的事件和委托
    事件和委托是C#Unity游戏开发中的基本概念,可实现游戏不同部分之间的通信和交互。在本文中,我们将以简单的术语探讨这些概念,以帮助Unity项目中利用它们发挥应有的作用目录事件和委托:1.什么是C#事件?2、声明:3.订阅活动:4.发布活动:5.......