通过QT对mplayer的应用,实现视频播放器的功能,包括开始播放、暂停播放、继续播放、终止播放、播放上一个、播放下一个、添加指定目录下的视频、删除指定视频、清空列表。应用到QFileDialog、QStringList等类,并交叉编译移植到开发板上运行。
界面效果如下图:
mymplayer.h
#ifndef MYMPLAYER_H
#define MYMPLAYER_H
#include <QWidget>
#include <QProcess>
#include <QListWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui {
class MyMplayer; }
QT_END_NAMESPACE
class MyMplayer : public QWidget
{
Q_OBJECT
public:
MyMplayer(QWidget *parent = nullptr);
~MyMplayer();
private slots:
void on_pushButton_addvideo_clicked();
void on_pushButton_play_clicked();
void on_pushButton_stop_clicked();
void on_pushButton_pause_clicked();
void on_pushButton_prev_clicked();
void on_pushButton_next_clicked();
void on_pushButton_delete_clicked();
void on_pushButton_clear_clicked();
void on_listWidget_itemDoubleClicked();
private:
Ui::MyMplayer *ui;
QProcess *p;
QString current_video;
};
#endif // MYMPLAYER_H
mymplayer.cpp
#include "mymplayer.h"
#include "ui_mymplayer.h"
#include <QFileDialog>
MyMplayer::MyMplayer(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyMplayer)
{
ui->setupUi(this);
p = new QProcess(this);
ui->pushButton_pause->setEnabled(false);
}
MyMplayer::~MyMplayer()
{
delete ui;
}
//添加
void MyMplayer::on_pushButton_addvideo_clicked()
{
QStringList video_files = QFileDialog::getOpenFileNames(this,"选择视频文件","/mnt/sd/video","*.mp4 *.avi *wmv");
//去重
for(int i=0;i<ui->listWidget->count();i++)
{
for(int j=0;j<video_files.count();j++)
{
if(ui->listWidget->item(i)->text()==video_files.at(j))
{
video_files.removeAt(j);
break;
}
}
}
//如果无添加文件,直接返回
if(video_files.isEmpty())
return;
//添加到listWid
ui->listWidget->addItems(video_files);
//定位
ui->listWidget->setCurrentRow(0);
}
//播放
void MyMplayer::on_pushButton_play_clicked()
{
//只有没有运行才开始播放
if(p->state()==QProcess::Running)
{
p->kill();
p->waitForFinished();
}
QString cmd = QString("mplayer");
QStringList args;//参数
//记录当前正在播放的视频
current_video = ui->listWidget->currentItem()->text();
args<<"-quiet"<<"-slave"<<"-zoom"<<"-x"<<"600"
<<"-y"<<"360"<<current_video<<"&";
p->start(cmd,args);
ui->pushButton_pause->setText("暂停");
ui->pushButton_pause->setEnabled(true);
}
//停止
void MyMplayer::on_pushButton_stop_clicked()
{
p->kill();
p->waitForFinished();
ui->pushButton_pause->setText("暂停");
ui->pushButton_pause->setEnabled(false);
}
//暂停/继续
void MyMplayer::on_pushButton_pause_clicked()
{
QString cmd = QString("killall");
QStringList args;//参数
if(ui->pushButton_pause->text()=="暂停")
{
args<<"-STOP"<<"mplayer"<<"&";
ui->pushButton_pause->setText("继续");
}
else
{
args<<"-CONT"<<"mplayer"<<"&";
ui->pushButton_pause->setText("暂停");
}
//阻塞执行
p->execute(cmd,args);
}
void MyMplayer::on_pushButton_prev_clicked()
{
int row = ui->listWidget->currentRow();
if(row == 0)
row = ui->listWidget->count();
row--;
ui->listWidget->setCurrentRow(row);
p->kill();
p->waitForFinished();
QString cmd = QString("mplayer");
QStringList args;//参数
//记录当前正在播放的视频
current_video = ui->listWidget->currentItem()->text();
args<<"-quiet"<<"-slave"<<"-zoom"<<"-x"<<"600"
<<"-y"<<"360"<<current_video<<"&";
p->start(cmd,args);
}
void MyMplayer::on_pushButton_next_clicked()
{
int row = ui->listWidget->currentRow();
if(row == ui->listWidget->count()-1)
row = 0;
else
row++;
ui->listWidget->setCurrentRow(row);
p->kill();
p->waitForFinished();
QString cmd = QString("mplayer");
QStringList args;//参数
//记录当前正在播放的视频
current_video = ui->listWidget->currentItem()->text();
args<<"-quiet"<<"-slave"<<"-zoom"<<"-x"<<"600"
<<"-y"<<"360"<<current_video<<"&";
p->start(cmd,args);
}
void MyMplayer::on_pushButton_delete_clicked()
{
if(current_video == ui->listWidget->currentItem()->text())
{
p->kill();
p->waitForFinished();
}
int row = ui->listWidget->currentRow();
QListWidgetItem *item = ui->listWidget->takeItem(row);
if(item)
{
delete item;
on_pushButton_play_clicked();
}
}
void MyMplayer::on_pushButton_clear_clicked()
{
ui->listWidget->clear();
on_pushButton_stop_clicked();
}
void MyMplayer::on_listWidget_itemDoubleClicked()
{
on_pushButton_play_clicked();
}
main.cpp
#include "mymplayer.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMplayer w;
w.show();
return a.exec();
}
完整工程代码:https://download.csdn.net/download/weixin_43793181/13498337