FFmpeg.NET:.NET 平台上的音视频处理利器
FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库,能够方便地在 C# 项目中处理音视频文件。它支持多种操作,包括转码、剪辑、合并、分离音频等。
功能
- 解析元数据
- 从视频生成缩略图
- 使用以下参数将音频和视频转码为其他格式:
- 码率(Bit rate)
- 帧率(Frame rate)
- 分辨率(Resolution)
- 显示比例(Aspect ratio)
- 寻址位置(Seek position)
- 时长(Duration)
- 采样率(Sample rate)
- 媒体格式(Media format)
- 将媒体转换为物理格式和标准,如:
- 标准包括:
FILM、PAL和NTSC - 媒体包括:
DVD、DV、DV50、VCD和SVCD
- 标准包括:
- 支持自定义 FFmpeg 命令行参数(在 v2.1.0 中新增)
- 支持进度事件通知
一、安装与配置
1. 安装 FFmpeg.NET
第一步,老规矩,先安装,注意包名是xFFmpeg.NET
Install-Package xFFmpeg.NET
2. 配置 FFmpeg 可执行文件
FFmpeg.NET 需要调用本地的 FFmpeg 可执行文件,因此需要下载并配置 FFmpeg:
- 下载 FFmpeg:FFmpeg 下载
- 解压并找到
ffmpeg.exe(Windows 系统)。 - 将
ffmpeg.exe放到你的项目文件夹或者将其路径添加到环境变量中。
二、主要功能
1. 解析元数据
可以轻松获取视频和音频文件的详细信息,如格式、分辨率、帧率等。
var inputFile = new InputFile(@"C:\Path\To_Video.flv");
var ffmpeg = new Engine("C:\\ffmpeg\\ffmpeg.exe");
var metadata = await ffmpeg.GetMetadataAsync(inputFile,new CancellationToken());Console.WriteLine($"Format: {metadata.VideoData.Format}");
Console.WriteLine($"ColorModel: {metadata.VideoData.ColorModel}");
Console.WriteLine($"FrameSize: {metadata.VideoData.FrameSize}");
Console.WriteLine($"BitRateKbs: {metadata.VideoData.BitRateKbs}");
Console.WriteLine($"Fps: {metadata.VideoData.Fps}");// 打印 AudioData 属性
Console.WriteLine($"Audio Format: {metadata.AudioData.Format}");
Console.WriteLine($"Audio BitRateKbs: {metadata.AudioData.BitRateKbs}");
Console.WriteLine($"Audio SampleRateHz: {metadata.AudioData.SampleRate}");
Console.WriteLine($"Audio Channels: {metadata.AudioData.ChannelOutput}");// 打印 FileInfo 属性
Console.WriteLine($"File FullName: {metadata.FileInfo.FullName}");
Console.WriteLine($"File Size: {metadata.FileInfo.Length} bytes");
Console.WriteLine($"File Name: {metadata.FileInfo.Name}");
输出:
Format: h264 (High) (avc1 / 0x31637661)
ColorModel: yuv420p(progressive)
FrameSize: 1920x1080
BitRateKbs: 1546
Fps: 30
Audio Format: aac (LC) (mp4a / 0x6134706D)
Audio BitRateKbs: 2
Audio SampleRateHz: 48000 Hz
Audio Channels: stereo
File FullName: D:\PrideJoy\PublicCode\FFmpegNETDemo\FFmpegNETDemo\bin\Debug\net8.0\ad84cd6c-ec9d-4464-a1ff-db629d74ec72.mp4
File Size: 7641169 bytes
File Name: ad84cd6c-ec9d-4464-a1ff-db629d74ec72.mp4
2. 从视频生成缩略图
可以从指定时间点提取视频帧作为缩略图。
var inputFile = new InputFile(@"C:\Path\To_Video.flv");
var outputFile = new OutputFile(@"C:\Path\To_Save_Image.jpg");var ffmpeg = new Engine("C:\\ffmpeg\\ffmpeg.exe");
var options = new ConversionOptions { Seek = TimeSpan.FromSeconds(15) };
await ffmpeg.GetThumbnailAsync(inputFile, outputFile, options,new CancellationToken());

3. 基本转换
可以将一种格式的视频或音频文件转换为另一种格式。
var inputFile = new InputFile(@"C:\Path\To_Video.flv");
var outputFile = new OutputFile(@"C:\Path\To_Save_New_Video.mp4");var ffmpeg = new Engine("C:\\ffmpeg\\ffmpeg.exe");
await ffmpeg.ConvertAsync(inputFile, outputFile);

