C# 使用ffmpeg将图片保存为mp4视频
使用 FFmpeg 这个强大的多媒体处理工具,可以轻松地将一系列图片转换为一个 MP4 视频文件。以下是一个基本的命令行示例来完成这个任务:
ffmpeg -framerate 25 -i image-%03d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4
命令参数说明:
-framerate 25:设置输入图像序列的帧率,这里表示每秒25帧。-i image-%03d.jpg:指定输入文件格式,这里的%03d是一个占位符,表示三位数字的索引(例如:image-001.jpg, image-002.jpg, ...)。FFmpeg 将按照这个模式查找并按顺序读取图片。-c:v libx264:指定输出视频流使用 H.264 编码器 (libx264) 进行压缩。-r 30:设置输出视频的帧率,这里是每秒30帧。-pix_fmt yuv420p:指定输出视频的颜色像素格式为 YUV 4:2:0 Planar,这是一种广泛兼容的格式。output.mp4:最终输出的 MP4 视频文件名。
如果图片文件名不是按照特定的数字序列表示,你需要根据实际情况调整 -i 参数后的文件名模板。同时,帧率等参数也应根据实际需求调整。如果源图片和目标视频有特殊的分辨率要求,还可以添加额外的参数比如 -s WIDTHxHEIGHT 来指定分辨率。
使用 C# 调用 FFmpeg 命令行来转换图片序列到 MP4 视频,下面是一个简单的示例:
using System.Diagnostics;public class FfmpegWrapper
{/// <summary>/// 执行FFmpeg/// </summary>/// <param name="inputPattern">输入文件名模式</param>/// <param name="outputVideoPath">输出文件路径</param>/// <param name="frameRate">帧率</param>public static void ConvertImagesToMp4(string inputPattern, string outputVideoPath, int frameRateInput = 25, int frameRateOutput = 30){// 构建 FFmpeg 命令行字符串string command = $"ffmpeg -framerate {frameRateInput} -i \"{inputPattern}\" -c:v libx264 -r {frameRateOutput} -pix_fmt yuv420p \"{outputVideoPath}\"";// 创建进程对象Process process = new Process();// 设置启动信息ProcessStartInfo startInfo = new ProcessStartInfo("ffmpeg"){Arguments = command,UseShellExecute = false,RedirectStandardError = true,RedirectStandardOutput = true,CreateNoWindow = true};// 将启动信息赋给进程对象process.StartInfo = startInfo;// 启动 FFmpeg 进程process.Start();// 如果需要,可以通过下面的方式获取错误输出或标准输出// string errorOutput = process.StandardError.ReadToEnd();// string standardOutput = process.StandardOutput.ReadToEnd();// 等待进程结束process.WaitForExit();// 检查退出代码以确认是否成功int exitCode = process.ExitCode;if (exitCode != 0){throw new Exception($"FFmpeg exited with code {exitCode}");}}
}// 使用示例:
FfmpegWrapper.ConvertImagesToMp4("image-%03d.jpg", "output.mp4");
请注意,上述代码假设 FFmpeg 可执行文件已经存在于系统的 PATH 环境变量中,否则你需要提供 FFmpeg 完整的路径到 ProcessStartInfo.FileName 中。
另外,如果你的应用场景复杂或者需要更深入的控制,可以考虑使用诸如 FFmpeg.AutoGen 这样的 .NET 绑定库来直接调用 FFmpeg 的 API 进行编程,而不是通过命令行接口。不过这通常涉及到更多的底层操作和对 FFmpeg 内部工作原理的理解。
%03d 表示三位数字索引
在某些编程上下文中,%03d 是一种格式化字符串的占位符表达方式,常见于 C、C++、Java、Python 等编程语言的 printf 风格的字符串格式化函数中。这里的 %03d 表示将一个整数格式化为至少占用三位宽度的十进制数字,不足三位时会在左边补零以达到固定宽度。
%d表示整数;0表示填充字符为零;3表示最小宽度为3。
所以,如果你需要四位或五位的数字索引,相应的表达方式会是:
- 四位数字索引:
%04d,比如数字1将会被格式化为"0001"; - 五位数字索引:
%05d,比如数字1将会被格式化为"00001"。
这样做的目的通常是保证输出的数字有固定的长度,便于对齐或其他形式上的统一处理。
在Windows环境下,假设FFmpeg可执行文件位于系统PATH环境变量中,可以直接在命令提示符窗口中运行上述命令。如果不是,则需要指定FFmpeg完整路径,例如:
"C:\path\to\ffmpeg.exe" -framerate 25 -i image-%03d.jpg -c:v libx264 -vf format=yuv420p -crf 23 -pix_fmt yuv420p output.mp4
如果 ffmpeg.exe 不在系统的环境变量 PATH 中,无法直接通过命令行调用,就需要提供它的完整路径。在这种情况下,应该将 FileName 属性设置为 ffmpeg.exe 的完整路径,例如:
string ffmpegFullPath = @"C:\Program Files\FFmpeg\bin\ffmpeg.exe";
process.StartInfo.FileName = ffmpegFullPath;
inputPattern 参数可以包含路径信息。在 FFmpeg 的命令行参数中,它可以是一个指向图片文件的完整路径或者相对路径。例如,如果你的图片位于某个目录下,你可以这样设置 inputPattern:
string imagesFolderPath = @"C:\MyImages";
string inputPattern = $"{imagesFolderPath}\\image-%04d.jpg";
FfmpegHelper.ConvertImagesToVideo(inputPattern, "output.mp4", 25);
-c:v libx264 指定 FFmpeg 使用 H.264 视频编码器,这是非常常用的视频编码格式,因为它具有高效的压缩性能和广泛的设备支持。除了 libx264,FFmpeg 支持多种其他的视频编码器,例如:
- libopenh264:OpenH264 编码器
- libvpx-vp9:VP9 编码器
- libaom-av1:AV1 编码器
- mpeg4 或 libxvid:MPEG-4 Part 2 编码器
- mpeg2video 或 libmpeg2: MPEG-2 编码器
- libtheora:Theora 编码器
- vp8 或 libvpx:VP8 编码器
- hevc 或 libx265:H.265/HEVC 编码器
对于 -pix_fmt 参数,它是指定输出视频的像素格式(Pixel Format)。yuv420p 是一种常见的像素格式,尤其是对于 H.264 编码器,它是一种兼容性非常好的 YUV 4:2:0 Planar 格式。然而,FFmpeg 支持多种不同的像素格式,例如:
- yuv422p
- yuv444p
- nv12
- p010le(10位深度的YUV 4:2:0格式)
- rgb24
- rgba
- gray (灰度图)
选择哪种像素格式取决于你的具体需求,包括编码效率、色彩精度、硬件加速支持等因素。例如,如果你需要更高色彩保真度,可能会选择 yuv444p 或 rgb 格式;而对于大多数视频流传输和存储应用,yuv420p 由于其较低的数据量而更为常见。
注意点:
- 确保输入图片的宽度为偶数,可以通过调整图片尺寸或添加一个过滤器使其变为偶数。
- 检查FFmpeg命令行参数,尤其是与编码相关的选项,如比特率、帧率、分辨率等,确保它们与目标编码器兼容。
- 如果需要,可以尝试更新FFmpeg版本或者重新配置编解码器参数以适应特定需求。
所需dll下载请点击:
使用ffmpeg将图片保存为mp4视频所需dll的64位
相关文章:
C# 使用ffmpeg将图片保存为mp4视频
使用 FFmpeg 这个强大的多媒体处理工具,可以轻松地将一系列图片转换为一个 MP4 视频文件。以下是一个基本的命令行示例来完成这个任务: ffmpeg -framerate 25 -i image-%03d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 命令参数说明…...
Java安全技术及代码审计技巧
概述 Java安全编码和代码审计是确保Java应用程序安全性的重要环节。本文旨在介绍Java中常见的Web漏洞、安全编码示例以及一些常见漏洞函数,并提供一个自动化查找危险函数的Python脚本。 1. XML外部实体 (XXE) 漏洞 介绍 XML文档结构包括XML声明、DTD文档类型定义&…...
C# 使用OpenCvSharp4将Bitmap合成为MP4视频的环境
环境安装步骤: 在VS中选中项目或者解决方案,鼠标右键,选择“管理Nuget包”,在浏览窗口中搜索OpenCVSharp4 1.搜索OpenCvSharp4,选择4.8.0版本,点击安装 2.搜索OpenCvSharp4.runtime.win,选择4.8.0版本,点…...
[游戏开发][Unity] 导出Xcode工程,完成调试与发布
Unity导出Xcode工程(模拟器版本与真机调试) [游戏开发][Unity] 打包Xcode工程模拟器真机调试_unity5 打包xcod-CSDN博客 Unity导出发布版本Xcode工程,上传app到官网,正式发布或创建TestFlight Xcode发布AppStore与TestFlight全流程_xcode 上传到testfit-…...
JSONP 实现跨域请求案例
后端使用 express 搭建,案例代码如下: const express require(express)const app express() const PORT 3000app.get(/data, (req, res) > {const jsonData {name: Alan,age: 666,city: GD}const callback req.query.callback // 获取前端中的回…...
2024年智慧城市、人文发展与区域经济国际会议(ICSCCDRE 2024)
2024年智慧城市、人文发展与区域经济国际会议(ICSCCDRE 2024) 2024 International Conference on Smart Cities, Cultural Development and Regional Economy 会议简介: 城市经济人文发展是一个综合性的过程,它关注城市在经济、…...
目标检测——PP-YOLO算法解读
PP-YOLO系列,均是基于百度自研PaddlePaddle深度学习框架发布的算法,2020年基于YOLOv3改进发布PP-YOLO,2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet,2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列,所以放一起解…...
多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测(一)数据集介绍和预处理-CSDN博客 风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测ÿ…...
Lvs+keepalived+nginx搭建高可用负载均衡集群
环境配置 master主机192.168.199.149,虚拟IP192.168.199.148 back备机192.168.199.150 真实服务器1 192.168.199.155 真实服务器2 192.168.199.156 关闭防火墙和selinux master配置(149) 添加虚拟IP ip addr add 192.168.199.148/24 …...
WPF —— 控件模版和数据模版
1:控件模版简介: 自定义控件模版:自己添加的样式、标签,控件模版也是属于资源的一种, 每一个控件模版都有一唯一的 key,在控件上通过template属性进行绑定 什么场景下使用自定义控件模版,当项目里面多个地方…...
如何动态修改spring中定时任务的调度策略(1)
在我们日常开发中经常会调度工具来处理一下需要定时执行的任务,比如定时导出报表数据给业务方发送邮件。你在工作中是如何这种定时调度? 如何实现调度任务 使用java技术栈的老铁来说,现成定时调度的解决方案应该有很多,总结来说…...
idea import的maven类报红
idea 报红/显示红色的原因 一般报红,显示红色,是因为 idea 在此路径下,找不到这个类。 找到是哪个 jar 包的类导致 idea 报红 点击报红的路径的上一层,进入jar 包。比如: import com.aaa.bbb.ccc.DddDto;这个 impo…...
React——class组件中setState修改state
class组件中通过state去存储当前组件的数据,那怎么对其进行修改呢?就是方法this.setState({ 要修改的部分数据 }) setState() 作用:1 、修改 state 内容;2 、更新 UI 特别注意:react的核心其实是虚拟dom(数…...
搭建基于 Snowflake 的 CI/CD 最佳实践!
Snowflake 提供了可扩展的计算和存储资源,和基于 SQL 的界面 Snowsight,方便用户进行数据操作和分析。然而,如果用户想将自己的 CI/CD 流程与 Snowflake 集成时,会发现一些不便之处(尤其相比其 SnowSight 优秀的查询能…...
数据结构(五)——树的基本概念
五、树 5.1 树的基本概念 5.1.1 树的定义 树是n(n>0)个结点的有限集合,结点数为0的树称为空树 非空树的特性 有且仅有一个根节点没有后继的结点称为“叶子结点”(或终端结点)有后继的结点称为“分支结点”(或非终端结点&a…...
2.28CACHE,虚拟存储器
主存储器,简称主存。CPU可以直接随机地对其进行访问,也可以和高速缓存器及辅助存储器交换数据。 2> 辅助存储器,简称辅存,不能与CPU直接相连,用来存放当前暂时不用的程序和数据 3> 高速缓冲存储器,位于主存和CPU之间,用来…...
深入理解栈和队列(一):栈
个人主页:17_Kevin-CSDN博客 专栏:《数据结构》 一、栈的概念 栈(Stack)是一种特殊的线性表,它遵循后进先出(Last-In-First-Out,LIFO)的原则。栈可以被看作是一个只能在一端进行操作…...
electron-builder 打包问题,下载慢解决方案
目录 问题说明设置下载源 ?解决方案思路下载Electron下载winCodeSign下载nsis下载nsis-resources 总结 问题说明 项目使用了Electron,在第一次打包时会遇见下载慢,导致打包进度几乎停滞不前,甚至可能直接报错 其实这是因为Electr…...
(简单成功)Mac:命令设置别名
案例:给"ls -l"命令,设置别名通过”ll“快速访问 1、在项目根目录底下查看有无.bash_profile文件,注意这个是个隐藏文件,需要使用ls -a命令查看: 没有.bash_profile新建一个文件, 在最后添加一行…...
Grok-1:参数量最大的开源大语言模型
Grok-1:参数量最大的开源大语言模型 项目简介 由马斯克领衔的大型模型企业 xAI 正式公布了一项重要动作:开源了一个拥有 3140 亿参数的混合专家模型(MoE)「Grok-1」,连同其模型权重和网络架构一并公开。 此举将 Gro…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
