Qt+MPlayer音樂播放器開發筆記(一):ubuntu上編譯MPlayer以及Demo演示

紅胖子(紅模仿) 發表於 2021-07-26

前言

  在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