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

news2024/12/27 1:54:38

目录

作用

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1437757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件

报错信息 VSCode无法连接远程服务器&#xff0c;终端一直提醒&#xff1a; [22:46:01.906] > Waiting for server log... [22:46:01.936] > Waiting for server log... [22:46:01.951] > [22:46:01.967] > Waiting for server log... [22:46:01.982] > [22:…

我在项目中使用Redis的几个场景

目录 缓存 会话存储 分布式锁 消息队列 位统计 计数器 排行榜 缓存 缓存的目的是为了提高系统响应速度、减少数据库等资源的压力&#xff0c;redis作为键值对形式的内存数 据库&#xff0c;可以提供非常快速的读取速度&#xff0c;使得它成为存储热点数据或频繁访问数…

iPhone 14支持NFC吗?如果支持,那么怎么启用

你准备好通过启用NFC来释放iPhone 14的全部潜力了吗&#xff1f;如果你曾经想知道如何在你的设备上利用NFC&#xff0c;那么你就来对地方了。 在本综合指南中&#xff0c;我们将引导你完成在iPhone 14上激活NFC的步骤&#xff0c;使你能够无缝连接其他设备&#xff0c;进行非接…

Linux------命令行参数

目录 前言 一、main函数的参数 二、命令行控制实现计算器 三、实现touch指令 前言 当我们在命令行输入 ls -al &#xff0c;可以查看当前文件夹下所有文件的信息&#xff0c;还有其他的如rm&#xff0c;touch等指令&#xff0c;都可以帮我们完成相应的操作。 其实运行这些…

c#cad 创建-直线(五)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是用于在AutoCAD中创建一条直线。首先获取当前活动文档和数据库的引用&#xff0c;然后创建一个编辑器对象用于提示用户输入。接下来&#xff0c;在一个事务中获取模型空间的块表记录&#xff0c;并定义直线的长度…

Python模拟点赞助手

背景 之前公司一直会安排各种学习任务&#xff0c;视频章节很多的视频&#xff0c;有些是技术的有些是政策相关的&#xff0c;如果没有按时完成学习任务会被通报。但是&#xff0c;这些学习内容不一定有帮助&#xff0c;所以大家就养成了刷课的习惯&#xff0c;也就是点开视频…

网络协议与攻击模拟_15FTP协议

了解FTP协议 在Windows操作系统上使用serv-U软件搭建FTP服务 分析FTP流量 一、FTP协议 1、FTP概念 FTP&#xff08;文件传输协议&#xff09;由两部分组成&#xff1a;客户端/服务端&#xff08;C/S架构&#xff09; 应用场景&#xff1a;企业内部存放公司文件、开发网站时利…

离线场景下任意文档的在线预览及原样格式翻译,不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化,可配置使用多种翻译语言

离线场景下任意文档的在线预览及原样格式翻译&#xff0c;不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化&#xff0c;可配置使用多种翻译语言。 要实现翻译需要解决以下3个主要问题&#xff1a; 1&#xff09;from&#xff1a;内容本身的语言类型是什么&#xf…

Android Studio从零基础到APP上线(3)

第3章 简单控件 本章介绍App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图,容纳视图的常用布局,响应点击的按钮控件,显示图片的图像视图等。然后结合本章所学的知识,演示一个实战项目“简单计算器”的设计与实现。 3.1 文本显示 本节介绍如何在文本视图Tex…

社交分享效果统计:Xinstall助您精确追踪用户行为,优化推广策略

在移动互联网时代&#xff0c;社交分享已成为App推广的重要手段之一。通过微信、QQ等社交工具及主流浏览器的多渠道分享邀请&#xff0c;可以实现裂变式的推广效果&#xff0c;迅速扩大App的用户群体。然而&#xff0c;如何精确统计社交分享带来的安装量、注册量等关键数据&…

SQL常用语句大全

我们在进行开发工作时&#xff0c;对数据库的操作是必不可少的&#xff0c;熟练掌握SQL语句可以让我们对数据库的数据处理变得非常简单&#xff0c;所以学习SQL语句是非常有必要的&#xff0c;下面汇总了一些常用的SQL语句 SQL语句的类型 DDL(Data Definition Language)数据定…

Deepin基本环境查看(八)【系统安全:房、车、查房、查车】

Deepin基本环境查看&#xff08;八&#xff09;【系统安全&#xff1a;房、车、查房、查车】 - 相关文章目录1、概述2、想象中的... 现实中的...1&#xff09;想象中的我2&#xff09;梦幻中的我3&#xff09;现实中的我 3 要房、要车、还是房车都要1&#xff09;超级计算机2&a…

Yearning审核平台本地安装配置并结合内网穿透实现远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…

【Linux系统化学习】自定义简易shell

目录 环境变量在进程替换中的继承 在当前进程中添加环境变量 putenv函数 环境变量被继承的原因 使用ecexle传递环境变量 传递自己的环境变量表 自定义简易的shell 获取主机、使用者、工作目录 获取命令 切割分解命令 创建子进程执行命令 内建命令的特殊处理 完整代…

CSS之盒子模型

盒子模型 01-选择器 结构伪类选择器 基本使用 作用&#xff1a;根据元素的结构关系查找元素。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IE…

根据MySql建表语句创建Java实体类工具

点击下载《根据MySql建表语句创建Java实体类工具》 1. 前言 在软件开发领域&#xff0c;特别是在构建企业级应用时&#xff0c;数据模型与代码模型之间的映射是至关重要的。该软件是一款基于C#开发的高效工具&#xff0c;它将这一繁琐且容易出错的过程变得简洁且快速。此工具…

5.0 ZooKeeper 数据模型 znode 结构详解

数据模型 在 zookeeper 中&#xff0c;可以说 zookeeper 中的所有存储的数据是由 znode 组成的&#xff0c;节点也称为 znode&#xff0c;并以 key/value 形式存储数据。 整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。 进入 zookeeper 安装的 …

【wu-lazy-cloud-network】Java自动化内网穿透

项目介绍 wu-lazy-cloud-network 是一款基于&#xff08;wu-framework-parent&#xff09;孵化出的项目&#xff0c;内部使用Lazy ORM操作数据库&#xff0c;主要功能是网络穿透&#xff0c;对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 功能 1.内网…

MRAM存内计算:现状及挑战

1 传统冯诺依曼瓶颈 随着人工智能、物联网、智能传感等应用的快速兴起&#xff0c;数据以爆发式的速度增长。海量数据的高效存储、迁移与处理成为当前信息领域的重大挑战。受限于经典的冯诺依曼计算架构存储与处理分离的特性&#xff0c;在面向大数据分析等应用场景中&#xff…

计算机设计大赛 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…