编辑
2025-11-22
C#
00

目录

环境准备
代码实现
基础版本 - 简单帧率调整
高级版本 - 带完整参数控制
使用示例
参数说明
帧率(FPS)
预设(Preset)
CRF(Constant Rate Factor)
注意事项
总结

在视频处理中,调整帧率(FPS - Frames Per Second)是一个常见的需求。本文将介绍如何使用C#配合Xabe.FFmpeg库来实现视频帧率的调整。

环境准备

  1. 安装FFmpeg
HTML
https://ffmpeg.org/download.html
- 将FFmpeg添加到系统环境变量

2. 安装NuGet包

Bash
Install-Package Xabe.FFmpeg

image.png

代码实现

基础版本 - 简单帧率调整

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提供较高质量 ); } } }

image.png

参数说明

帧率(FPS)

  • 常见帧率值:
    • 24fps: 电影标准
    • 25fps: PAL制式视频标准
    • 30fps: 常见网络视频
    • 60fps: 游戏视频、高动态内容

预设(Preset)

编码速度预设,从快到慢:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium (默认)
  • slow
  • slower
  • veryslow

速度越慢,压缩效率越高,文件体积越小。

CRF(Constant Rate Factor)

  • 范围:0-51
  • 0:无损
  • 18-28:视觉上可接受的范围
  • 23:默认值
  • 值越小质量越好,文件越大

注意事项

  1. 降低帧率可能会导致视频不够流畅
  2. 提高帧率不会增加实际画面信息,可能会导致画面不自然
  3. 转换过程中注意监控系统资源占用
  4. 建议在转换前备份原始视频
  5. 对于重要视频,建议先进行小片段测试

总结

使用Xabe.FFmpeg可以方便地实现视频帧率的调整,通过合理设置参数可以在质量和效率之间找到平衡点。在实际应用中,建议根据具体需求和场景选择合适的参数配置。

本文作者:技术老小子

本文链接:

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