Xabe.FFmpeg 是一个优秀的 .NET FFmpeg 封装库,可以帮助我们方便地处理音视频文件。本文将详细介绍如何使用 Xabe.FFmpeg 来生成视频缩略图。
首先需要通过 NuGet 安装 Xabe.FFmpeg 包:
XML<PackageReference Include="Xabe.FFmpeg" Version="5.2.6" />
确保系统中已安装 FFmpeg(Xabe.FFmpeg 依赖于 FFmpeg)
下面是一个最基本的生成视频缩略图的示例:
C#using Xabe.FFmpeg;
namespace App10
{
internal class Program
{
static async Task Main(string[] args)
{
FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin");
await GenerateBasicThumbnail("D:\\Video\\1.mp4", "D:\\1.jpg");
}
public static async Task GenerateBasicThumbnail(string inputPath, string outputPath)
{
try
{
// 获取视频信息
IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath);
// 获取视频时长(秒)
double duration = mediaInfo.Duration.TotalSeconds;
// 在视频中间位置截取一帧作为缩略图
double snapshotTime = duration / 2;
// 生成缩略图
var conversion = await FFmpeg.Conversions.FromSnippet.Snapshot(
inputPath,
outputPath,
TimeSpan.FromSeconds(snapshotTime));
// 执行转换
await conversion.Start();
Console.WriteLine($"缩略图已生成:{outputPath}");
}
catch (Exception ex)
{
Console.WriteLine($"生成缩略图时发生错误:{ex.Message}");
}
}
}
}
这个示例展示了更多自定义选项:
C#public static async Task GenerateAdvancedThumbnail(
string inputPath,
string outputPath,
int width = 320,
int height = 240)
{
try
{
// 获取视频信息
IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath);
// 计算视频 1/3 处的时间点
double snapshotTime = mediaInfo.Duration.TotalSeconds / 3;
// 创建转换任务
var conversion = FFmpeg.Conversions.New()
// 设置输入文件
.AddParameter($"-i {inputPath}")
// 设置截取时间点
.AddParameter($"-ss {snapshotTime}")
// 只截取一帧
.AddParameter("-frames:v 1")
// 设置输出尺寸
.AddParameter($"-s {width}x{height}")
// 设置输出质量(1-31,值越小质量越好)
.AddParameter("-q:v 2")
// 设置输出路径
.SetOutput(outputPath);
// 执行转换
await conversion.Start();
Console.WriteLine($"高级缩略图已生成:{outputPath}");
}
catch (Exception ex)
{
Console.WriteLine($"生成缩略图时发生错误:{ex.Message}");
}
}
有时我们需要从视频中提取多张缩略图,下面是具体实现:
C#using Xabe.FFmpeg;
namespace App10
{
internal class Program
{
static async Task Main(string[] args)
{
FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin");
await GenerateMultipleThumbnails("D:\\Video\\1.mp4", "D:\\");
}
public static async Task GenerateMultipleThumbnails(
string inputPath,
string outputDirectory,
int thumbnailCount = 3)
{
try
{
// 获取视频信息
IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath);
double duration = mediaInfo.Duration.TotalSeconds;
// 确保输出目录存在
Directory.CreateDirectory(outputDirectory);
// 计算时间间隔
double interval = duration / (thumbnailCount + 1);
// 生成多张缩略图
for (int i = 1; i <= thumbnailCount; i++)
{
double currentTime = interval * i;
string outputPath = Path.Combine(
outputDirectory,
$"thumbnail_{i}.jpg");
var conversion = await FFmpeg.Conversions.FromSnippet.Snapshot(
inputPath,
outputPath,
TimeSpan.FromSeconds(currentTime));
await conversion.Start();
Console.WriteLine($"已生成第 {i} 张缩略图:{outputPath}");
}
}
catch (Exception ex)
{
Console.WriteLine($"生成多张缩略图时发生错误:{ex.Message}");
}
}
}
}

Xabe.FFmpeg 提供了一个强大而灵活的方式来生成视频缩略图。通过上述示例,我们可以根据实际需求选择不同的实现方式,从简单的单张缩略图到批量生成多张缩略图都能轻松实现。在实际应用中,记得根据具体场景调整参数,并做好异常处理和性能优化。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!