qt学习:mplayer播放器(视频)+arm如何播放视频实战+c启动播放器

目录

作用

linux下载

arm下载

使用方法

键盘

命令

命令词有很多,举例几个

在arm上qt实战

配置ui界面

添加头文件,成员,函数

添加视频按钮点击事件

列表选项双击事件

播放按钮点击事件

暂停继续按钮点击事件

停止按钮点击事件

上一首按钮点击事件

下一首按钮点击事件

快进按钮点击事件

快退按钮点击事件

静音按钮点击事件

音量滑动条拖动事件

运行命令返回结果的槽函数

c调用播放器


作用

可以播放视频和音频

linux下载

sudo apt install mplayer

arm下载

由于arm版本qt没有多媒体模块,只能使用第三方播放器(mplayer或者madplay),对于arm平台而言,它就相当于一个可执行文件,可以当做命令来使用,在linux下可以使用system函数来执行mplayer,将播放音乐的命令集成到程序中,在qt中把mplayer当做是一个进程QProoess,那么,可以使用它来播放音乐

  1. 下载mplayer源码,进行交叉编译配置生成一个程序,一般都有现成的
  2. 将程序放到板子上的/bin目录下加权限
  3. 添加环境

使用方法

键盘

  • 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.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";
        }
    }
}

c调用播放器

在启动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;
}

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用Qt框架来创建一个简单的视频播放器,并在播放过程中显示进度条。首先,你需要安装Qt并配置好开发环境。 以下是一个简单的示例代码,演示了如何在Qt中使用MPlayer播放视频并显示进度条: ```cpp #include <QApplication> #include <QMediaPlayer> #include <QVideoWidget> #include <QSlider> #include <QBoxLayout> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建主窗口 QWidget window; window.setWindowTitle("Video Player"); // 创建视频播放器视频显示窗口 QMediaPlayer player; QVideoWidget videoWidget; player.setVideoOutput(&videoWidget); // 创建进度条 QSlider progressSlider(Qt::Horizontal); progressSlider.setRange(0, 0); // 设置范围为0,用于后续更新 // 连接视频播放器的信号和进度条的槽函数 QObject::connect(&player, &QMediaPlayer::durationChanged, &progressSlider, &QSlider::setMaximum); QObject::connect(&player, &QMediaPlayer::positionChanged, &progressSlider, &QSlider::setValue); // 创建垂直布局,并将视频显示窗口和进度条添加到布局中 QVBoxLayout layout; layout.addWidget(&videoWidget); layout.addWidget(&progressSlider); // 设置主窗口的布局 window.setLayout(&layout); // 打开视频文件 player.setMedia(QUrl::fromLocalFile("path/to/your/video.file")); // 显示主窗口并开始播放视频 window.show(); player.play(); return app.exec(); } ``` 请注意,上述代码中的`"path/to/your/video.file"`应替换为你要播放的视频文件的实际路径。 这只是一个简单的示例,你可以根据需要进行进一步的自定义和功能扩展。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值