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;