前言
在ubuntu上實現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”,群內與博文同步更新)
tar xvf MPlayer-1.4.tar.xz
cd MPlayer-1.4/
./configure
./configure --yasm=’’
make
需要編譯zlib庫,需要先編譯,請參照博文《libzip開發筆記(二):libzip庫介紹、ubuntu平臺編譯和工程模板》。
sudo ldconfig
make
sudo make install
(注意:若是虛擬機器,虛擬機器的音量和選用主機的音效卡需要選擇下)
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