若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/118713520
红瘦子 (红模拟) 的博文大全:开发技术汇合(蕴含 Qt 实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中…(点击传送门)
Qt 开发专栏:三方库开发技术
前言
在 ubuntu 上实现 MPlayer 播放器播放音乐。
Demo
Mplayer
MPlayer 是一款开源多媒体播放器,以 GNU 通用公共许可证公布。此款软件可在各支流操作系统应用,例如 Linux 和其余类 Unix 零碎、Windows 及 Mac OS X 零碎。
MPlayer 基于命令行界面,在各操作系统也可抉择装置不同的图形界面。mplayer 的另一个大的特色是宽泛的输出设备反对。它能够在 X11、Xv、DGA、OpenGL、SVGAlib、fbdev、AAlib、DirectFB 下工作,且能应用 GGI 和 SDL 和一些低级的硬件相干的驱动模式(比方 Matrox、3Dfx 和 Radeon、Mach64、Permedia3)。MPlayer 还反对通过硬件 MPEG 解码卡显示,如 DVB 和 DXR3 与 Hollywood+。
MPlayer 的开发始于 2000 年。最后的作者是 Arpad Gereoffy。MPlayer 最后的名字叫 ”MPlayer – The Movie Player for Linux”,不过起初开发者们简称其为 ”MPlayer – The Movie Player”,起因是 MPlayer 曾经不仅能够用于 Linux 而能够在所有平台上运行。
下载
最新源码下载地址:http://mplayerhq.hu/design7/news-archive.html
QQ 群:1047134658(点击“文件”搜寻“MPlayer”,群内与博文同步更新)
Ubuntu 编译
步骤一:下载解压
tar xvf MPlayer-1.4.tar.xz
步骤二:configure
cd MPlayer-1.4/
./configure
./configure --yasm=’’
步骤三:make,须要 zlib 库撑持,编译 zlib 库
make
须要编译 zlib 库,须要先编译,请参照博文《libzip 开发笔记(二):libzip 库介绍、ubuntu 平台编译和工程模板》。
sudo ldconfig
步骤四:持续编译 make
make
步骤五:装置 sudo make install
sudo make install
步骤六:播放测试
(留神:若是虚拟机,虚拟机的音量和选用主机的声卡须要抉择下)
Demo
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QMainWindow>
#include <QThread>
#include "MplayerManager.h"
#include <QFileDialog>
namespace Ui {class Widget;}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void initControls();
protected slots:
void slot_durationChanged(int duration);
void slot_positionChanged(int position);
void slot_finished();
void slot_mediaInfo(MplayerManager::MediaInfo mediaInfo);
private slots:
void on_pushButton_startPlay_clicked();
void on_pushButton_stopPlay_clicked();
void on_pushButton_pausePlay_clicked();
void on_pushButton_resume_clicked();
void on_horizontalSlider_sliderReleased();
void on_horizontalSlider_valueChanged(int value);
void on_pushButton_mute_clicked(bool checked);
void on_horizontalSlider_position_sliderReleased();
void on_horizontalSlider_position_sliderPressed();
void on_pushButton_browserMplayer_clicked();
void on_pushButton_defaultMplayer_clicked();
void on_pushButton_browserMusic_clicked();
private:
Ui::Widget *ui;
QThread *_pMplayerManagerThread;
MplayerManager *_pMplayerManager;
bool _sliderPositionPressed;
};
#endif // WIDGET_H
Widget.cpp
#include "Widget.h"
#include "ui_Widget.h"
#include "MplayerManager.h"
#include <QDebug>
#define LOG qDebug()<<__FILE__<<__LINE__
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget),
_pMplayerManagerThread(0),
_pMplayerManager(0),
_sliderPositionPressed(false)
{ui->setupUi(this);
QString version = "v1.0.0";
setWindowTitle(QString("mplayer 播放器 %1 (长沙红瘦子网络科技有限公司 QQ:21497936 微信:yangsir198808 公司网址: hpzwl.blog.csdn.net)").arg(version));
// 初始化 modbus 线程
_pMplayerManagerThread = new QThread();
_pMplayerManager = new MplayerManager();
_pMplayerManager->moveToThread(_pMplayerManagerThread);
QObject::connect(_pMplayerManagerThread, SIGNAL(started()),
_pMplayerManager, SLOT(slot_start()));
connect(_pMplayerManager, SIGNAL(signal_durationChanged(int)),
this, SLOT(slot_durationChanged(int)));
connect(_pMplayerManager, SIGNAL(signal_positionChanged(int)),
this, SLOT(slot_positionChanged(int)));
connect(_pMplayerManager, SIGNAL(signal_mediaInfo(MplayerManager::MediaInfo)),
this, SLOT(slot_mediaInfo(MplayerManager::MediaInfo)));
connect(_pMplayerManager, SIGNAL(signal_finished()),
this, SLOT(slot_finished()));
_pMplayerManagerThread->start();
initControls();}
Widget::~Widget()
{delete ui;}
void Widget::initControls()
{ui->horizontalSlider->setMinimum(0);
ui->horizontalSlider->setMaximum(100);
ui->horizontalSlider->setValue(100);
ui->label_volume->setText("100");
}
void Widget::slot_durationChanged(int duration)
{
LOG << duration;
ui->label_duration->setText(QString("%1%2:%3%4")
.arg(duration / 60 / 10)
.arg(duration / 60 % 10)
.arg(duration % 60 / 10)
.arg(duration % 10));
ui->horizontalSlider_position->setMinimum(0);
ui->horizontalSlider_position->setMaximum(duration);
}
void Widget::slot_positionChanged(int position)
{ui->label_position->setText(QString("%1%2:%3%4")
.arg(position / 60 / 10)
.arg(position / 60 % 10)
.arg(position % 60 / 10)
.arg(position % 10));
if(!_sliderPositionPressed)
{ui->horizontalSlider_position->setValue(position);
}
}
void Widget::slot_finished()
{ui->label_position->setText("00:00");
}
void Widget::slot_mediaInfo(MplayerManager::MediaInfo mediaInfo)
{ui->label_title->setText(mediaInfo.title);
ui->label_album->setText(mediaInfo.album);
ui->label_year->setText(mediaInfo.year);
ui->label_artist->setText(mediaInfo.artist);
ui->label_genre->setText(mediaInfo.genre);
ui->label_comment->setText(mediaInfo.comment);
}
void Widget::on_pushButton_startPlay_clicked()
{_pMplayerManager->startPlay();
}
void Widget::on_pushButton_stopPlay_clicked()
{_pMplayerManager->stopPlay();
}
void Widget::on_pushButton_pausePlay_clicked()
{_pMplayerManager->pausePlay();
}
void Widget::on_pushButton_resume_clicked()
{_pMplayerManager->resumePlay();
}
void Widget::on_horizontalSlider_sliderReleased()
{_pMplayerManager->setVolume(ui->horizontalSlider->value());
}
void Widget::on_horizontalSlider_valueChanged(int value)
{ui->label_volume->setText(QString("%1").arg(value));
}
void Widget::on_pushButton_mute_clicked(bool checked)
{_pMplayerManager->setMute(checked);
}
void Widget::on_horizontalSlider_position_sliderReleased()
{
_sliderPositionPressed = false;
_pMplayerManager->setPosition(ui->horizontalSlider_position->value());
}
void Widget::on_horizontalSlider_position_sliderPressed()
{_sliderPositionPressed = true;}
void Widget::on_pushButton_browserMplayer_clicked()
{_pMplayerManager->setMplayerPath(ui->lineEdit_mplayer->text());
}
void Widget::on_pushButton_defaultMplayer_clicked()
{ui->lineEdit_mplayer->setText("mplayer");
}
void Widget::on_pushButton_browserMusic_clicked()
{QString dir = ui->lineEdit_music->text();
dir = dir.mid(0, dir.lastIndexOf("/"));
QString filePath = QFileDialog::getOpenFileName(0,
"open",
dir,
"AAC(*.aac)"
";;MP3(*.mp3)"
";;WAV(*.wav)"
";;WMA(*.wma)");
if(filePath.isEmpty())
{return;}
ui->lineEdit_music->setText(filePath);
_pMplayerManager->setFilePath(filePath);
}
MplayerManager.h
#ifndef MPLAYERMANAGER_H
#define MPLAYERMANAGER_H
/************************************************************\
* 控件名称:mplayer 治理类
* 控件形容:* 应用 slave 模式管制 mplayer 播放音乐,根底模块实现单曲播放
* 控件性能:* 1. 音乐播放器播放音乐的根底操作
* 2. 能够获取歌曲的相干专辑,作者,年代,评论,流派等信息
* 著作权信息
* 作者:红瘦子(AAA 红模拟)
* 公司:长沙红瘦子网络科技有限公司
* 网址:hpzwl.blog.csdn.net
* 联系方式:QQ(21497936) 微信(yangsir198808) 电话(15173255813)
* 版本信息
* 日期 版本 形容
* 2021 年 07 月 12 日 v1.0.0 根底模板
\************************************************************/
#include <QObject>
#include <QThread>
#include <QProcess>
#include <QtMath>
#include <QTextCodec>
class MplayerManager : public QObject
{
Q_OBJECT
public:
enum PLAY_STATE { // 播放状态
PLAY_STATE_STOP = 0x00, // 未播放,进行播放
PLAY_STATE_PLAY, // 正在播放
PLAY_STATE_PAUSE // 暂停播放
};
struct MediaInfo { // 多媒体信息
MediaInfo() {}
QString title; // 题目
QString artist; // 艺术家
QString album; // 专辑
QString year; // 年代
QString comment; // 评论
QString genre; // 流派
};
public:
explicit MplayerManager(QObject *parent = 0);
~MplayerManager();
public:
QString getMplayerPath() const; // 获取播放器门路(运行则可调用)QString getFilePath() const; // 获取以后播放文件门路
bool getMute() const; // 获取是否静音
int getVolume() const; // 获取音量
int getPosition() const; // 获取以后地位
public:
void setMplayerPath(const QString &mplayerPath); // 设置播放器门路
void setFilePath(const QString &filePath); // 设置播放文件
void setMute(bool mute); // 设置静音
void setVolume(int volume); // 设置音量(0~100)void setPosition(int position); // 设置以后播放地位
signals:
void signal_stateChanged(PLAY_STATE playState); // 播放器播放状态信号
void signal_durationChanged(int duration); // 播放歌曲长度变换信号
void signal_positionChanged(int value); // 播放器歌曲地位比变换,1s 一次
void signal_finished(); // 播放实现信号
void signal_mediaInfo(MplayerManager::MediaInfo mediaInfo); // 播放歌曲时,获取的各种元信息
public:
void startPlay(QString filePath); // 播放指定歌曲(调用后,或发送音讯给播放线程,// 以下 4 个函数同样,实质调用了 slo_xxxx
void startPlay(); // 播放歌曲
void pausePlay(); // 暂停播放
void resumePlay(); // 复原播放
void stopPlay(); // 进行播放
public slots:
void slot_start(); // 线程开启(须要内部治理 QThread)void slot_stop(); // 线程进行
void slot_startPlay(); // 开始播放
void slot_pausePlay(); // 暂停播放
void slot_resumePlay(); // 复原播放
void slot_stopPlay(); // 进行播放
void slot_setPosition(int position); // 设置地位
void slot_setVolume(int volume); // 设置音量
void slot_setMute(bool mute); // 设置静音
void slot_getCurrentPosition(); // 获取以后地位(调用后,会强制立刻抛出以后播放地位信号)protected slots:
void slot_readyRead();
void slot_finished(int exitCode, QProcess::ExitStatus exitStatus);
protected:
void timerEvent(QTimerEvent *event);
private:
bool _runnig; // 是否运行
QProcess *_pProcess; // 过程管制
QTextCodec *_pTextCodec; // 编码
private:
QString _filePath; // 播放文件门路
QString _mplayerPath; // mplayer 执行程序
private:
PLAY_STATE _playState; // 以后播放状态
int _position; // 以后播放地位,单位 s
bool _mute; // 是否静音
int _volume; // 以后音量 0~100
int _duration; // 以后歌曲的长度,单位 s
int _timerId; // 定时器,获取以后播放工夫
MediaInfo _mediaInfo; // 播放歌曲时候的媒体信息
};
#endif // MPLAYERMANAGER_H
工程模板
mplayerDemo_根底模板_v1.0.0.rar
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/118713520