基于qt和mplayer的影音播放器

基于QT与MPLAYER的影音播放器源码项目实战 Qt 是一个功能强大的 C++ 框架,广泛应用于桌面、嵌入式和移动平台的 GUI 开发。其核心优势在于真正的跨平台一致性——通过抽象层封装底层操作系统 API,使同一套代码可在 Windows、macOS、Linux 甚至 Android/iOS 上编译运行,无需重写界面逻辑。Qt 的信号与槽机制、元对象系统(Meta-Object System)和丰富的控件库极大提升了开发效率。例如:该机制不仅解耦了组件通信,还为后续媒体控制、网络请求等模块提供了统一的事件驱动模型基础。 阅读详情

转自:http://www.cnblogs.com/ziqiuqiandao/archive/2012/11/24/2785473.html


这是一个基于qt和mplayer使用的影音播放器,代码不多,就3,4百行。

使用到的控件有QWidget、QLabel、QFrame、QPushButton、QSlider、QListWidget、QProcess和QString。

通过这几种控件的使用,可以基本了解到qt的编程风格和使用方式。

这个程序参考了网上流行的qt控制mplayer播放的多篇文章,在此感谢一下。

运行效果图如下:

qmplayer.pro:

######################################################################
# Automatically generated by qmake (2.01a) ?? ?? 18 03:06:00 2010
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += qmplayer.h
SOURCES += main.cpp qmplayer.cpp

main.cpp:
#include "qmplayer.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QMPlayer *qmplayer = new QMPlayer;
    qmplayer->showFullScreen();
    return app.exec();
}
qmplayer.h:
   
#ifndef _H_QMPLAYER_
#define _H_QMPLAYER_

#include <QtGui>

class QMPlayer:public QWidget
{
    Q_OBJECT
public:
    void play(QString fileName);
      QMPlayer(QWidget *parent = 0); 

private slots:
    void next();
    void prev();
    void pause();
    void stop();
    void setSpeed();
    void dataRecieve();
    void addItem();
    void delItem();
    void current(int);   
    void changeVolume(int);
    void playListItem(QListWidgetItem *);
    
private:
       QLabel *playLabel;
    QLabel *timeLabel;
    QLabel *percentLabel;
    QLabel *voiceLabel;
    QLabel *volumeLabel;
    
    QFrame *ctlFrame;
    QPushButton *playBtn;
    QPushButton *stopBtn;
    QPushButton *prevBtn;
    QPushButton *nextBtn;
    QPushButton *speedBtn;
    
    QSlider *currentlBar;
    QSlider *volumeSlider;

    QListWidget *playList;
    QPushButton *addBtn;
    QPushButton *delBtn;
    
    QProcess *p;
    QString currentStr;
    QString currentPercent;
    QString totalTime;
    QString fileName;
};

#endif /* _H_QMPLAYER_ */
qmplayer.cpp:
#include "qmplayer.h"

