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.示例

cpp 复制代码
#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;

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

编译错误解决:

cpp 复制代码
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2065: "libvlc_media_read_cb": 未声明的标识符
\VLC\sdk\include\vlc/libvlc_media.h(368): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2513: "int": 在"="前没有声明变量
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2143: 语法错误: 缺少";"(在"("的前面)
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2062: 意外的类型"void" 
\VLC\sdk\include\vlc/libvlc_media.h(478): error C2061: 语法错误: 标识符"libvlc_media_read_cb"
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2065: "libvlc_media_read_cb": 未声明的标识符
\VLC\sdk\include\vlc/libvlc_media.h(368): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2513: "int": 在"="前没有声明变量
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2143: 语法错误: 缺少";"(在"("的前面)
\VLC\sdk\include\vlc/libvlc_media.h(368): error C2062: 意外的类型"void" 
\VLC\sdk\include\vlc/libvlc_media.h(478): error C2061: 语法错误: 标识符"libvlc_media_read_cb"

打开vlc.h加上: typedef __int64 ssize_t;

相关推荐
安步当歌1 小时前
【WebRTC】视频编码链路中各个类的简单分析——VideoStreamEncoder
音视频·webrtc·视频编解码·video-codec
顾北川_野1 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
顶呱呱程序1 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
苏三有春2 小时前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt
EasyCVR2 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
runing_an_min2 小时前
ffmpeg 视频滤镜:屏蔽边框杂色- fillborders
ffmpeg·音视频·fillborders
Vanranrr2 小时前
C++ QT
java·c++·qt
兆。2 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
徒步僧13 小时前
ThingsBoard规则链节点:RPC Call Reply节点详解
qt·microsoft·rpc
可峰科技14 小时前
斗破QT编程入门系列之一:认识Qt:初步使用(四星斗师)
开发语言·qt