本文主要是介绍qt学习:mplayer播放器(视频)+arm如何播放视频实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
作用
可以播放视频和音频
linux下载
sudo apt install mplayer
arm下载
由于arm版本qt没有多媒体模块,只能使用第三方播放器(mplayer或者madplay),对于arm平台而言,它就相当于一个可执行文件,可以当做命令来使用,在linux下可以使用system函数来执行mplayer,将播放音乐的命令集成到程序中,在qt中把mplayer当做是一个进程QProoess,那么,可以使用它来播放音乐
- 下载mplayer源码,进行交叉编译配置生成一个程序,一般都有现成的
- 将程序放到板子上的/bin目录下加权限
- 添加环境
使用方法
进程
- mplayer xxx,xxx是播放的视频,可以通过键盘来控制
命令
- mplayer -slave -quiet xxx,xxx是播放的视频
- -slave是表示用命令的方式
- -quiet是表示不输出多余的信息
- 进入之后可以输入命令词来进行控制视频
命令词有很多,举例几个
- pause是暂停/播放
- seek xx快进xx秒,如果是负数就是后退
- get_time_length返回播放文件的长度,多少秒
- get_file_name返回当前播放文件的名字
- get_meta_year返回当前播放文件的年份
在arm上qt实战
在linux上用交叉编译后将可执行文件放到开发板上,再安装第三方播放器,就可以运行了
配置ui界面
添加头文件,成员,函数
#include <QProcess>
#include <QListWidgetItem>
#include <QFileDialog>
#include <QDebug>
#include <QThread>
#include <QTime>
#include <QPoint>private:QProcess *m_process;//进程指针int index;//歌曲索引
添加视频按钮点击事件
//弹出选择文件对话框,并返回选择文件的路径QStringList lists = QFileDialog::getOpenFileNames(this,"add video","","video file (*.mp4 *.MP4 *.avi)");//将添加的文件显示到列表上for(int i=0; i<lists.size(); i++){//新建一个选项QListWidgetItem *item = new QListWidgetItem;//选项设置图标item->setIcon(QIcon(":/new/prefix1/pic/video.png"));//将路径名字写入选项item->setText(lists.at(i).toLocal8Bit());//将选项加入到列表上ui->listWidget->addItem(item);}
列表选项双击事件
//获取列表的第几首歌曲index = ui->listWidget->currentRow();//并执行播放on_btn_player_clicked();
播放按钮点击事件
//先停止当前视频on_btn_stop_clicked();//获取并打印显示视频的控件的全局坐标和长宽int posX = ui->label_videoShow->mapToGlobal(QPoint(0, 0)).x();int posY = ui->label_videoShow->mapToGlobal(QPoint(0, 0)).y();int width = ui->label_videoShow->width();int height = ui->label_videoShow->height();qDebug()<<"geometry posX:"<<posX<<"\tgeometry posY:"<<posY;qDebug()<<"width:"<<width<<"\theight:"<<height;//组合视频播放字符串命令QString cmd = QString::fromLocal8Bit("mplayer -slave -quiet -geometry %1:%2 -zoom -x %3 -y %4 %5 &").arg(posX).arg(posY).arg(width).arg(height).arg(ui->listWidget->item(index)->text());//视频名字//通过进行来运行命令m_process->start(cmd.toLocal8Bit().data());//get_time_length返回播放文件的长度,以秒为单位 ANS_LENGTH=264.00m_process->write("get_time_length\n");//关联当进程运行命令的后返回结果时就会发出readyRead信号,会执行onRecvData槽函数//等于执行ls命令获取目录,当ls命令产生任何输出时,就会发出readyRead信号connect(m_process,&QProcess::readyRead,this,&MainWindow::onRecvData);
暂停继续按钮点击事件
//向进程写入命令m_process->write("pause\n");
停止按钮点击事件
//判断进程是否在运行,在运行就杀死进程if(m_process->state() == QProcess::Running){m_process->kill();}//等待直到子进程完成其工作或遇到错误并退出m_process->waitForFinished();
上一首按钮点击事件
//将索引加一index = --index < 0 ? (ui->listWidget->count()-1) :index;//并执行播放on_btn_player_clicked();
下一首按钮点击事件
//ui->listWidget->count();返回列表有多少哥选项//将索引加一index = ++index % ui->listWidget->count();//并执行播放on_btn_player_clicked();
快进按钮点击事件
//向进程写入命令m_process->write("seek +10\n");
快退按钮点击事件
//向进程写入命令m_process->write("seek -10\n");
静音按钮点击事件
//向进程写入命令m_process->write("mute\n");
音量滑动条拖动事件
//显示当前播放的音量数值ui->label_volumeValue->setText(QString::fromLocal8Bit("当前音量:%1").arg(position));
运行命令返回结果的槽函数
//运行命令的后的槽函数
void MainWindow::onRecvData()
{//获取并打印运行命令返回的数据QString data = m_process->readAll();qDebug()<<data;//从 m_process 读取的数据中是否包含字符串 "ANS_LENGTH"。如果包含,说明数据中包含了文件的时间长度信息//获取文件时间长度 ANS_LENGTH=264.00if(data.contains("ANS_LENGTH")){//返回来的时间长度是浮点型,必须转成浮点型,如果转成int 会转换失败bool ok;//首先移除 "ANS_LENGTH=" 字符串和换行符再转为浮点型double timeLength = data.remove("ANS_LENGTH=").remove("\n").toDouble(&ok);//判断有没有获取到数据if(ok){//创建一个时间对象,从0开始QTime timeFormat(0,0,0);//加入前面获取到的文件时间长度timeFormat = timeFormat.addSecs(timeLength);//显示时间长度ui->label_timeLength->setText(timeFormat.toString());//设置 时间长度滑动进度条的最大值为时间长度ui->horizontalSlider_seek->setMaximum(timeLength);}else{qDebug()<<"string to double error";}}
}
这篇关于qt学习:mplayer播放器(视频)+arm如何播放视频实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!