QMPlayer::QMPlayer(QWidget *parent) :QWidget(parent)
{
    resize(320, 240);
    setWindowTitle("mplayer");

    playLabel = new QLabel(this);
    playLabel->setGeometry(QRect(0, 0, 240, 180));
    playLabel->setPixmap(QPixmap("images/mplayer.png"));

    ctlFrame = new QFrame(this);
    ctlFrame->setGeometry(QRect(15, 183, 300, 55));
    ctlFrame->setFrameShape(QFrame::StyledPanel);
    ctlFrame->setFrameShadow(QFrame::Raised);

    currentlBar = new QSlider(ctlFrame);
    currentlBar->setGeometry(QRect(10, 0, 180, 18));
    currentlBar->setOrientation(Qt::Horizontal);
    connect(currentlBar, SIGNAL(sliderMoved(int)), this, SLOT(current(int)));

    percentLabel = new QLabel(ctlFrame);
    percentLabel->setGeometry(QRect(195, 2, 40, 18));

    timeLabel = new QLabel(ctlFrame);
    timeLabel->setGeometry(QRect(235, 2, 60, 18));

    stopBtn = new QPushButton("stop",ctlFrame);
    stopBtn->setGeometry(QRect(10, 18, 40, 18));
    stopBtn->setEnabled(false);
    connect(stopBtn, SIGNAL(clicked()), this, SLOT(stop()));

    prevBtn = new QPushButton("prev",ctlFrame);
    prevBtn->setGeometry(QRect(60, 18, 40, 18));
    connect(prevBtn, SIGNAL(clicked()), this, SLOT(prev()));
    
    playBtn = new QPushButton("play",ctlFrame);
    playBtn->setGeometry(QRect(110, 18, 55, 18));
    playBtn->setEnabled(false);
    connect(playBtn, SIGNAL(clicked()), this, SLOT(pause()));

    nextBtn = new QPushButton("next", ctlFrame);
    nextBtn->setGeometry(QRect(175, 18, 40, 18));
    connect(nextBtn, SIGNAL(clicked()), this, SLOT(next()));

    speedBtn = new QPushButton("speed", ctlFrame);
    speedBtn->setGeometry(QRect(225, 18, 55, 18));
    connect(speedBtn, SIGNAL(clicked()), this, SLOT(setSpeed()));

    voiceLabel = new QLabel("voice:", ctlFrame);
    voiceLabel->setGeometry(QRect(10, 36, 50, 18));

    volumeSlider = new QSlider(ctlFrame);
    volumeSlider->setGeometry(QRect(70, 36, 100, 18));
    volumeSlider->setOrientation(Qt::Horizontal);
    volumeSlider->setRange(0, 100);
    volumeSlider->setValue(100);
    volumeSlider->setEnabled(false);
    connect(volumeSlider, SIGNAL(sliderMoved(int)), this, SLOT(changeVolume(int)));

    volumeLabel = new QLabel(ctlFrame);
    volumeLabel->setGeometry(QRect(175, 36, 60, 18));
    volumeLabel->setText(QString::number(100));

    playList = new QListWidget(this);
    playList->setGeometry(QRect(243, 8, 73, 150));
    connect(playList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(playListItem(QListWidgetItem *))); 

    addBtn = new QPushButton(QIcon("images/add.png"), "", this);
    addBtn->setGeometry(QRect(248, 160, 30, 20));
    addBtn->setStyleSheet("border-style:none");
    connect(addBtn, SIGNAL(clicked()), this, SLOT(addItem())); 

    delBtn = new QPushButton(QIcon("images/remove.png"), "", this);
    delBtn->setGeometry(QRect(283, 160, 30, 20));
    delBtn->setStyleSheet("border-style:none");
    connect(delBtn, SIGNAL(clicked()), this, SLOT(delItem())); 

}

/*************************************************

Function:next

Description:play the next movie/song

*************************************************/
void QMPlayer::next()
{
    if (playList->count() != 0) {
        if(playList->currentRow() == playList->count() - 1)
            playList->setCurrentRow(0);
        else
            playList->setCurrentRow(playList->currentRow() + 1);
        
        play(playList->currentItem()->text());
        playBtn->setText("pause");
    }
}

/*************************************************

Function:prev

Description:play the previous movie/song

*************************************************/
void QMPlayer::prev()
{
    if (playList->count() != 0) {
        if(playList->currentRow() == 0)
            playList->setCurrentRow(playList->count() - 1);
        else
            playList->setCurrentRow(playList->currentRow() - 1);
        
        play(playList->currentItem()->text());
        playBtn->setText("pause");
    }
}

/*************************************************

Function:addItem

Description:add a item in the playlist

*************************************************/
void QMPlayer::addItem()
{
    QStringList fileNames = QFileDialog::getOpenFileNames(this, "choose movie/song", "/", "Movie/Song (*.mp4 *.mp3)");
    if(fileNames.count() != 0)
        playList->addItems(fileNames);
}

/*************************************************

Function:delItem

Description:delete a item in the playlist

*************************************************/
void QMPlayer::delItem()
{
    if(playList->currentRow() == -1)
        QMessageBox::warning(this, "note", "not select or playList is null", QMessageBox::Yes);
    else
        playList->takeItem(playList->currentRow());
}

/*************************************************

Function:playListItem

Description:play a item in the playlist

*************************************************/
void QMPlayer::playListItem(QListWidgetItem *item)
{
    play(item->text());
    playBtn->setText("pause");
}

/*************************************************

Function:play

Description:call mplayer to play movie/song

*************************************************/

