编辑
2025-11-22
C#
00

目录

简介
环境准备
1. 安装FFmpeg
2. NuGet包安装
基础知识
FFmpeg主要参数说明
代码实现
1. 基础工具类
2. 视频压缩功能实现
3. 分辨率调整功能实现
进度监控
结论

简介

FFmpeg是一个强大的开源多媒体框架,能够处理音频和视频。本文将详细介绍如何在C#项目中集成FFmpeg,实现视频压缩和分辨率调整功能。我们将通过实际代码示例,展示如何使用FFmpeg命令行工具进行视频处理。

环境准备

1. 安装FFmpeg

首先需要在系统中安装FFmpeg。有以下几种方式:

2. NuGet包安装

在C#项目中,我们需要安装FFmpeg包装器。推荐使用以下NuGet包:

XML
<PackageReference Include="Xabe.FFmpeg" Version="5.2.6" />

image.png

基础知识

FFmpeg主要参数说明

  • -i: 输入文件
  • -c:v: 视频编码器
  • -crf: 压缩质量(0-51,值越大压缩率越高,质量越低)
  • -preset: 压缩速度预设
  • -s: 分辨率设置
  • -b:v: 视频比特率
  • -aspect: 宽高比

代码实现

1. 基础工具类

C#
public class FFmpegHelper { private readonly string _ffmpegPath; public FFmpegHelper(string ffmpegPath) { _ffmpegPath = ffmpegPath; Xabe.FFmpeg.FFmpeg.SetExecutablesPath(ffmpegPath); } // 检查FFmpeg是否正确安装 public async Task<bool> CheckFFmpegInstallation() { try { var process = new Process { StartInfo = new ProcessStartInfo { FileName = Path.Combine(_ffmpegPath, "ffmpeg"), Arguments = "-version", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true } }; process.Start(); await process.WaitForExitAsync(); return process.ExitCode == 0; } catch { return false; } } }

2. 视频压缩功能实现

C#
public class VideoCompressor { private readonly FFmpegHelper _ffmpegHelper; public VideoCompressor(FFmpegHelper ffmpegHelper) { _ffmpegHelper = ffmpegHelper; } public async Task<bool> CompressVideo(string inputPath, string outputPath, int crf = 23) { try { var mediaInfo = await Xabe.FFmpeg.FFmpeg.GetMediaInfo(inputPath); IStream videoStream = mediaInfo.VideoStreams.FirstOrDefault(); IStream audioStream = mediaInfo.AudioStreams.FirstOrDefault(); var conversion = await Xabe.FFmpeg.FFmpeg.Conversions.New() .AddStream(videoStream) .AddStream(audioStream) .AddParameter($"-crf {crf}") .AddParameter("-preset medium") .SetOutput(outputPath) .Start(); return true; } catch (Exception ex) { Console.WriteLine($"压缩视频时发生错误: {ex.Message}"); return false; } } }

3. 分辨率调整功能实现

C#
public class VideoResizer { private readonly FFmpegHelper _ffmpegHelper; public VideoResizer(FFmpegHelper ffmpegHelper) { _ffmpegHelper = ffmpegHelper; } public async Task<bool> ResizeVideo(string inputPath, string outputPath, int width, int height) { try { var mediaInfo = await Xabe.FFmpeg.FFmpeg.GetMediaInfo(inputPath); IStream videoStream = mediaInfo.VideoStreams.FirstOrDefault() ?.SetSize(width, height); IStream audioStream = mediaInfo.AudioStreams.FirstOrDefault(); var conversion = await Xabe.FFmpeg.FFmpeg.Conversions.New() .AddStream(videoStream) .AddStream(audioStream) .SetOutput(outputPath) .Start(); return true; } catch (Exception ex) { Console.WriteLine($"调整视频分辨率时发生错误: {ex.Message}"); return false; } } }

进度监控

C#
public async Task<bool> CompressVideoWithProgress( string inputPath, string outputPath, IProgress<double> progress) { try { var conversion = Xabe.FFmpeg.FFmpeg.Conversions.New() .AddParameter($"-i {inputPath}") .AddParameter("-c:v libx264") .AddParameter("-crf 23") .SetOutput(outputPath); // 先设置进度事件 conversion.OnProgress += (sender, args) => { var percent = (double)args.Duration.Ticks / args.TotalLength.Ticks * 100; progress.Report(percent); }; // 最后开始转换 await conversion.Start(); return true; } catch { return false; } }

image.png

结论

通过本文的介绍,我们详细讲解了如何在C#中使用FFmpeg进行视频压缩和分辨率调整。从基础的环境搭建到高级的功能实现,提供了完整的解决方案。在实际应用中,建议根据具体需求调整参数,并做好异常处理和性能优化。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!