编辑
2025-11-22
C#
00

目录

准备工作
基础色彩校正示例
基本色彩参数调整
2. 高级色彩校正示例
注意事项
总结

Xabe.FFmpeg 是一个强大的 .NET FFmpeg 封装库,可以帮助我们方便地进行视频处理。本文将详细介绍如何使用 Xabe.FFmpeg 实现视频的色彩校正功能,包括亮度、对比度、饱和度和色相的调整。

准备工作

首先需要通过 NuGet 安装 Xabe.FFmpeg 包:

Bash
dotnet add package Xabe.FFmpeg

基础色彩校正示例

基本色彩参数调整

下面是一个完整的示例,展示如何调整视频的基本色彩参数:

C#
using System; using Xabe.FFmpeg; namespace App12 { internal class Program { static async Task Main(string[] args) { FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin"); await BasicColorCorrection("D:\\Video\\1.mp4", "D:\\1.mp4"); } public static async Task BasicColorCorrection(string inputPath, string outputPath) { try { // 获取视频信息 IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath); // 创建转换配置 IStream videoStream = mediaInfo.VideoStreams.First() .SetCodec(VideoCodec.libx264); // 设置视频编码器 // 创建色彩校正滤镜 string filterOptions = "eq=brightness=0.1:contrast=1.2:saturation=1.3:gamma=1.0"; // 构建转换 IConversion conversion = FFmpeg.Conversions.New() .AddStream(videoStream) .AddStream(mediaInfo.AudioStreams.First()) // 保持原始音频 .AddParameter($"-vf \"{filterOptions}\"") // 使用 AddParameter 添加滤镜 .SetOutput(outputPath); // 开始转换 await conversion.Start(); Console.WriteLine("色彩校正完成!"); } catch (Exception ex) { Console.WriteLine($"处理过程中出现错误: {ex.Message}"); } } } }

image.png

2. 高级色彩校正示例

以下示例展示了更复杂的色彩校正操作,包括多个滤镜的组合使用:

C#
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Xabe.FFmpeg; namespace App12 { internal class Program { static async Task Main(string[] args) { FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin"); await AdvancedColorCorrection("D:\\Video\\1.mp4", "D:\\1.mp4"); } public static async Task AdvancedColorCorrection( string inputPath, string outputPath, double brightness = 0.0, double contrast = 1.0, double saturation = 1.0, double gamma = 1.0, double hue = 0.0) { try { // 获取媒体信息 IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath); // 构建复杂的滤镜链 var filterChain = new List<string> { // 基础色彩校正 $"eq=brightness={brightness}:contrast={contrast}:saturation={saturation}:gamma={gamma}", // 色相调整 $"hue=h={hue}" }; // 将滤镜链组合成单个字符串 string complexFilter = string.Join(",", filterChain); // 配置转换 IConversion conversion = FFmpeg.Conversions.New() .SetOverwriteOutput(true) // 使用这个方法来设置覆盖,而不是直接添加-y参数 .AddStream(mediaInfo.VideoStreams.First() .SetCodec(VideoCodec.libx264) .SetBitrate(8000000)) .AddStream(mediaInfo.AudioStreams.First()) .AddParameter($"-vf \"{complexFilter}\"") .AddParameter("-max_muxing_queue_size 1024") .AddParameter("-movflags +faststart") .SetPreset(ConversionPreset.Medium) .SetOutput(outputPath); // 添加进度回调 conversion.OnProgress += (sender, args) => { // 计算预计剩余时间(以秒为单位) TimeSpan remaining = args.TotalLength - args.Duration; Console.WriteLine($"进度: {args.Percent:F1}%"); Console.WriteLine($"已处理时长: {args.Duration.ToString(@"hh\:mm\:ss")} / {args.TotalLength.ToString(@"hh\:mm\:ss")}"); Console.WriteLine($"已处理帧数: {args.Percent}"); Console.WriteLine($"预计剩余时间: {remaining.ToString(@"hh\:mm\:ss")}"); Console.WriteLine("----------------------------------------"); }; // 添加日志输出 conversion.OnDataReceived += (sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { Console.WriteLine($"FFmpeg: {args.Data}"); } }; // 执行转换 await conversion.Start(); Console.WriteLine("高级色彩校正完成!"); } catch (Exception ex) { Console.WriteLine($"处理过程中出现错误: {ex.Message}"); Console.WriteLine($"堆栈跟踪: {ex.StackTrace}"); // 如果有内部异常,也输出它 if (ex.InnerException != null) { Console.WriteLine($"内部错误: {ex.InnerException.Message}"); Console.WriteLine($"内部错误堆栈跟踪: {ex.InnerException.StackTrace}"); } throw; } } } }

image.png

注意事项

  1. 参数范围
    • 亮度 (brightness): -1.0 到 1.0
    • 对比度 (contrast): 0.0 到 2.0
    • 饱和度 (saturation): 0.0 到 3.0
    • 伽马值 (gamma): 0.1 到 10.0
    • 色相 (hue): -180 到 180
  2. 性能优化
    • 使用硬件加速可以显著提高处理速度
    • 合理设置编码预设可以平衡质量和速度
    • 批量处理时注意内存使用
  3. 错误处理
    • 所有示例都包含了基本的错误处理
    • 在生产环境中应该添加更详细的日志记录
    • 考虑添加重试机制处理临时性错误
  4. 文件格式
    • 支持常见的视频格式如 MP4、AVI、MKV 等
    • 输出格式建议使用 MP4,兼容性最好

总结

Xabe.FFmpeg 提供了强大而灵活的视频处理能力,通过合理使用其色彩校正功能,我们可以实现专业级的视频调色效果。上述示例涵盖了从基础到高级的各种使用场景,可以根据实际需求进行调整和扩展。

记住要经常测试不同的参数组合,以找到最适合您具体需求的设置。同时,建议在处理大量视频时使用批处理功能,这样可以显著提高工作效率。

本文作者:技术老小子

本文链接:

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