Qt ffmpeg音视频转换工具
Qt ffmpeg音视频转换工具,QProcess方式调用ffmpeg,对音视频文件进行格式转换,支持常见的音视频格式,主要在于QProcess的输出处理以及转换的文件名和后缀的处理,可以进一步加上音视频剪切合并和音视频文件属性查询修改的功能。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTextCodec>
#include <QFileDialog>
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QFont font;font.setPixelSize(16);setFont(font);setWindowTitle(QStringLiteral("ffmpeg工具"));ui->listWidget->setMaximumWidth(200);connect(ui->listWidget, SIGNAL(clicked(QModelIndex)), this, SLOT(convert()));ui->checkBox->setChecked(true);mProcess = new QProcess;connect(mProcess, SIGNAL(readyReadStandardError()), this, SLOT(readError()));connect(mProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));connect(mProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished(int,QProcess::ExitStatus)));mTimer = new QTimer(this);connect(mTimer, SIGNAL(timeout()), this, SLOT(updateTimer()));mTimer->start(1000);initListWidget();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::readError()
{QString str = mProcess->readAllStandardError().data();if (str == "\r"){ui->textBrowser->append(mTmpStr);mTmpStr.clear();}else{mTmpStr += str;if (str.contains("\r\n")){ui->textBrowser->append(mTmpStr);mTmpStr.clear();}}
}void MainWindow::readOutput()
{QByteArray qba = mProcess->readAllStandardOutput();QTextCodec* tc = QTextCodec::codecForName("System");QString str = tc->toUnicode(qba);if (str == "\r"){ui->textBrowser->append(mTmpStr);mTmpStr.clear();}else{mTmpStr += str;if (str.contains("\r\n")){ui->textBrowser->append(mTmpStr);mTmpStr.clear();}}
}void MainWindow::finished(int exitCode, QProcess::ExitStatus exitStatus)
{ui->textBrowser->append(QStringLiteral("finished : %1 %2").arg(exitCode).arg(exitStatus));mProcess->close();if (exitCode == 0 && exitStatus == 0){informationMessageBox(QStringLiteral("提示"), QStringLiteral("%1\n转换\n%2\n完成").arg(mSourceFile).arg(mTargetFile));}else{informationMessageBox(QStringLiteral("提示"), QStringLiteral("%1\n转换\n%2\n失败").arg(mSourceFile).arg(mTargetFile));}
}void MainWindow::updateTimer()
{if (!mTmpStr.isEmpty()){ui->textBrowser->append(mTmpStr);mTmpStr.clear();}
}void MainWindow::initListWidget()
{QStringList nameLst;nameLst.append(QStringLiteral("FLAC转MP3")); // ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3nameLst.append(QStringLiteral("M4A转MP3")); // ffmpeg -i 1.m4a -acodec libmp3lame -aq 0 123.mp3nameLst.append(QStringLiteral("WAV转MP3")); // ffmpeg -i input.wav -f mp3 -acodec libmp3lame -aq 0 output.mp3nameLst.append(QStringLiteral("APE转MP3")); // ffmpeg -i 1.ape -acodec libmp3lame -aq 0 123.mp3nameLst.append("");nameLst.append(QStringLiteral("MP4转M4A")); // ffmpeg -i test.mp4 -acodec copy -vn 123.m4anameLst.append(QStringLiteral("MP4转AAC")); // ffmpeg -i test.mp4 -acodec copy -vn 123.aacnameLst.append(QStringLiteral("MP4转MP3")); // ffmpeg -i test.mp4 -acodec libmp3lame -aq 0 123.mp3nameLst.append("");nameLst.append(QStringLiteral("MP3转OGG")); // ffmpeg -i bb.mp3 -acodec libvorbis -ab 128k bb.oggnameLst.append(QStringLiteral("MP3转WAV")); // ffmpeg -i input.mp3 -f wav output.wavQMap<QString, QString> cmdMap;cmdMap.insert(QStringLiteral("FLAC转MP3"), QStringLiteral("ffmpeg -i \"%1\" -ab 320k -map_metadata 0 -id3v2_version 3 -aq 0 \"%2\""));cmdMap.insert(QStringLiteral("M4A转MP3"), QStringLiteral("ffmpeg -i \"%1\" -acodec libmp3lame -aq 0 \"%2\""));cmdMap.insert(QStringLiteral("WAV转MP3"), QStringLiteral("ffmpeg -i \"%1\" -f mp3 -acodec libmp3lame -aq 0 \"%2\""));cmdMap.insert(QStringLiteral("APE转MP3"), QStringLiteral("ffmpeg -i \"%1\" -acodec libmp3lame -aq 0 \"%2\""));cmdMap.insert(QStringLiteral("MP4转M4A"), QStringLiteral("ffmpeg -i \"%1\" -acodec copy -vn \"%2\""));cmdMap.insert(QStringLiteral("MP4转AAC"), QStringLiteral("ffmpeg -i \"%1\" -acodec copy -vn \"%2\""));cmdMap.insert(QStringLiteral("MP4转MP3"), QStringLiteral("ffmpeg -i \"%1\" -acodec libmp3lame -aq 0 \"%2\""));cmdMap.insert(QStringLiteral("MP3转OGG"), QStringLiteral("ffmpeg -i \"%1\" -acodec libvorbis -ab 128k \"%2\""));cmdMap.insert(QStringLiteral("MP3转WAV"), QStringLiteral("ffmpeg -i \"%1\" -f wav \"%2\""));foreach (QString name, nameLst){QListWidgetItem *item = new QListWidgetItem;if (!name.isEmpty()){item->setText(name);item->setData(Qt::UserRole, cmdMap.value(name));}else{item->setText("");item->setData(Qt::UserRole, "");}ui->listWidget->addItem(item);}
}QString MainWindow::getFileSuffix(QString file)
{QString ret;if (file == "FLAC"){ret = QStringLiteral("flac");}else if (file == "MP3"){ret = QStringLiteral("mp3");}else if (file == "M4A"){ret = QStringLiteral("m4a");}else if (file == "WAV"){ret = QStringLiteral("wav");}else if (file == "APE"){ret = QStringLiteral("ape");}else if (file == "AAC"){ret = QStringLiteral("aac");}else if (file == "MP4"){ret = QStringLiteral("mp4");}else if (file == "OGG"){ret = QStringLiteral("ogg");}return ret;
}void MainWindow::convert()
{QListWidgetItem *item = ui->listWidget->currentItem();QString tmp = item->data(Qt::UserRole).toString();if (mProcess->isOpen()){mProcess->close();}mSourceFile.clear();mTargetFile.clear();mSource.clear();mTarget.clear();mSourceSuffix.clear();mTargetSuffix.clear();if (!tmp.isEmpty()){mTitle = item->text();mCmd = tmp;setWindowTitle(QStringLiteral("ffmpeg工具 - %1").arg(mTitle));}else{mTitle.clear();mCmd.clear();setWindowTitle(QStringLiteral("ffmpeg工具"));}
}bool MainWindow::informationMessageBox(const QString &title, const QString &text, bool isOnlyOk)
{QMessageBox msgBox(this);msgBox.setFont(this->font());msgBox.setIcon(QMessageBox::Information);msgBox.setWindowTitle(title);msgBox.setText(text);if (isOnlyOk){msgBox.setStandardButtons(QMessageBox::Ok);msgBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定"));}else{msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);msgBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定"));msgBox.setButtonText(QMessageBox::Cancel, QStringLiteral("取消"));}return (msgBox.exec() == QMessageBox::Ok);
}void MainWindow::closeEvent(QCloseEvent *event)
{if (informationMessageBox(QStringLiteral("提示"), QStringLiteral("确定关闭"), false)){event->accept();}else{event->ignore();}
}void MainWindow::on_pushButton_import_clicked()
{if (mTitle.isEmpty() || mCmd.isEmpty()){return;}mSource = mTitle.split(QStringLiteral("转"))[0];mTarget = mTitle.split(QStringLiteral("转"))[1];mSourceSuffix = getFileSuffix(mSource);mTargetSuffix = getFileSuffix(mTarget);if (mSourceSuffix.isEmpty() || mTargetSuffix.isEmpty()){informationMessageBox(QStringLiteral("提示"), QStringLiteral("不支持的文件格式"));return;}QString file = QFileDialog::getOpenFileName(this, QStringLiteral("打开%1文件").arg(mSource), QStringLiteral("."), QStringLiteral("%1文件(*.%2)").arg(mSource).arg(mSourceSuffix));if (!file.isEmpty()){mSourceFile = file;if (ui->checkBox->isChecked()){QString tmp = mSourceFile;mTargetFile = tmp.replace(QStringLiteral(".%1").arg(mSourceSuffix), QStringLiteral(".%1").arg(mTargetSuffix));}}
}void MainWindow::on_pushButton_save_clicked()
{if (mSourceFile.isEmpty()){return;}QString file = QFileDialog::getSaveFileName(this, QStringLiteral("保存%1文件").arg(mTarget), mTargetFile, QStringLiteral("%1文件(*.%2)").arg(mTarget).arg(mTargetSuffix));if (!file.isEmpty()){mTargetFile = file;}
}void MainWindow::on_pushButton_convert_clicked()
{if (mSourceFile.isEmpty() || mTargetFile.isEmpty()){return;}QString cmd = mCmd.arg(mSourceFile).arg(mTargetFile);ui->textBrowser->append("\n" + cmd + "\n");if (mProcess->isOpen()){mProcess->close();}mTmpStr.clear();mProcess->start(cmd);
}
相关文章:
Qt ffmpeg音视频转换工具
Qt ffmpeg音视频转换工具,QProcess方式调用ffmpeg,对音视频文件进行格式转换,支持常见的音视频格式,主要在于QProcess的输出处理以及转换的文件名和后缀的处理,可以进一步加上音视频剪切合并和音视频文件属性查询修改的…...
机器学习笔记 - 视频分析和人类活动识别技术路线简述
一、理解人类活动识别 首先了解什么是人类活动识别,简而言之,是对某人正在执行的活动/动作进行分类或预测的任务称为活动识别。 我们可能会有一个问题:这与普通的分类任务有什么不同?这里的问题是,在人类活动识别中,您实际上需要一系列数据点来预测正确执行的动作。 看看…...
Redis从入门到精通(三:常用指令)
前边我们介绍了redis存储的四种基本数据类型,并纵向介绍了这四种数据类型的各种指令操作,现在我们这个章节从横向来总结一下关于key的常用指令和数据库常用指令 key常用指令 删除指定key del key 获取key是否存在 exists key 获取key的类型 type …...
代码随想录day39 || 动态规划 || 不同路径
62.不同路径 ● 力扣题目链接 ● 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 ● 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 ● 问总共有…...
电商平台API接口采集电商平台淘宝天猫京东拼多多数据获取产品详情信息,销量,价格,sku案例
淘宝SKU详情接口是指,获取指定商品的SKU(Stock Keeping Unit,即库存量单位)的详细信息。SKU是指提供不同的商品参数组合的一个机制,通过不同的SKU来标识商品的不同组合形式,如颜色、尺寸等。SKU详情接口可以…...
The ‘<‘ operator is reserved for future use. 错误解决
The < operator is reserved for future use. 错误解决 在 PowerShell 终端执行 python learnstock.py < ldata.txt 发生错误, The < operator is reserved for future use.解决方法, cmd /c python learnstock.py < ldata.txt完结&#x…...
vulnhub靶机Thoth-Tech
下载地址:https://download.vulnhub.com/thothtech/Thoth-Tech.ova 主机发现 arp-scan -l 目标:192.168.21.148 端口扫描 nmap --min-rate 10000 -p- 192.168.21.148 服务扫描 nmap -sV -sT -O -p21,22,80 192.168.21.148 漏洞扫描 nmap --scriptvu…...
不可思议,无密码登录所有网站!
hello,我是小索奇 居然可以免密码登录你的网站?听起来是不是很恐怖 确实如此,Cookie可以用于保持用户在网站上的登录状态,从而实现 免密码登录,学会了不要做坏事哈 这里仅做免密码登录的实操,就不介绍Cooki…...
深度学习编译器关键组件
1 高层中间代码 为了克服传统编译器中采用的IR限制DL模型中复杂计算的表达的局限性,现有的DL编译器利用高层IR(称为图IR)进行高效的代码优化设计。 1.1 图表示 基于DAG的IR:基于DAG的IR是编译器构建计算图的最传统方法之一&…...
【C++】string类模拟实现下篇(附完整源码)
目录 1. resize2. 流插入<<和流提取>>重载2.1 流插入<<重载2.2 流提取 << 3. 常见关系运算符重载4. 赋值重载4.1浅拷贝的默认赋值重载4.2 深拷贝赋值重载实现4.3 赋值重载现代写法 5. 写时拷贝(了解)6.源码6.1 string.h6.2 test.cpp 1. res…...
Android高级开发-APK极致优化
九道工序 1. SVG(Scalable Vector Graphics)可缩放矢量图 使用矢量图代替位图可以减小 APK 的尺寸,因为可以针对不同屏幕密度调整同一文件的大小,而不会降低图像质量。 矢量图首次加载时可能消耗更多的 CPU 资源。之后,二者的内存使用率和…...
Rocketmq--消息驱动
1 MQ简介 1.1 什么是MQ MQ(Message Queue)是一种跨进程的通信机制,用于传递消息。通俗点说,就是一个先进先出的数据结构。 1.2 MQ的应用场景 1.2.1 异步解耦 最常见的一个场景是用户注册后,需要发送注册邮件和短信通…...
华为云云耀云服务器L实例评测|centos系统搭建git私服
搭建git私服 前言一、华为云云耀云服务器L实例租用二、华为云云耀云服务器L实例安装git三、华为云云耀云服务器L实例git配置1.创建文件用于存放公钥2.设置文件权限3.配置本地公钥 四、华为云云耀云服务器L实例部署git仓库四、git仓库到本地总结 前言 之前一直想搭建一个属于自…...
苹果CMS主题 MXonePro二开优化修复开源版影视网站源码
MXPro模板主题(又名:mxonepro)是一款基于苹果cms程序的一款全新的简洁好看UI的影视站模板类似于西瓜视频,不过同对比MxoneV10魔改模板来说功能没有那么多,也没有那么大气,但是比较且可视化功能较多简洁且有周更记录样式等多功能后台设置&…...
【新版】系统架构设计师 - 软件架构设计<轻量级架构>
个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 软件架构设计<轻量级架构>考点摘要轻量级架构表示层业务逻辑层持久层数据库 SSH与SSMORMHibernate与Mybatis 架构 - 软件架构设计<轻量级架构> 考点…...
系统架构设计专业技能 ·结构化需求分析 - 数据流图
现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 结构化需求分析 - 数据流图 一、数据流图的基本概念二、需…...
linux内核分析:线程和进程创建,内存管理
lec18-19:进程与线程创建 lec20-21虚拟内存管理 内核代码,全局变量这些只有一份,但是内核栈有多份,这可能就是linux线程模型1对1模式的由来。通过栈来做的 x86 CPU支持分段和分页(平坦内存模式)两种 分段,选择子那里就有特权标记了...
SpringMvc根据返回值类型不同处理响应
目录 一、介绍 二、返回值为void (1)控制层方法 三、返回值为String (1)控制层 四、返回值为ModelAndView (1)控制层方法 (2)jsp页面 一、介绍 我们可以通过控制器方法的返回…...
jq命令安装与使用
目录 一、简介二、下载及安装1.Linux 安装2.Windows 安装3.测试安装结果 三、jq用法1.基本语法2.常见用法1)格式化 JSON2)获取属性3)属性不存在情况处理4)数组遍历、截取、展开5)管道、逗号、加号6)数据构造…...
网络面试题汇总
简述 TCP 连接的过程(淘系) 参考答案: TCP 协议通过三次握手建立可靠的点对点连接,具体过程是: 首先服务器进入监听状态,然后即可处理连接 第一次握手:建立连接时,客户端发送 syn 包…...
Java————初始集合框架
一 、 集合框架 Java 集合框架Java Collection Framework ,又被称为容器container , 是定义在 java.util 包下的一组接口interfaces 和其实现类classes 。 其主要表现为将多个元素element 置于一个单元中, 用于对这些元素进行快速、便捷的存…...
SpringMvc如何向context域设置数据
目录 (1)控制层方法 (2)jsp页面 context作用域表示在整个应用范围都有效。在SpringMVC中对context作用域传值,只能使用ServletContext对象来实现。但是该对象不能直接注入到方法参数中,需要通过HttpSessi…...
深入探索智能问答:从检索到生成的技术之旅
目录 一、智能问答概述1. **语义理解**2. **知识库和数据库**3. **上下文感知**4. **动态学习和自适应** 二、发展历程1. **基于规则的系统**2. **统计方法的兴起**3. **深度学习和神经网络的突破**4. **预训练模型** 三、智能问答系统的主要类型四、基于知识库的问答系统五、基…...
02_Flutter自定义Sliver组件实现分组列表吸顶效果
02_Flutter自定义Sliver组件实现分组列表吸顶效果 一.先上效果图 二.列表布局实现 比较简单,直接上代码,主要使用CustomScrollView和SliverToBoxAdapter实现 _buildSection(String title) {return SliverToBoxAdapter(child: RepaintBoundary(child: C…...
uniapp实现大气质量指标图(app端小程序端均支持,app-nvue不支持画布)
效果图如下: 思路: 1.首先我想到的就是使用图标库echarts或ucharts,可是找了找没有找到类似的。 2.其次我就想用画布来实现这个效果,直接上手。(app-vue和小程序均可以实现,但是在app-nvue页面不支持画布…...
Oracle for Windows安装和配置——2.1.Oracle for Windows安装
2.1.1. 准备Oracle软件 1)下载或拷贝安装软件 下载地址:otn.oracle.com或my oracle support。下载文件列表。具体如图2.1.1-1所示。 图2.1.1-1 下载文件列表 --说明: 1)通过otn.oracle.com站点,可以免费下载用于安装的Oracle…...
2.SpringEL bean引用实例
SpringEL bean引用实例 文章目录 SpringEL bean引用实例介绍Spring EL以注解的形式Spring EL以XML的形式 介绍 在Spring EL,可以使用点(.)符号嵌套属性参考一个bean。例如,“bean.property_name” public class Customer {Value("#{addressBean.c…...
通用商城项目(下)之——Nginx的安装及使用
(作为通用商城项目的一个部分,单独抽离了出来。查看完整见父页面: ) 加入Nginx-完成反向代理、负载均衡和动静分离 1.配置SSH-使用账号密码,远程登录Linux 1.1配置实现 1、配置sshd 1)sudo vi /etc/ssh/sshd_confi…...
滑动时间窗口的思想和实现,环形数组,golang
固定时间窗口 在开发限流组件的时候,我们需要统计一个时间区间内的请求数,比如以分钟为单位。所谓固定时间窗口,就是根据时间函数得到当前请求落在哪个分钟之内,我们在统计的时候只关注当前分钟之内的数量,即 [0s, 60…...
SpringBoot 使用异步方法
SpringBoot 使用异步方法 在pom文件引入相关依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframe…...
公司委托建设网站合同范本/成品短视频网站源码搭建
从上一周周一学习KMP算法之后,每天晚上都失眠到1点过起夜,身体再疲倦脑子都异常清醒,要死了要死了。 kmp算法真的有毒。 这个题,我用优先队列记录最小的下标,用Map记录每个数字是第几天,然后让那个值和队列…...
深圳专业网站建设制作价格/佛山百度推广公司
当你发布一个应用之后,(取决于具体的发布时间)可能没过几个月 Android 系统就发布了一个新版本。这对你的应用意味着什么,所有东西都不能用了? 别担心,向前兼容是 Android 非常关注的事情。用户在升级到新版 Android 的时候&…...
wordpress pin/51外链代发网
https://www.anquanke.com/post/id/104401 http://blog.nsfocus.net/cve-2018-1273/ http://www.freebuf.com/news/7080.html http://bbs.qcloud.com/thread-49690-1-1.html http://www.cnvd.org.cn/webinfo/show/4247...
wordpress后台密码默认/怎样建立一个网络销售平台
图像阈值分割-全局阈值分割 1. 全局阈值分割 在Halcon中,算子threshold、fast_threshold实现全局阈值分割,其原型如下: threshold(Image : Region : MinGray, MaxGray : ) 参数Image:输入图像Region:输出分割区域MinGray&…...
网站当前位置怎么做/网络推广员每天的工作是什么
HTML 速查列表. 你可以可以打印它,以备日常使用。HTML 基本文档文档标题基本标签(Basic Tags)最大的标题. . . . . . . . . . . . 最小的标题这是一个段落。(换行)(水平线)文本格式化(Formatting)粗体文本计算机代码强调文本斜体文本键盘输入预格式化文本更小的文本…...
容桂网站制作信息/北京做的好的seo公司
1、多长时间将业务上线当使用独立服务器时,要将业务部署上线所需的时间最低在1-3天左右。因为涉及服务器硬件配置、上架通电、环境设置、调试等,这系列工作完成后才能交付予您正常使用。但通过2、CPU、内存或磁盘升级云服务器和独立服务器都允许硬件升级…...