如何使用ffmpeg命令行进行录屏

录屏软件,我们去网上下载,发现有很多软件都是要收费的!但是录屏功能很难做吗?为啥都需要收费呢?

于是我整了个小demo,用于实现基础的屏幕录制功能。

思路很简单,考虑到 FFMpeg.exe是一个非常成熟的音视频处理软件,而且是开源的。我们完全可以基于 FFMpeg.exe来实现我们的要求。

使用 FFMpeg录屏通常有两种方式:

  1. 基于 gdigrab (使用CPU录制)

  2. 基于 DirectShow (使用显卡录制)

考虑到 gdigrab方式实现更简单,更轻量,兼容性也更好,所以我们采用 gdigrab方案。DirectShow方案需要额外下载 screen-capture-recorder!

基于该方法,主要核心就是 ffmpeg的命令编写,具体命令如下:

ffmpeg -f gdigrab -framerate 30 -offset_x 0 -offset_y 0 -video_size 1920x1080 -i desktop -r 30 -vcodec libx264 -pix_fmt yuv420p -y "output.mp4"

命令说明:


//注意:ffmpeg 的命令输入,也需要考虑输入顺序的。先指定输入参数,再指定输出参数。// -f 表示指定文件格式或采集数据的设备,如果是 DirectShow 方案,就需要指定为 screen-capture-recorder。    //对于输入,如果不指定-f, ffmpeg 会根据输入数据,来判断数据的封装格式.    //对于输出,如果不指定-f, ffmpeg 也可以通过输出文件名进行推导.    
//ffmpeg -formats 可以列出所有的formats
// -framerate 指定录制的视频帧率
// -offset_x -offset_y 指定录制的区域左上角坐标
// -video_size 指定录制的视频尺寸
// -i 指定从哪儿采集数据,它是一个文件索引号。这里是指定输入的视频源。(i 表示input,不一定是表示视频文件,表示输入。如也可以是音频文件输入等)
// -r 指定帧率
// -vcodec 指定编码格式。libx264 这种格式录制出来的视频,清晰度更清晰,占用的文件大小更小,推荐使用。
// -pix_fmt 像素格式,常规使用yuv420p
// -y 表示强制覆盖,如果输出文件已经存在,就覆盖
// 输出文件路径。这里需要注意下:输出文件路径带上 双引号 ,防止不合法路径将命令拆分了。

 为了更方便代码实现相关编码,下面贴上核心代码(附加音视频合并的示例代码):

/// <summary>/// 视频录制命令构建类/// </summary>public class FFMpegScreenRecordArgs : FFMpegArgs{public int Framerate { get; set; }public int Rate { get; set; }public Rect Region { get; set; }public VideoCodec Codec { get; set; }public PixelFormat PixelFormat { get; set; }public string SavePath { get; set; }public override string ToArgs(){ArgsBuilder.SetRecordDevice();ArgsBuilder.SetFramerate(Framerate);ArgsBuilder.SetRecordRect((int)Region.Left, (int)Region.Top);ArgsBuilder.SetVideoSize((int)Region.Width, (int)Region.Height);ArgsBuilder.SetInput();ArgsBuilder.SetRate(Rate);ArgsBuilder.SetCodec(Codec);ArgsBuilder.SetPixFarmat(PixelFormat);return $"{ArgsBuilder.GetArgs()} -y {SavePath}\"";}}/// <summary>/// 音视频合成构建类/// </summary>public class FFMpegAVSynthesisArgs : FFMpegArgs{public string InputAudioPath { get; set; }public string InputVideoPath { get; set; }public string OutputVideoPath { get; set; }public override string ToArgs(){this.ArgsBuilder.SetInput(InputAudioPath);this.ArgsBuilder.SetInput(InputVideoPath);this.ArgsBuilder.SetCodec(AudioCodec.copy);this.ArgsBuilder.SetCodec(VideoCodec.copy);return $"{ArgsBuilder.GetArgs()} \"{OutputVideoPath}\"";}}//基础命名构建类public class FFmpegArgsBuilder{protected readonly List<string> Args = new List<string>();public FFmpegArgsBuilder AddArg<T>(string Key, T Value){Args.Add($"-{Key} {Value}");return this;}public virtual string GetArgs(){return string.Join(" ", Args);}public void Reset(){Args.Clear();}#region argspublic FFmpegArgsBuilder SetRecordRect(int x, int y){AddArg("offset_x", x);AddArg("offset_y", y);return this;}public FFmpegArgsBuilder SetVideoSize(int width, int height){AddArg("video_size", $"{width}x{height}");return this;}public FFmpegArgsBuilder SetInput(string input = "desktop"){AddArg("i", input);return this;}public FFmpegArgsBuilder SetFramerate(int framerate){AddArg("framerate", framerate);return this;}public FFmpegArgsBuilder SetRate(int rate){AddArg("r", rate);return this;}public FFmpegArgsBuilder SetRecordDevice(string device = "gdigrab"){AddArg("f", device);return this;}public FFmpegArgsBuilder SetCodec(VideoCodec codec){            AddArg("vcodec", codec);return this;}public FFmpegArgsBuilder SetCodec(AudioCodec audioCodec){AddArg("acodec", audioCodec);return this;}public FFmpegArgsBuilder SetPixFarmat(PixelFormat x){AddArg("pix_fmt", x);return this;}#endregion}//像素格式public enum PixelFormat{///<summary>/// yuv420p///</summary>yuv420p,//……省略……}//编码格式public enum VideoCodec{///<summary>///      libx264///</summary>libx264,///<summary>///      copy///</summary>copy,//……省略……}/// <summary>///     Audio codec ("ffmpeg -codecs")/// </summary>public enum AudioCodec{///<summary>///      copy///</summary>copy,}

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

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