void QMPlayer::play(QString fileName)
{
    if (p != NULL)
        p->kill();

    p = new QProcess(this);
    connect(p, SIGNAL(readyReadStandardOutput()), this, SLOT(dataRecieve())); 

    QStringList args;
    args << "-slave";
    args << "-quiet";
    args << "-zoom";
    args << "-x";
    args << "240";
    args << "-y";
    args << "180";
    args << fileName;
    p->start("mplayer", args);
    
    playBtn->setEnabled(true);
    stopBtn->setEnabled(true);
    volumeSlider->setEnabled(true);

    timeLabel->show();
    percentLabel->show();
}

/*************************************************

Function:pause

Description:pause a playing movie/song

*************************************************/
void QMPlayer::pause()
{
    p->write("pause\n");
    if (playBtn->text() == "play") {
        connect(p, SIGNAL(readyReadStandardOutput()), this, SLOT(dataRecieve())); 
        dataRecieve();
        playBtn->setText("pause");
    }
    else {
        disconnect(p, SIGNAL(readyReadStandardOutput()), this, SLOT(dataRecieve())); 
        playBtn->setText("play");
    }

}

/*************************************************

Function:stop

Description:stop a playing movie/song

*************************************************/
void QMPlayer::stop()
{
    p->kill();
    p = NULL;
    timeLabel->hide();
    percentLabel->hide();
    playLabel->update();
    
    playBtn->setEnabled(false);
    stopBtn->setEnabled(false);
    volumeSlider->setEnabled(false);
}

/*************************************************

Function:changeVolume

Description:change the volume

*************************************************/
void QMPlayer::changeVolume(int v)
{
    volumeLabel->setText(QString::number(v));
    p->write(QString("volume " + QString::number(v) + " 2\n").toUtf8());
}

/*************************************************

Function:setSpeed

Description:set the playing speed

*************************************************/
void QMPlayer::setSpeed()
{
    double speed=QInputDialog::getDouble(this, "set speed", "compare with nomal speed");
    if(speed > 0)
        p->write(QString("speed_set " + QString::number(speed) + " 2\n").toUtf8());
}

/*************************************************

Function:dataRecieve

Description:recieve the data from mplayer

*************************************************/
void QMPlayer::dataRecieve()
{
    p->write("get_time_length\n");
    p->write("get_time_pos\n");
    p->write("get_percent_pos\n");

    while (p->canReadLine()) {
        QByteArray b = p->readLine();
        b.replace(QByteArray("\n"), QByteArray(""));
        QString s(b);
        
        if (b.startsWith("ANS_TIME_POSITION")) {
            currentStr = s.mid(18);
            timeLabel->setText(currentStr + "s");
            currentlBar->setValue(s.mid(18).toFloat());
        }
        else if (b.startsWith("ANS_LENGTH")) {
            totalTime = s.mid(11);
            currentlBar->setRange(0, s.mid(11).toFloat());
        }
        else if(b.startsWith("ANS_PERCENT_POSITION")) {
            currentPercent = s.mid(21);
            percentLabel->setText(currentPercent + "%");
        }
    }

}

/*************************************************

Function:current

Description:get the current process from mplayer

*************************************************/

void QMPlayer::current(int value)
{
    p->write(QString("seek " + QString::number(value) + " 2\n").toUtf8());
}

Qt下基于Mplayer的视频播放器 程序本身还是通过拼接一个命令行,利用Qprocess->start(命令行),启动Mplayer,在此基础上做了美观的ui。并带有播放列表栏,支持循环播放。 立即下载

相关推荐

mplayer QT源码

注意把images文件夹放到最后的工程文件夹中,不然不会显示

弄懂this指向问题

