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位

 

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

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

相关文章

华为中心AP 配置入侵防御实验

配置入侵防御示例 组网图形 图1 入侵防御组网图 组网需求配置思路操作步骤中心AP的配置文件 组网需求 如图1所示&#xff0c;某企业部署了WLAN网络&#xff0c;内网用户可以访问Internet的Web服务器。现需要在中心AP上配置入侵防御功能&#xff0c;具体要求如下&#xff1a; 保…

接口VS抽象类,我该用哪个?

在Java编程中&#xff0c;接口和抽象类是两个核心概念&#xff0c;它们为面向对象编程提供了强大的支持。理解这两者的区别以及如何正确地使用它们&#xff0c;对于编写高效、可维护的代码至关重要。 接口&#xff08;Interface&#xff09; 接口是一种完全抽象的类&#xff…

程序运行时,常见存储区分类及作用

作用栈区&#xff08;stack&#xff09; 存放函数的形参和局部变量&#xff08;auto 类型&#xff09;&#xff0c;由编译器自动分配和释放。生命周期与函数调用相关&#xff0c;函数结束时自动回收。栈区的大小有限&#xff0c;通常较小。例如&#xff0c;函数参数和局部变量。…

Bert的一些理解

Bert的一些理解 Masked Language Model (MLM)Next Sentence Prediction (NSP)总结 参考链接1 参考链接2 BERT 模型的训练数据集通常是以预训练任务的形式来构建的&#xff0c;其中包括两个主要任务&#xff1a;Masked Language Model (MLM) 和 Next Sentence Prediction (NSP)。…

GPT-4与Claude3、Gemini、Sora:AI领域的技术创新与突破

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…

大模型提示工程和常用的几个场景下Prompt案例

提示工程指南 提示工程&#xff08;Prompt Engineering&#xff09;是一门较新的学科&#xff0c;关注提示词开发和优化&#xff0c;帮助用户将大语言模型&#xff08;Large Language Model, LLM&#xff09;用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了…

linux环境部署

war包环境 在Linux系统上部署准备war包环境 查看linux当前版本和系统类型 [rootlocalhost ~]# uname -a Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linuxlinux 打包文件夹 使用tar命令&#xff1…

【PG数据库】CentOS 7 安装 PostgreSQL 14

1 CentOS 7 安装 PostgreSQL 14 1.1下载离线安装包 下载方式&#xff1a;利用离线下载方式在虚拟机中安装PostgreSQL 14 下载链接&#xff1a; https://yum.postgresql.org/14/redhat/rhel-7-x86_64/repoview/postgresqldbserver14.group.html 依次进入下载&#xff1a; 1.…

安卓面试题多线程 66-70

66. 如何避免 Java 线程死锁?要想避免死锁,只需要破坏掉至少一个构造死锁的必要条件即可,而在操作系统中,互斥条件和不可剥夺条件是系统规定的,这也没办法人为更改,而且这两个条件很明显是一个标准的程序应该所具备的特性。所以目前只有请求并持有和环路等待条件是可以被…

24.3 分布式综合应用

24.3 分布式综合应用 1. 分布式事务1.1 分布式事务1.2 分布式事务方案1. 2pc2. 其他方案1.3 Seata分布式事务框架:基于2pc1. 简介2. 启动seata服务1.4 微服务事务案例分析1. 代码分析2. 基于Seata改造2. 分布式锁2.1 简介3. RabbitMQ应用

深度访谈:OpenAI缘何要进军光量子领域

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨王珩 编译/排版丨沛贤 深度好文&#xff1a;2000字丨12分钟阅读 据报道&#xff0c;人工智能巨头最近为其团队增添了一位新成员&#xff1a;Ben Bartlett&#xff0c;他是PsiQuantum的前…

【QT+QGIS跨平台编译】之八十四:【QGIS_Gui跨平台编译】—【错误处理:未实例化QgsMapLayer - QgsHighlight】

文章目录 一、未实例化QgsMapLayer二、错误处理 一、未实例化QgsMapLayer 报错信息&#xff1a; 二、错误处理 第31行修改为&#xff1a; #include "qgsmaplayer.h"

151,反转的单词

151. 反转字符串中的单词 已解答 中等 相关标签 相关企业 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串…

SM4对称加密算法

背景 这篇文章主要是记录下&#xff0c;sm4密钥生成的过程。因为对称加密暂时没什么好说的&#xff0c;分组加密的模式ECB和CBC等&#xff0c;优劣如果大家有疑问可以自行百度下。 先说下背景&#xff0c;是因为项目需要改造为sm4的前后端加解密算法&#xff0c;然后和前端同…

R语言系列6——R语言中的机器学习入门

目录 写在开头1. 监督学习基础1.1 线性回归模型原理简介在R语言中的实现解读模型输出 1.2 逻辑回归模型与线性回归的区别实现步骤 1.3 决策树工作原理在R中的构建模型评估与解释 1.4 随机森林基本概念与单一决策树的区别在R中的使用 2. 无监督学习概述2.1 聚类分析的详细介绍原…

HarmonyOS NEXT应用开发之多文件下载监听案例

介绍 多文件下载监听在应用开发中是一个非常常见的需求。本示例将介绍如何使用request上传下载模块实现多文件下载监听&#xff0c;如监听每个文件下载任务的进度&#xff0c;任务暂停&#xff0c;下载完成等下载情况。每个应用最多支持创建10个未完成的任务&#xff0c;相关规…

GB28181视频汇聚EasyCVR平台接入海康Ehome设备,设备在线但是视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

云原生相关知识

一、kubernetes 1 概述 Kubernetes&#xff08;也称 k8s 或 “kube”&#xff09;是一 个​​开源​​的容器编排平台&#xff0c;可以自动完成在部署、管理和扩展容器化应用过程中涉及的许多手动操作。 我们常说的编排的英文单词为 “Orchestration”&#xff0c;它常被解释…

苹果意将Gemini引入iPhone;英伟达发布新AI GPU;Grok正式开源

苹果正在谈判将 Gemini 引入 iPhone Mark Gurman 报道&#xff0c;苹果正在谈判将 Google 的生成式 AI 大模型 Gemini 引入 iPhone。 知情人士透露&#xff0c;两家公司正在积极谈判&#xff0c;让苹果获得 Gemini 授权&#xff0c;为今年 iPhone 软件的一些新功能提供动力。苹…

Rust 中的 Vec<u8> 类型

Vec<u8> 在 Rust 编程语言中是一种非常常见的类型&#xff0c;它是标准库提供的可变大小的字节向量&#xff08;vector&#xff09;类型。具体来说&#xff1a; Vec是一个实现了动态数组功能的集合类型&#xff0c;可以在运行时调整其长度。 <u8>指定了向量元素的具…