相关文章

Spring Boot 的核心原理和工作机制

1. 自动配置 (Auto-configuration) Spring Boot 的自动配置机制是它最引人注目的特性之一。它基于 Spring 的条件化配置&#xff08;Conditional Configuration&#xff09;&#xff0c;允许 Spring Boot 根据类路径上的依赖和 Bean 的存在来决定如何配置应用。以下是自动配置的…

Python实现批量下载邮箱中京东商城的发票

以QQ邮箱为例 可以设置获取指定时间内的邮件中的发票 可以设置获取指定地点内的邮件中的发票 import poplib from urllib import request from email import policy from email.parser import BytesParser from email.header import decode_header, make_header from email.he…

SpringBoot中的注解详解(一)

一、RestController、RequestMapping 1、RestController注解 RestController注解是SpringMVC中的一个组合注解&#xff0c;用于标记一个类为控制器类。它实际上是Controller和ResponseBody注解的组合&#xff0c;表示该类中的所有方法都会返回JSON、XML等格式的数据&#xff…

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

ES8安装配置kibana

Kibana安装及配置教程&#xff08;包含密码重置步骤&#xff09; 前提条件 确保系统中已安装Elasticsearch&#xff0c;版本应与Kibana一致&#xff08;例如 8.15.2&#xff09;。拥有sudo权限。 1. 添加Elastic GPG密钥 首先&#xff0c;添加Elastic的GPG密钥&#xff0c;确…

three.js 杂记

在Three.js中&#xff0c;Object3D是所有3D对象的基类&#xff0c;而Group是Object3D的一个子类。Group的目的是为了简化处理多个对象的集合。当你将对象添加到Group中时&#xff0c;它们会以一个单元格的形式被处理&#xff0c;参与Group的某些操作&#xff0c;例如位置更新、…

一文熟悉新版llama.cpp使用并本地部署LLAMA

0. 简介 最近是快到双十一了再给大家上点干货。去年我们写了一个大模型的系列&#xff0c;经过一年&#xff0c;大模型的发展已经日新月异。这一次我们来看一下使用llama.cpp这个项目&#xff0c;其主要解决的是推理过程中的性能问题。主要有两点优化&#xff1a; llama.cpp …

基于 Python flask 的微博舆论情感分析,微博大数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

flink+kafka 如何保证精准一次

