在C#项目中处理视频文件时,借助FFmpeg的强大能力可以实现截图、转码、提取音频等多种功能,相比直接编写视频处理底层逻辑,调用FFmpeg的方式开发成本更低,兼容性也更好。本文将以实际场景为例,讲解C#调用FFmpeg处理视频的具体实现方法。

环境准备
首先需要在开发环境中准备好FFmpeg工具,步骤如下:
- 从FFmpeg官方渠道下载对应系统的可执行文件包,解压后得到
ffmpeg.exe、ffprobe.exe等核心文件 - 将解压后的文件放到C#项目的输出目录(如
bin/Debug或bin/Release),或者配置系统环境变量指向FFmpeg所在目录,方便后续直接调用 - 创建C#控制台或者WinForm项目,用于编写调用逻辑
核心调用逻辑
C#调用FFmpeg的本质是通过Process类启动FFmpeg进程,传入对应的命令行参数,等待进程执行完成即可。核心代码框架如下:
using System;
using System.Diagnostics;
public class FFmpegHelper
{
/// <summary>
/// 执行FFmpeg命令
/// </summary>
/// <param name="arguments">FFmpeg命令行参数</param>
/// <returns>执行是否成功</returns>
public static bool ExecuteFFmpegCommand(string arguments)
{
try
{
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "ffmpeg.exe", // 如果配置了环境变量可以直接写ffmpeg,否则需要写完整路径
Arguments = arguments,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (Process process = new Process())
{
process.StartInfo = startInfo;
process.Start();
// 读取输出和错误信息,避免进程阻塞
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
return process.ExitCode == 0;
}
}
catch (Exception ex)
{
Console.WriteLine($"执行FFmpeg命令失败:{ex.Message}");
return false;
}
}
}
视频截图功能实现
视频截图需要指定输入视频路径、截图时间点、输出图片路径等参数,FFmpeg的截图命令格式为ffmpeg -i 输入视频 -ss 时间点 -vframes 1 输出图片,具体实现如下:
public class VideoProcess
{
/// <summary>
/// 视频指定时间点截图
/// </summary>
/// <param name="videoPath">输入视频路径</param>
/// <param name="outputImagePath">输出图片路径</param>
/// <param name="timePoint">截图时间点,格式如00:00:05表示第5秒</param>
/// <returns>是否成功</returns>
public static bool CaptureVideoFrame(string videoPath, string outputImagePath, string timePoint)
{
// 构造FFmpeg参数:-i 输入视频 -ss 时间点 -vframes 1 输出图片
string arguments = $"-i "{videoPath}" -ss {timePoint} -vframes 1 "{outputImagePath}"";
return FFmpegHelper.ExecuteFFmpegCommand(arguments);
}
}
调用示例:
class Program
{
static void Main(string[] args)
{
string videoPath = @"D:testinput.mp4";
string imagePath = @"D:testframe_5s.jpg";
bool result = VideoProcess.CaptureVideoFrame(videoPath, imagePath, "00:00:05");
Console.WriteLine(result ? "截图成功" : "截图失败");
}
}
视频转码功能实现
视频转码可以修改视频的编码格式、分辨率、帧率等参数,常见的转码需求是将MP4转为AVI,或者调整视频分辨率,FFmpeg转码命令格式为ffmpeg -i 输入视频 -c:v 视频编码 -s 分辨率 输出视频,具体实现如下:
public class VideoProcess
{
/// <summary>
/// 视频转码
/// </summary>
/// <param name="inputVideoPath">输入视频路径</param>
/// <param name="outputVideoPath">输出视频路径</param>
/// <param name="targetResolution">目标分辨率,如640x360</param>
/// <returns>是否成功</returns>
public static bool TranscodeVideo(string inputVideoPath, string outputVideoPath, string targetResolution = null)
{
string arguments = $"-i "{inputVideoPath}"";
// 如果指定了分辨率,添加分辨率参数
if (!string.IsNullOrEmpty(targetResolution))
{
arguments += $" -s {targetResolution}";
}
// 添加输出路径,默认使用H264视频编码,AAC音频编码
arguments += $" -c:v libx264 -c:a aac "{outputVideoPath}"";
return FFmpegHelper.ExecuteFFmpegCommand(arguments);
}
}
调用示例:
class Program
{
static void Main(string[] args)
{
string inputVideo = @"D:testinput.avi";
string outputVideo = @"D:testoutput.mp4";
// 转码为MP4格式,分辨率调整为1280x720
bool result = VideoProcess.TranscodeVideo(inputVideo, outputVideo, "1280x720");
Console.WriteLine(result ? "转码成功" : "转码失败");
}
}
注意事项
- 路径中包含空格时,需要用英文双引号包裹路径,避免FFmpeg解析参数出错
- 如果需要处理大量视频文件,建议添加进程超时控制,避免进程长时间占用资源
- 可以通过
ffprobe.exe获取视频的时长、分辨率、编码格式等信息,方便在调用前校验视频参数 - 生产环境中建议将FFmpeg的路径配置到配置文件中,不要硬编码路径,方便后续部署调整
C#FFmpeg视频转码视频截图FFmpeg_Autogen修改时间:2026-07-10 06:54:33