当前位置: 首页 > news >正文

FFmpeg.NET:.NET 平台上的音视频处理利器

FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库,能够方便地在 C# 项目中处理音视频文件。它支持多种操作,包括转码、剪辑、合并、分离音频等。

功能
  • 解析元数据
  • 从视频生成缩略图
  • 使用以下参数将音频和视频转码为其他格式:
    • 码率(Bit rate)
    • 帧率(Frame rate)
    • 分辨率(Resolution)
    • 显示比例(Aspect ratio)
    • 寻址位置(Seek position)
    • 时长(Duration)
    • 采样率(Sample rate)
    • 媒体格式(Media format)
  • 将媒体转换为物理格式和标准,如:
    • 标准包括:FILMPALNTSC
    • 媒体包括:DVDDVDV50VCDSVCD
  • 支持自定义 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. 选择性合并(手动处理冲突文件&#xf…...

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全流程支持(微软生态&#xff09…...

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…...

【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卡…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

Map相关知识

数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...