在Flink与Kafka的集成中&#xff0c;要实现精确一次&#xff08;exactly-once&#xff09;处理语义&#xff0c;需要确保在发生故障时&#xff0c;无论是数据的重复还是丢失都不会发生。 1.1、Flink与Kafka集成时保证精确一次语义的关键步骤和组件&#xff1a; Kafka事务性Pro…

【编码】【特征选择】【降维】

简要介绍 编码&#xff08;Encoding&#xff09; 编码是将原始数据转换为模型能够理解和处理的格式的过程。常见的编码方法包括&#xff1a; 标签编码&#xff08;Label Encoding&#xff09;&#xff1a; 适用于类别较少的分类数据。将每个类别映射到一个唯一的整数。独热编…

大数据之多级缓存方案

多级缓存介绍&#xff1f;多级缓存优缺点&#xff0c;应用场景&#xff1f;多级缓存架构&#xff1f; 多级缓存介绍 多级缓存方案是一种优化手段&#xff0c;通过在多个级别上存储数据来提高应用程序的性能和响应速度。以下是对多级缓存方案的详细解析&#xff1a; 一、多级缓…

HBuilderX运行微信小程序,编译的文件在哪,怎么运行

1. 点击HBuilderX顶部的运行-运行到小程序模拟器-微信开发者工具&#xff0c;就会开始编译 2. 编译完成后的文件在根目录找到 unpackage -- dist -- dev -- mp-weixin, 这里面就是编译后的文件&#xff0c;如果未跳转到开发者工具&#xff0c;那可能是没设置启动路径&#xff0…

Git超详细笔记包含IDEA整合操作

git超详细笔记 文章目录 git超详细笔记第1章Git概述1.1、何为版本控制1.2、为什么需要版本控制1.3、版本控制工具1.4 、Git简史1.5、Git工作机制1.6 、Git和代码托管中心 第2章Git安装第3章Git常用命令3.1、设置用户签名3.2、初始化本地库本地库&#xff08;Local Repository&a…

人工智能理论之opencv图像预处理、数据库、GUI布局的综合应用(图像预处理版块)

文章目录 前言图像预处理卷积核概念图像平滑处理高斯滤波 双边滤波中值滤波Canny边缘检测图像形态学操作形态学梯度顶帽小结 图片预处理1.引入库 图像预处理错误尝试成功运行 总结 前言 对前面学习综合应用的总结&#xff0c;不单是一个版块&#xff0c;而是三个版块综合到一起…

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2…

【python程序】恢复曾经删除的QQ说说

是否还能想起曾经的QQ说说&#xff0c;是否还想知道自己以前删除了什么 今天就给大家介绍下这个可以恢复以前删除的QQ说说的 小工具 这个工具是由python编写的&#xff0c;也已经打包好了小程序&#xff0c;一键运行 具体下载地址&#xff1a;https://pan.quark.cn/s/b3f41e3…

【统计子矩阵——部分前缀和+双指针】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long ll; const int N 510; int s[N][N]; int main() {ios::sync_with_stdio(0);cin.tie(0);int n, m, k;cin >> n >> m >> k;for(int i 1; i < n; i)for(int j 1; j <…

Spring Boot 的核心注解

一、引言 Spring Boot 作为一种流行的 Java 开发框架&#xff0c;以其简洁高效的开发方式受到广泛关注。其中&#xff0c;核心注解在 Spring Boot 应用的开发中起着至关重要的作用。理解这些注解的含义和用法&#xff0c;对于充分发挥 Spring Boot 的优势至关重要。本文将深入剖…

Java版——设计模式笔记

Java版——设计模式笔记 设计模式的分类 创建型模式&#xff08;Creational&#xff09;&#xff1a;关注对象的实例化过程&#xff0c;包括了如何实例化对象、隐藏对象的创建细节等。常见的创建型模式有单例模式、工厂模式、抽象工厂模式等。结构型模式&#xff08;Structur…

多语言电商系统的多语言设计机制

在全球化电商市场中&#xff0c;跨语言沟通是提升用户体验和扩大市场份额的关键。为了满足不同语言用户的需求&#xff0c;构建一个支持多语言的电商系统已成为企业扩展国际市场的重要步骤。多语言电商系统需要能够根据用户的语言偏好自动显示内容&#xff0c;同时保证翻译的准…