//列出音视频设备
ffmpeg -list_devices true -f dshow -i dummy

//录屏命令

ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (High Definition Audio 设备)" -pix_fmt yuv420p -vcodec libx264 -acodec aac -s 1440x900 -r 25 -q 10 -ar 44100 -ac 2 -tune zerolatency -preset ultrafast D:/tt.mp4

关闭ffmpeg进程:向QProcess发送q字符

ScreenRecord.h

#pragma once
#include <QWidget>class QProcess;
class QFile;class ScreenRecord : public QWidget
{Q_OBJECT
public:ScreenRecord(QWidget *parent = Q_NULLPTR);void Init();public slots:void Start();void Pause();void Stop();private:QProcess* m_recordProcess;QStringList m_args;QString m_audioDeviceName;QString m_outPath;int m_width;int m_height;int m_fps;QFile* m_tmpText;QString m_err;QStringList m_errList;
};

ScreenRecord.cpp

#include "ScreenRecord.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QProcess>
#include <QTimer>
#include <QDebug>
#include <QTime>
#include <QDateTime>
#include <QFile>#include <Windows.h>ScreenRecord::ScreenRecord(QWidget *parent): QWidget(parent), m_recordProcess(new QProcess(this))
{connect(m_recordProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),[this](int exitCode, QProcess::ExitStatus exitStatus) {qDebug() << QStringLiteral("成功录制临时视频");});Init();QTimer::singleShot(1000, this, SLOT(Start()));QTimer::singleShot(5000, this, SLOT(Pause()));QTimer::singleShot(6000, this, SLOT(Start()));QTimer::singleShot(10000, this, SLOT(Stop()));
}void ScreenRecord::Init()
{QProcess *listProcess = new QProcess(this);connect(listProcess, &QProcess::readyReadStandardError, [listProcess, this]() {//QString tmp = pro->readAllStandardError();m_err.append(listProcess->readAllStandardError());//qDebug() << tmp;});connect(listProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),[this](int exitCode, QProcess::ExitStatus exitStatus) {m_errList = m_err.split("\r\n", QString::SkipEmptyParts);QStringList filter = m_errList.filter(QString::fromLocal8Bit("麦克风"));QString microphone = filter.first();QStringList filter2 = microphone.split("\"", QString::SkipEmptyParts);QStringList filter3 = filter2.filter(QString::fromLocal8Bit("麦克风"));//"麦克风 (High Definition Audio 设备)";m_audioDeviceName = "audio=" + filter3.first();m_outPath = QString("%1.mp4").arg(QDateTime::currentDateTime().toMSecsSinceEpoch());m_width = QApplication::desktop()->screenGeometry().width();m_height = QApplication::desktop()->screenGeometry().height();m_fps = 25;//QString audioName = "audio=" + QString::fromLocal8Bit("麦克风 (High Definition Audio 设备)");m_args << "-f" << "gdigrab";m_args << "-i" << "desktop";m_args << "-f" << "dshow";m_args << "-i" << m_audioDeviceName;m_args << "-pix_fmt" << "yuv420p";m_args << "-vcodec" << "libx264";m_args << "-acodec" << "aac";m_args << "-s" << QString::number(m_width) + "x" + QString::number(m_height);m_args << "-r" << QString::number(m_fps);m_args << "-q" << "10";m_args << "-ar" << "44100";m_args << "-ac" << "2";m_args << "-tune" << "zerolatency";m_args << "-preset" << "ultrafast";m_args << "-f" << "mp4";m_tmpText = new QFile(QString("D:\\t%1_tmp").arg(QDateTime::currentDateTime().toMSecsSinceEpoch()));if (!m_tmpText->open(QIODevice::ReadWrite | QIODevice::Text))qDebug() << "File open error";});QStringList listCmdArgs;listCmdArgs << "-list_devices" << "true" << "-f" << "dshow" << "-i" << "dummy";//listProcess->setWorkingDirectory("FFmpeg");listProcess->start("ffmpeg", listCmdArgs);
}void ScreenRecord::Start()
{//反斜线对应文本中是绝对路径,斜线对应相对路径QString tmpFilePath = QString("v%1_tmp").arg(QDateTime::currentDateTime().toMSecsSinceEpoch());QTextStream out(m_tmpText);out << "file" << " '" << tmpFilePath << "'\n";QStringList args = m_args;QString tmpFileAbsolutePath = "D:\\" + tmpFilePath;args << tmpFileAbsolutePath;//m_recordProcess->setWorkingDirectory("FFmpeg");m_recordProcess->start("ffmpeg", args);
}void ScreenRecord::Pause()
{//暂停录制->生成临时视频m_recordProcess->write("q");
}void ScreenRecord::Stop()
{//结束录制->合成视频connect(m_recordProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),[this](int exitCode, QProcess::ExitStatus exitStatus) {QProcess* mergeProcess = new QProcess(this);connect(mergeProcess, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),[mergeProcess, this](int exitCode, QProcess::ExitStatus exitStatus) {qDebug() << QStringLiteral("成功合成视频");qDebug() << mergeProcess->readAllStandardError();});//ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mkvQStringList args;args << "-f" << "concat";args << "-safe" << "0";args << "-i" << m_tmpText->fileName();args << "-c" << "copy";args << m_outPath;//合成视频mergeProcess->start("ffmpeg", args);});m_tmpText->close();m_recordProcess->write("q");
}

github

Qt调用FFmpeg命令录屏相关推荐

  1. linux下使用ffmpeg命令录屏桌面

    1 获取自己的屏幕分辨率 之所以要获取屏幕的分辨率,是因为录屏需要选择录制的范围! 1.在linux中可以直接使用xrandr命令查看屏幕当前分辨率(参考) xrandr base) shl@zhih ...

  2. Linux下使用ffmpeg命令录屏

    指定屏幕分辨率, 这种, 分辨率不能超过1024*768,  :0.0+100,200 表示 从左上角向下偏移量200像素, 向左偏移量100像素 ffmpeg -video_size 1024x76 ...

  3. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  4. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(四)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  5. C++调用ffmpeg命令推流【详细代码】

    我们可以使用ffmpeg命令进行很多工作,也可以在代码中调用ffmpeg指令进行相关操作,例如推流,录屏等,线面介绍C++调用ffmpeg命令进行rtmp推流.命令如下: ffmpeg.exe -re ...

  6. 前端使用html5、ffmpeg实现录屏摄像等功能

    前段时间做一个windows的桌面应用,vue + electron,涉及到录屏和摄像功能,网上相关的文档蛮少的给需要的人一些参考 如果文章描写有误或者还有更好的方法,请留言告诉我,笔芯 (´▽`ʃ♡ ...

  7. 通过ffmpeg进行录屏直播

    本来我是打算通过ffmpeg进行图片和成视频的,但是不知道什么原因编码出来后,都会只剩三秒,后来发现,可以直接通过ffmpeg进行录屏. 首先就是先下载ffmpeg.这里我将dll文件和exe文件放到 ...

  8. html5桌面录制,前端使用html5、ffmpeg实现录屏摄像等功能

    前段时间做一个windows的桌面应用,vue + electron,涉及到录屏和摄像功能,网上相关的文档蛮少的给需要的人一些参考 如果文章描写有误或者还有更好的方法,请留言告诉我,笔芯 (´▽`ʃ♡ ...

  9. java调用FFmpeg实现视屏压缩

    前言 最近做人脸识别,对于过大的视屏(10M)以上,识别失败的几率比较大.找了下相关的视屏压缩资料.首先使用的是jave进行视屏压缩,但是踩坑失败,jave中有转码的过程,虽然压缩成功,各种压缩参数也 ...

最新文章

  1. 海外博士一般朝九晚五,国内博士动辄十几个小时科研时间。为什么普遍认为海外博士水平比较高?...
  2. R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射
  3. tf.expand_dims 来增加维度
  4. java joptionpane调整大小_JAVA应用性能监控之JVM层GC调优
  5. Qt 多线程的简单演示
  6. 3分钟看完 Day2 Keynote
  7. linux入门 适合初学者_听说 C++ Primer-不适合初学者入门!元芳,你怎么看呢?
  8. 自动驾驶3-2 安全保证和测试的行业方法 Industry Methods for Safety Assurance and Testing
  9. java设计模式 观察者模式_JAVA设计模式之观察者模式
  10. EMG 3.0 QQ 机器人插件:wiki 问答系统
  11. [科研自学神器]中国大学MOOC下载器
  12. 计算机网络结构示意图,常用的计算机网络拓扑结构
  13. postgresql树形结构查询
  14. Python安装word2vec环境依赖
  15. 迪文屏用c语言控制按键触发,用迪文屏模拟了个加密键盘功能
  16. 如何用计算机播放高保真音乐,Marantz(马兰士)NA8005数字音乐流媒体播放机 各种音乐播放与操作方法详解...
  17. 大数据读心术丨这15条数据统计准爆了!
  18. kitti rotation,label等细节相关
  19. 嵌入式linux并行通信,嵌入式Linux
  20. 超好用的局域网传输文字文件软件

热门文章

  1. 《C++ Primer Plus》第17章:输入、输出和文件(6)
  2. 平方和:在1-40中只要数字中含有2,0,1,9的数字一共有28个,他们的和是574,平方和是14362。请问1-2019中,所有这样的输的平方和是多少?
  3. 【Multisim仿真】焦耳小偷电路仿真实验
  4. php实现ddns,动态域名DDNS实现
  5. 【计算机毕业设计】高校二手交易平台
  6. 渗透测试和红蓝对抗是什么意思?有什么区别?
  7. hive踩坑笔记 —— 开窗函数为聚合函数时,加order by 与不加 order by的区别
  8. 鱼和熊掌可以兼得——矛盾在管理艺术下的和谐
  9. 解决win10相机无法使用,相机崩溃问题
  10. 成都web前端前景怎么样?好找工作吗?