Xabe.FFmpeg 是一个强大的 .NET FFmpeg 封装库,可以帮助我们方便地进行视频处理。本文将详细介绍如何使用 Xabe.FFmpeg 实现视频的色彩校正功能,包括亮度、对比度、饱和度和色相的调整。
首先需要通过 NuGet 安装 Xabe.FFmpeg 包:
Bashdotnet 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}");
}
}
}
}

以下示例展示了更复杂的色彩校正操作,包括多个滤镜的组合使用:
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;
}
}
}
}

Xabe.FFmpeg 提供了强大而灵活的视频处理能力,通过合理使用其色彩校正功能,我们可以实现专业级的视频调色效果。上述示例涵盖了从基础到高级的各种使用场景,可以根据实际需求进行调整和扩展。
记住要经常测试不同的参数组合,以找到最适合您具体需求的设置。同时,建议在处理大量视频时使用批处理功能,这样可以显著提高工作效率。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!