4. 将媒体转换为物理格式和标准
例如,将 Flash 视频转换为 DVD 格式。
var inputFile = new InputFile(@"C:\Path\To_Video.flv");
var outputFile = new OutputFile(@"C:\Path\To_Save_New_DVD.vob");var conversionOptions = new ConversionOptions
{Target = Target.DVD,TargetStandard = TargetStandard.PAL
};var ffmpeg = new Engine("C:\\ffmpeg\\ffmpeg.exe");
await ffmpeg.ConvertAsync(inputFile, outputFile, conversionOptions);
5. 转码选项
可以设置详细的转码参数,如码率、帧率、分辨率等。
var inputFile = new InputFile(@"C:\Path\To_Video.flv");
var outputFile = new OutputFile(@"C:\Path\To_Save_New_Video.mp4");var conversionOptions = new ConversionOptions
{MaxVideoDuration = TimeSpan.FromSeconds(30),VideoAspectRatio = VideoAspectRatio.R16_9,VideoSize = VideoSize.Hd1080,AudioSampleRate = AudioSampleRate.Hz44100
};var ffmpeg = new Engine("C:\\ffmpeg\\ffmpeg.exe");
await ffmpeg.ConvertAsync(inputFile, outputFile, conversionOptions);
6. 视频剪辑
可以从视频中提取特定时间段的内容。
var inputFile = new InputFile(@"C:\Path\To_Video.flv");
var outputFile = new OutputFile(@"C:\Path\To_Save_ExtractedVideo.flv");var ffmpeg = new Engine("C:\\ffmpeg\\ffmpeg.exe");
var options = new ConversionOptions();// 从第30秒开始,提取25秒长的视频片段
options.CutMedia(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(25));
await ffmpeg.ConvertAsync(inputFile, outputFile, options);
7. 订阅视频处理进度
可以通过事件订阅的方式实时获取视频处理的进度信息。
public async Task StartConverting()
{var inputFile = new InputFile(@"C:\Path\To_Video.flv");var outputFile = new OutputFile(@"C:\Path\To_Save_New_Video.mp4");var ffmpeg = new Engine("C:\\ffmpeg\\ffmpeg.exe");ffmpeg.Progress += OnProgress;ffmpeg.Data += OnData;ffmpeg.Error += OnError;ffmpeg.Complete += OnComplete;await ffmpeg.ConvertAsync(inputFile, outputFile);
}private void OnProgress(object sender, ConversionProgressEventArgs e)
{Console.WriteLine("[{0} => {1}] Bitrate: {2}, Fps: {3}, Frame: {4}, ProcessedDuration: {5}, Size: {6} kb, TotalDuration: {7}",e.Input.FileInfo.Name, e.Output.FileInfo.Name, e.Bitrate, e.Fps, e.Frame, e.ProcessedDuration, e.SizeKb, e.TotalDuration);
}private void OnData(object sender, ConversionDataEventArgs e)
{Console.WriteLine("[{0} => {1}]: {2}", e.Input.FileInfo.Name, e.Output.FileInfo.Name, e.Data);
}private void OnComplete(object sender, ConversionCompleteEventArgs e)
{Console.WriteLine("Completed conversion from {0} to {1}", e.Input.FileInfo.FullName, e.Output.FileInfo.FullName);
}private void OnError(object sender, ConversionErrorEventArgs e)
{Console.WriteLine("[{0} => {1}]: Error: {2}\n{3}", e.Input.FileInfo.Name, e.Output.FileInfo.Name, e.Exception.ExitCode, e.Exception.InnerException);
}
三、总结
FFmpeg.NET 提供了一套强大的 API,使得在 .NET 平台上进行音视频处理变得简单而高效。无论是格式转换、提取音频、视频剪辑还是获取视频信息,FFmpeg.NET 都能胜任。根据具体需求,还可以利用其自定义命令行参数等功能实现更多高级操作。详细文档和功能请查阅官方文档或 FFmpeg 的文档。

