赞
踩
目录
可以播放视频和音频
sudo apt install mplayer
由于arm版本qt没有多媒体模块,只能使用第三方播放器(mplayer或者madplay),对于arm平台而言,它就相当于一个可执行文件,可以当做命令来使用,在linux下可以使用system函数来执行mplayer,将播放音乐的命令集成到程序中,在qt中把mplayer当做是一个进程QProoess,那么,可以使用它来播放音乐
在linux上用交叉编译后将可执行文件放到开发板上,再安装第三方播放器,就可以运行了
- #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.00
- m_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.00
- if(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";
- }
- }
- }
在启动mplaver播放器的时候,使用选项参数 -input file=/tmp/fifo 将有名管道文件 传递给mplaver播放器进程,此时该mplaver播放器进程执行的时候,会打开该有名管道文件,Mplaver从有名管道读到主进程发送的命令。然后在编程中 往有名管道文件中 输入相关slave命令,达到控制播放器的效果。但是,如果使用get_fle_name等命令想要获取 从mplaver播放器 返回的数据,则还需要创建一个无名管道文件,然后再创建一个子进程,把子进程的标准输出重定向无名管道的写端,Mplayer发出的内容发送到无名管道中,父进程通过读管道就可以读到Mplayer发出的信息。
代码
- #include<stdio.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include<unistd.h>
- #include<string.h>
- #include<stdlib.h>
-
- int fifofd;
-
- int init_open()
- {
- //创建管道文件 --mkfifo
- int ret = mkfifo("/tmp/fifo",0777);
- if(ret==-1)
- {
- perror("mkfifo error");
- return -1;
- }
- //打开管道文件
- fifofd = open("/tmp/fifo",O_RDWR);
- if(fifofd==-1)
- {
- perror("open fifo error");
- return -1;
- }
- }
-
- int write_cmd(char *cmd)
- {
- //往管道写命令
- write(fifofd,cmd,strlen(cmd));
- }
-
- int main(void)
- {
- //初始化管道
- init_open();
- //使用slave命令,将管道和播放器绑定在一起
- system("mplayer -slave -quiet -input file=/tmp/fifo 1.mp3 &");
- while(1)
- {
- write_cmd("seek +10\n");
- sleep(3);
- }
- close(fifofd);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。