• Qt+MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示


    前言

      在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

  • 相关阅读:
    java fork/join简单实践
    java 中的字符串处理--正则表达式
    那些年,我们追过的java8
    openssl与java(读取加密码的密钥)
    SpringMVC 常用注解的使用和解释
    Spring 常用注解的使用
    java web 一次请求编码设置的过程
    Spring让程序生成程序
    设置session超时的三种方式
    为什么 cookie.getMaxAge() 总是得到 -1 ?
  • 原文地址:https://www.cnblogs.com/qq21497936/p/15060135.html
Copyright © 2020-2023  润新知