在视频处理中,调整帧率(FPS - Frames Per Second)是一个常见的需求。本文将介绍如何使用C#配合Xabe.FFmpeg库来实现视频帧率的调整。
HTMLhttps://ffmpeg.org/download.html
- 将FFmpeg添加到系统环境变量
2. 安装NuGet包
BashInstall-Package Xabe.FFmpeg

C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xabe.FFmpeg;
namespace App06
{
public class VideoFrameRateConverter
{
/// <summary>
/// 调整视频帧率的基础方法
/// </summary>
/// <param name="inputPath">输入视频路径</param>
/// <param name="outputPath">输出视频路径</param>
/// <param name="targetFrameRate">目标帧率</param>
/// <returns>转换任务</returns>
public async Task ConvertFrameRateAsync(string inputPath, string outputPath, int targetFrameRate)
{
try
{
// 设置FFmpeg可执行文件路径
FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin");
// 获取视频信息
var mediaInfo = await FFmpeg.GetMediaInfo(inputPath);
var videoStream = mediaInfo.VideoStreams.First();
var conversion = FFmpeg.Conversions.New()
.AddStream(videoStream)
.SetFrameRate(targetFrameRate)
.SetPreset(ConversionPreset.Fast)
.SetOutput(outputPath);
// 添加进度处理
conversion.OnProgress += (sender, args) =>
{
var percent = (int)(args.Duration.TotalSeconds / args.TotalLength.TotalSeconds * 100);
Console.WriteLine($"转换进度: {percent}%");
};
// 执行转换
await conversion.Start();
}
catch (Exception ex)
{
Console.WriteLine($"转换过程中发生错误: {ex.Message}");
throw;
}
}
}
}
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xabe.FFmpeg;
namespace App06
{
public class AdvancedVideoFrameRateConverter
{
/// <summary>
/// 高级视频帧率调整方法
/// </summary>
/// <param name="inputPath">输入视频路径</param>
/// <param name="outputPath">输出视频路径</param>
/// <param name="targetFrameRate">目标帧率</param>
/// <param name="preset">编码预设</param>
/// <param name="crf">视频质量参数(0-51)</param>
/// <returns>转换任务</returns>
public async Task ConvertFrameRateWithOptionsAsync(
string inputPath,
string outputPath,
int targetFrameRate,
ConversionPreset preset = ConversionPreset.Medium,
int crf = 23)
{
try
{
// 设置FFmpeg可执行文件路径
FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin");
// 获取视频信息
var mediaInfo = await FFmpeg.GetMediaInfo(inputPath);
var videoStream = mediaInfo.VideoStreams.First();
var audioStream = mediaInfo.AudioStreams.FirstOrDefault();
// 创建转换实例
var conversion = FFmpeg.Conversions.New()
.AddStream(videoStream)
.SetFrameRate(targetFrameRate)
.SetPreset(preset)
.SetOutput(outputPath);
// 设置视频编码参数
conversion.AddParameter($"-crf {crf}");
// 如果有音频流,保留音频
if (audioStream != null)
{
conversion.AddStream(audioStream);
}
// 添加进度回调
conversion.OnProgress += (sender, args) =>
{
var percent = (int)(args.Duration.TotalSeconds / args.TotalLength.TotalSeconds * 100);
Console.WriteLine($"转换进度: {percent}%");
};
// 添加数据回调
conversion.OnDataReceived += (sender, args) =>
{
Console.WriteLine($"FFmpeg输出: {args.Data}");
};
// 执行转换
await conversion.Start();
}
catch (Exception ex)
{
Console.WriteLine($"转换过程中发生错误: {ex.Message}");
throw;
}
}
}
}
C#
namespace App06
{
internal class Program
{
static async Task Main(string[] args)
{
// 基础版本使用示例
var converter = new VideoFrameRateConverter();
await converter.ConvertFrameRateAsync(
"D:\\Video\\1.mp4",
"d:\\output_basic.mp4",
30);
// 高级版本使用示例
var advancedConverter = new AdvancedVideoFrameRateConverter();
await advancedConverter.ConvertFrameRateWithOptionsAsync(
"D:\\Video\\1.mp4",
"d:\\output_advanced.mp4",
30,
Xabe.FFmpeg.ConversionPreset.VerySlow, // 编码预设:VerySlow提供最好的质量
18 // CRF值:18提供较高质量
);
}
}
}

编码速度预设,从快到慢:
速度越慢,压缩效率越高,文件体积越小。
使用Xabe.FFmpeg可以方便地实现视频帧率的调整,通过合理设置参数可以在质量和效率之间找到平衡点。在实际应用中,建议根据具体需求和场景选择合适的参数配置。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!