FFmpeg是一个强大的开源多媒体框架,能够处理音频和视频。本文将详细介绍如何在C#项目中集成FFmpeg,实现视频压缩和分辨率调整功能。我们将通过实际代码示例,展示如何使用FFmpeg命令行工具进行视频处理。
首先需要在系统中安装FFmpeg。有以下几种方式:
在C#项目中,我们需要安装FFmpeg包装器。推荐使用以下NuGet包:
XML<PackageReference Include="Xabe.FFmpeg" Version="5.2.6" />

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

通过本文的介绍,我们详细讲解了如何在C#中使用FFmpeg进行视频压缩和分辨率调整。从基础的环境搭建到高级的功能实现,提供了完整的解决方案。在实际应用中,建议根据具体需求调整参数,并做好异常处理和性能优化。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!