相关文章:
FFmpeg.NET:.NET 平台上的音视频处理利器
FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库,能够方便地在 C# 项目中处理音视频文件。它支持多种操作,包括转码、剪辑、合并、分离音频等。 功能 解析元数据从视频生成缩略图使用以下参数将音频和视频转码为其他格式: 码率(…...
解决 Git 合并冲突:当本地修改与远程提交冲突时
目录 错误原因分析 解决方法 1. 暂存本地修改并合并(保留更改) 2. 丢弃本地修改(强制覆盖) 3. 暂存修改后合并(推荐:使用 git stash) 4. 选择性合并(手动处理冲突文件…...
SOME/IP-SD -- 协议英文原文讲解5
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.5 S…...
spark的一些指令
一,复制和移动 1、复制文件 格式:cp 源文件 目标文件 示例:把file1.txt 复制一份得到file2.txt 。那么对应的命令就是:cp file1.txt file2.txt 2、复制目录 格式:cp -r 源文件 目标文件夹 示例:把目…...
Redis常用数据类型及其应用案例
文章目录 Redis常用数据类型及其应用案例1. 字符串(String)1.1 简介1.2 应用案例1.2.1 缓存1.2.2 计数器 2. 哈希(Hash)2.1 简介2.2 应用案例2.2.1 存储用户信息2.2.2 购物车 3. 列表(List)3.1 简介3.2 应用…...
kafka数据拉取和发送
文章目录 一、原生 KafkaConsumer1、pom文件引入kafka2、拉取数据3、发送数据二、在spring boot中使用@KafkaListener1、添加依赖2、application.yml3、消息拉取:consumer4、自定义ListenerContainerFactory5、消息发送:producer6、kafka通过clientId鉴权时的鉴权失败问题一、…...
LLM全栈框架完整分类清单(预训练+微调+工具链)
一、预训练框架 1. 大规模分布式训练框架 框架名称核心能力GitHub地址Megatron-LM3D并行训练、FlashAttention支持、Transformer架构优化(NVIDIA生态)NVIDIA/Megatron-LMDeepSpeedZeRO优化系列、3D并行、RLHF全流程支持(微软生态)…...
蓝桥杯备考:贪心算法之矩阵消除游戏
这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…...
【Matlab仿真】Matlab Function中如何使用静态变量?
背景 根据Simulink的运行机制,每个采样点会调用一次MATLAB Function的函数,两次调用之间,同一个变量的前次计算的终值如何传递到当前计算周期来?其实可以使用persistent变量实现函数退出和进入时内部变量值的保持。 persistent变…...
DeepSeek 提示词:高效的提示词设计
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
深入学习Java中的Lambda表达式
深入学习Java中的Lambda表达式 自Java 8引入以来,Lambda表达式彻底改变了Java的编程风格,让代码变得更加简洁、易读,尤其是在函数式编程的场景中。接下来,我们将深入探讨Lambda表达式的语法、原理以及实际应用,帮助你…...
1.2 AI 量化炒股的起源与发展
**定性价值**:AI量化炒股通过算法模型实现投资决策自动化,显著提升交易效率与风险控制能力,打破传统人工交易的主观性与延迟性,推动金融科技向智能化、数据驱动方向迭代,具有颠覆传统投资模式的战略意义。 **定量价值…...
计算机单位之详解——存储单位Byte 网络传输单位bps 视频码率单位bps
前言: 计算机里面单位有点复杂,容易混淆,很多时候混起来就容易概念不理解,包括一些小问题,比如说:为什么我买了1T硬盘,实际存在虚标。为什么所谓的千兆宽带,下载起来没有1G每秒&…...
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时,有时即使关闭了应用,程序仍然占用端口(例如:4001 端口)。这会导致重新启动应用时出现端口被占用的错误&a…...
deepseek清华大学第二版 如何获取 DeepSeek如何赋能职场应用 PDF文档 电子档(附下载)
deepseek清华大学第二版 DeepSeek如何赋能职场 pdf文件完整版下载 https://pan.baidu.com/s/1aQcNS8UleMldcoH0Jc6C6A?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/3ee62050a2ac...
【python随手记】——读取文本文件内容转换为json格式
文章目录 前言一、TXT文件转换为JSON数组1.txt文件内容2.python代码3.输出结果 二、TXT文件转换为JSON对象1.txt文件2.python代码3.输出结果 前言 场景:用于读取包含空格分隔数据的TXT文件,并将其转换为结构化JSON文件 一、TXT文件转换为JSON数组 1.tx…...
k8s集群3主5从高可用架构(kubeadm方式安装k8s)
关键步骤说明 环境准备阶段 系统更新:所有节点执行yum/apt update确保软件包最新时间同步:通过ntpdate time.windows.com或部署NTP服务器网络规划:明确划分Service网段(默认10.96.0.0/12)和Pod网段(如Flann…...
基于 sklearn 的均值偏移聚类算法的应用
基于 sklearn 的均值偏移聚类算法的应用 在机器学习和数据挖掘中,聚类算法是一类非常重要的无监督学习方法。它的目的是将数据集中的数据点划分为若干个类,使得同一类的样本点彼此相似,而不同类的样本点相互之间差异较大。均值偏移聚类&…...
三、大模型微调的多种方法与应用场景
详解大模型微调的多种方法与应用场景 随着大模型的不断发展,如何有效地微调这些庞大的预训练模型以适应特定任务成为了研究和应用中的一个重要问题。大模型微调不仅能够提高任务性能,还能在不同的业务需求中提升模型的适应性。在本文中,我们…...
第2课 树莓派镜像的烧录
树莓派的系统通常是安装在SD卡上的。SD卡作为启动设备,负责启动树莓派并加载操作系统。这种设计使得树莓派具有便携性和灵活性,用户可以通过更换SD卡来更换操作系统或恢复出厂设置。 烧录树莓派的镜像即是将树莓派镜像烧录到SD卡上,在此期间会格式化SD卡,如果SD卡…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