initInstance: function () { var self = this; this.sound= new QMplayer({ target: "auto", // 设置 target=music 时会拉起QQ音乐客户端进行播放 onplay: function () { console.log('onplay....'); ...

Haines 281

qt+mplayer

利用mplayer的开源代码,利用qt的界面功能,源码下载后需要修改mplayer的命令路径

QMPlay2 开源项目教程

QMPlay2 是一个视频和音频播放器,支持多种格式和编解码器。项目的目录结构如下: - `lang/`:包含语言文件。 - `src/`:包含源代码文件。 - `gitignore`:Git 忽略文件。 - `gitmodules`:Git 子模块文件。 - `AUTHORS`:项目作者列表。 - `CMakeLists.txt`:CMake 配置文件。 - `ChangeLog`:变更日志。...

gitblog_00293的博客 522

qt_mplayer

参考链接:http://blog.youkuaiyun.com/ajaxhe/article/details/7315778 windows下播放注意播放参数的设置 // for windows7 vista QString common = "./mplayer/mplayer.exe -slave -quiet -vo direct3d " + m_fileName + " -wid " + QString::number(reinterpret_cast<qlonglong>(videoWidget->winId())); // for XP //QString common = "./mplayer/mplayer.exe -slave -quiet -vo directx:noaccel " + m_fileName + " -wid " + QString::number((ulong)videoWidget->winId());

Qt设计在线音乐播放器支持本地播放(music-player)源代码.zip

Qt设计在线音乐播放器支持本地播放(music_player)源代码,Qt中提供了音视频播放的类,类中提供了很多播放类的接口供调用,可以实现一个完整播放器的所有功能。 class online_play : public QWidget { Q_OBJECT signals: void searchFinal(int,int,int,QString,QString,QString,int); public slots: void recv_ack(QNetworkReply*); public: explicit online_play(QWidget *parent = nullptr); private: QByteArray searchInfo; int musicId; //音乐ID int musicDuration; QString musicName; //音乐名 int mvId;

Qt视频播放器界面Demo

Qt视频播放器界面Demo; 使用QPropertyAnimation实现动画效果

mahuifa的博客 2367

最新Mamba环境配置教程:从CUDA到causal-conv1d的完整安装流程

本文提供最新Mamba环境配置教程,涵盖从CUDA到causal-conv1d的完整安装流程。针对深度学习领域的长序列处理需求,详细指导如何正确配置CUDA工具链、安装PyTorch及关键依赖causal-conv1d,解决常见报错问题,并验证mamba-ssm集成效果。

bush的博客 418

【全源码及文档】基于Qt的音频视频管理系统的设计与实现

摘 要 在当今社会,人们的生活水平的提高,伴随着享受的娱乐的要求也越来越高, 各种各样的电子产品的发展,基于 Linux 的嵌入式产品也逐渐丰富起来。所以本 次的设计主题就是一款强大的多媒体播放器。不但能够播放音频文件而且可以播 放一定格式下的视频文件,有文件选择,播放、暂停、停止等功能。 最终的目标是实现一个方便易用的便捷式多媒体播放器,实行一些视频,音 频的播放,同时实现多格式的支持。 着计算机的普及,其各种应用技术也随之迅速发展,多媒体技术就是发展最 迅速的应用技术之一。多媒体工具也大大的拓展了计算

weixin_49553137的博客 659

Hermes-Agent-完整指南

Hermes Agent 是由 **Nous Research** 开发的一款**自我改进型 AI Agent**,具有内置的学习闭环系统。它的核心理念是"一个与你共同成长的 Agent"。- 能够从经验中创建技能(Skill-Learning Automated),在使用过程中自我改进, 跨会话持久记忆, 深度用户建模

liu_zhiyi的博客 3035

Flowable第一篇、快速上手(Flowable安装、配置、集成)

Flowable是一个轻量级、高效可扩展的工作流和业务流程管理(BPM)引擎,支持在Java应用程序中实现复杂的工作流自动化。Flowable最初是作为Activiti项目的一个分支发展而来的,但它现在已经成为一个独立的开源项目,并在企业级应用中得到了广泛使用

Du_XiaoNan的博客 1万+

Qt Creator 之mplayer播放器图形界面设计

利用mplayer为播放核心,编写自己的播放器界面(1) 前几天学习了mplayer的编译、 初步使用和方法学习 有需要的可以看我发过的子~xphyym 这个礼拜写了个播放器的界面,很粗糙! 理想界面为暴风影音那样~~ 一个人的力量很有局限~~ 欢迎大家共同讨论研究,编一个我们自己的播放器~~ 附件为我打包的程

一个人的力量很渺小,一群人的力量很可怕...... 2368

微信小游戏审核避坑指南:如何一次性通过微信审核(附最新审核要求)

本文详细解析微信小游戏审核全流程,提供从开发到上线的关键策略,帮助开发者一次性通过审核。涵盖合规性自查、材料优化、开发环境配置、版本管理、审核材料填写技巧等核心内容,并附最新审核要求和常见驳回问题解决方案,显著提升审核通过率。

weixin_28454475的博客 1411

30分带你从认识FFmpeg到玩转FFmpeg

30分带你从认识FFmpeg到玩转FFmpeg

m0_60259116的博客 569

Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明

Utrust4701F与Utrust2700R读写器支持银河麒麟系统,广泛应用会员管理、支付管理等领域。本文将重点介绍Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明。以上方法适用于主流国产操作系统,如 优麒麟(UbuntuKylin)/ 中标麒麟(NeoKylin) / UOS(统信操作系统)/ 中兴新支点 / 红旗 linux(redflag linux)/ 普华 Linux(I-soft OS) / 威科乐恩 Linux(WiOS)等

华翔天诚科技 1833

DDS(Direct Digital Synthesizer)数字频率合成器

随着数字技术在仪器仪表和通信系统中的广泛使用,可从参考频率源产生多个频率的数 字控制方法诞生了,即直接数字频率合成(DDS)。 直接数字合成(DDS)是一种产生模拟波形(通常是正弦波)的方法,它通过产生数字形式的时变信号,然后进行数模转换。由于DDS设备内的操作主要是数字的,它可以提供输出频率之间的快速切换,良好的频率分辨率,并在广泛的频率频谱上操作。随着设计和工艺技术的进步,今天的DDS设备非常紧凑,功耗很小。 上面是比较书面的语言,其实简单地说就是一个信号发生器模块,主要是产生频率可调的三角波正弦波。

denghuajing的博客 4865

挣脱Windows的枷锁:MPlayer - linux下的暴风影音

很多人不使用linux桌面,其中一个很大的原因就是离不开Windows下的软件,其实linux的开源社区里有得的好用的工具,关键是看您会不会用而已,所以就有了我们的这个“挣脱Windows的枷锁”这一系列文章的开始。网络上,linux的资料非常的丰富,我们这系列的文章基本上在网络上都可以找到类似的文章,我们基本做的就是将这些散落网络各处的文章收集整理的工作而已,应了一句活,世界上不缺少美,只是缺少

在水一方 1918

Zynq远程更新程序实战:从emmc到flash的完整方案解析

本文详细解析了Zynq远程更新程序的完整方案,重点探讨了从emmc到flash的实战操作。通过硬件连接限制破解、emmc配置技巧、flash擦写策略优化等关键技术点,提供了可靠的远程更新解决方案,特别适合需要频繁更新boot.bin的应用场景。

weixin_29163797的博客 179

linux下 qurl_Qt 简易播放器

头文件:#ifndef MEDIA_H#define MEDIA_H#include #include#include#include#include#include#include#include#include//影音播放#include#include#include#include#includenamespace Ui {class Media;}class Media : public...

weixin_39585691的博客 154

【全开源】废品回收垃圾回收小程序APP公众号源码PHP版本

废品回收小程序是一款基于移动端的应用程序,它提供了废品分类、预约回收、积分兑换等多种功能,帮助用户更方便地进行废品回收,同时还能兑换到一些小礼品或优惠券,让回收变得更加有趣和有价值。随着环保意识的逐渐提高,废品回收成为了我们日常生活中的重要一环。但是,如何更方便、高效地进行废品回收呢?今天,我要向大家推荐一款超级实用的工具——废品回收小程序!废品回收小程序不仅让我们的生活更加便捷,还让我们为环保事业贡献了一份力量。让我们一起行动起来,用废品回收小程序为我们的家园添一抹绿色吧!

2401_84593614的博客 1359

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Qt 简易播放器

头文件:  #ifndef MEDIA_H #define MEDIA_H #include #include #include #include #include #include #include #include #include//影音播放 #i

wangtao724697699的专栏 541

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

手机刷linux影音,在优麒麟/Ubuntu上构建麒麟影音snap包

Snaps是易于创建和安装的容器化软件包,它们可以自动更新并且安全运行。同时由于它们捆绑了本身所需的依赖,snaps 应用可以不加修改的运行在大部分Linux系统上。麒麟影音是优麒麟默认的视频播放器,它使用MPV和MPlayer作为后端引擎,支持大多数音频和视频格式,并且同时支持x86和ARM平台。接下来,我们将展示如何在优麒麟/Ubuntu 16.04(官方推荐的版本是16.04,其他版本可能存...

weixin_30902943的博客 804

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: NYOJ 289 苹果
下一篇: Qt中QString转int,float
ACanswer
博客等级 码龄12年 280粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值