播放器功能及效果图
- 文件选择
- 开始、暂停、停止
- 倍率
- 进度条显示
- 文件定位播放
- 支持鼠标双击全屏
libvlc环境
- 下载网址
Index of /pub/videolan/vlc/last/
- 解压缩后sdk目录为开发目录,将plugins目录及libvlc.dll、libvlccore.dll放到运行环境下
代码实现简单播放器
- 包含LIBVLC头文件
包含vlc.h之前需先定义ssize_t,否则会编译错误
typedef __int64 ssize_t;
#include "vlc/vlc.h"
- 链接库
- 代码实现
class VLCPlayer : public QWidget
{
Q_OBJECT
public:
VLCPlayer(QWidget *parent = nullptr);
~VLCPlayer();
Q_INVOKABLE void onVlcMediaPlayerPlaying();
Q_INVOKABLE void onVlcMediaPlayerTimeChanged();
Q_INVOKABLE void onVlcMediaPlayerEndReached();
Q_INVOKABLE void onVlcMediaPlayerStopped();
private Q_SLOTS:
void on_btnOpen_clicked();
void on_btnPlay_clicked();
void on_btnStop_clicked();
void on_horizontalSliderPlayer_valueChanged(int value);
void on_comboBoxRate_currentTextChanged(const QString& text);
protected:
void resizeEvent(QResizeEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
private:
static void vlcEvents(const libvlc_event_t* ev, void* param);
void setVideoAspectRatio(bool aspectRatio = true);
private:
Ui::VLCPlayerClass *ui;
libvlc_instance_t* m_vlcBase = nullptr;
libvlc_media_t* m_vlcMedia = nullptr;
libvlc_media_player_t* m_vlcMediaPlayer = nullptr;
};
VLCPlayer::VLCPlayer(QWidget *parent)
: QWidget(parent)
, ui(new Ui::VLCPlayerClass())
{
ui->setupUi(this);
m_vlcBase = libvlc_new(0, NULL);
Q_ASSERT(m_vlcBase);
}
VLCPlayer::~VLCPlayer()
{
if (m_vlcBase) {
libvlc_release(m_vlcBase);
m_vlcBase = nullptr;
}
delete ui;
}
void VLCPlayer::onVlcMediaPlayerPlaying()
{
if (m_vlcMediaPlayer)
{
libvlc_time_t duration = libvlc_media_player_get_length(m_vlcMediaPlayer);
QTime time = QTime(0, 0, 0).addMSecs(duration);
QString strTime = time.toString("mm:ss");
ui->labelEndTime->setText(strTime);
ui->horizontalSliderPlayer->setMaximum(duration / 1000);
}
}
void VLCPlayer::onVlcMediaPlayerTimeChanged()
{
if (m_vlcMediaPlayer)
{
libvlc_time_t curTime = libvlc_media_player_get_time(m_vlcMediaPlayer);
QTime time = QTime(0, 0, 0).addMSecs(curTime);
QString strTime = time.toString("mm:ss");
ui->labelStartTime->setText(strTime);
ui->horizontalSliderPlayer->blockSignals(true);
ui->horizontalSliderPlayer->setValue(curTime / 1000);
ui->horizontalSliderPlayer->blockSignals(false);
}
}
void VLCPlayer::onVlcMediaPlayerEndReached()
{
if (m_vlcMediaPlayer)
{
ui->horizontalSliderPlayer->setValue(0);
ui->labelStartTime->setText("--:--");
ui->labelEndTime->setText("--:--");
}
}
void VLCPlayer::onVlcMediaPlayerStopped()
{
if (m_vlcMediaPlayer)
{
ui->horizontalSliderPlayer->setValue(0);
ui->labelStartTime->setText("--:--");
ui->labelEndTime->setText("--:--");
}
}
void VLCPlayer::on_btnOpen_clicked()
{
//释放之前播放器
if (m_vlcMediaPlayer) {
if (libvlc_media_player_is_playing(m_vlcMediaPlayer)){
libvlc_media_player_stop(m_vlcMediaPlayer);
}
libvlc_media_player_release(m_vlcMediaPlayer);
m_vlcMediaPlayer = nullptr;
}
if (m_vlcMedia) {
libvlc_media_release(m_vlcMedia);
m_vlcMedia = nullptr;
}
//选择播放文件
QString fileName = QFileDialog::getOpenFileName(this, "选择打开的文件", "", "*.*");
if (fileName.isEmpty()) {
return;
}
fileName = QDir::toNativeSeparators(fileName);
//创建播放器
m_vlcMedia = libvlc_media_new_path(m_vlcBase, fileName.toUtf8().data());
if (!m_vlcMedia) {
return;
}
m_vlcMediaPlayer = libvlc_media_player_new_from_media(m_vlcMedia);
if (!m_vlcMediaPlayer) {
libvlc_media_release(m_vlcMedia);
m_vlcMedia = nullptr;
return;
}
libvlc_media_parse(m_vlcMedia);
libvlc_event_manager_t* em = libvlc_media_player_event_manager(m_vlcMediaPlayer);
libvlc_event_attach(em, libvlc_MediaPlayerTimeChanged, &VLCPlayer::vlcEvents, this);
libvlc_event_attach(em, libvlc_MediaPlayerEndReached, &VLCPlayer::vlcEvents, this);
libvlc_event_attach(em, libvlc_MediaPlayerStopped, &VLCPlayer::vlcEvents, this);
libvlc_event_attach(em, libvlc_MediaPlayerPlaying, &VLCPlayer::vlcEvents, this);
libvlc_event_attach(em, libvlc_MediaPlayerPaused, &VLCPlayer::vlcEvents, this);
libvlc_media_player_set_hwnd(m_vlcMediaPlayer, (void*)ui->widgetRender->winId());
//禁用VLC鼠标、键盘事件
libvlc_video_set_mouse_input(m_vlcMediaPlayer, 0);
libvlc_video_set_key_input(m_vlcMediaPlayer, 0);
}
void VLCPlayer::on_btnPlay_clicked()
{
if (m_vlcMediaPlayer) {
if (libvlc_media_player_is_playing(m_vlcMediaPlayer)) {
libvlc_media_player_pause(m_vlcMediaPlayer);
ui->btnPlay->setText("播放");
}else{
setVideoAspectRatio(false);
libvlc_media_player_play(m_vlcMediaPlayer);
ui->btnPlay->setText("暂停");
}
}
}
void VLCPlayer::on_btnStop_clicked()
{
if (m_vlcMediaPlayer) {
libvlc_media_player_stop(m_vlcMediaPlayer);
}
ui->btnPlay->setText("播放");
}
void VLCPlayer::on_horizontalSliderPlayer_valueChanged(int value)
{
if (m_vlcMediaPlayer)
{
libvlc_time_t time = value * 1000.0;
libvlc_media_player_set_time(m_vlcMediaPlayer, time);
}
}
void VLCPlayer::on_comboBoxRate_currentTextChanged(const QString& text)
{
float rate = 1.0;
if (sscanf(text.toStdString().c_str(), "%fx", &rate) < 0) {
return;
}
if (m_vlcMediaPlayer)
{
libvlc_media_player_set_rate(m_vlcMediaPlayer, rate);
}
}
void VLCPlayer::resizeEvent(QResizeEvent* event)
{
setVideoAspectRatio(false);
QWidget::resizeEvent(event);
}
void VLCPlayer::mouseDoubleClickEvent(QMouseEvent* event)
{
if (this->isFullScreen())
{
this->showNormal();
}
else
{
this->showFullScreen();
}
ui->widgetTools->setVisible(!this->isFullScreen());
QWidget::mouseDoubleClickEvent(event);
}
void VLCPlayer::vlcEvents(const libvlc_event_t* ev, void* param)
{
VLCPlayer* vlcPlayer = reinterpret_cast<VLCPlayer*>(param);
if (!vlcPlayer) {
return;
}
switch (ev->type)
{
case libvlc_MediaPlayerTimeChanged:
QMetaObject::invokeMethod(vlcPlayer, "onVlcMediaPlayerTimeChanged", Qt::QueuedConnection);
break;
case libvlc_MediaPlayerEndReached:
QMetaObject::invokeMethod(vlcPlayer, "onVlcMediaPlayerEndReached", Qt::QueuedConnection);
break;
case libvlc_MediaPlayerStopped:
QMetaObject::invokeMethod(vlcPlayer, "onVlcMediaPlayerStopped", Qt::QueuedConnection);
break;
case libvlc_MediaPlayerPlaying:
QMetaObject::invokeMethod(vlcPlayer, "onVlcMediaPlayerPlaying", Qt::QueuedConnection);
break;
case libvlc_MediaPlayerPaused:
break;
default:
break;
}
}
void VLCPlayer::setVideoAspectRatio(bool aspectRatio)
{
if (m_vlcMediaPlayer)
{
QString ratio = QString("%1:%2").arg(ui->widgetRender->width()).arg(ui->widgetRender->height());
libvlc_video_set_aspect_ratio(m_vlcMediaPlayer, aspectRatio ? NULL : ratio.toUtf8().data());
}
}
备注
- VLC默认接管鼠标键盘事件,禁用后才能在QWidget中获取鼠标、键盘事件
//禁用VLC鼠标、键盘事件
libvlc_video_set_mouse_input(m_vlcMediaPlayer, 0);
libvlc_video_set_key_input(m_vlcMediaPlayer, 0);
- 源码下载地址