C# Winform--ffmpeg图片合成视频以及参数设置
1.代码部分
private async void button4_Click(object sender, EventArgs e)
{
string inputFolderPath = @"D:\19201080图片"; // 图片所在的文件夹路径
string outputFilePath = @"D:\output_video2.mp4"; // 输出视频的文件路径
// 获取所有的图片文件路径,假设是 *.jpg 文件
string[] imageFiles = Directory.GetFiles(inputFolderPath, "*.jpg");
// 检查是否有图片文件
if (imageFiles.Length == 0)
{
MessageBox.Show("没有找到图片文件!");
return;
}
// 确保按字母顺序排序,以保证图片的顺序正确
Array.Sort(imageFiles);
// 拼接图片路径为 FFmpeg 命令格式
string filePattern = Path.Combine(inputFolderPath, "%d.jpg");
// 创建 FFmpeg 命令行参数
//string ffmpegArgs = $"-framerate 30 -i \"{filePattern}\" -c:v libx264 -pix_fmt yuv420p \"{outputFilePath}\"";
string arguments = $"-framerate 10 -i \"{inputFolderPath}\\%d.jpg\" -c:v libx264 -r 30 -pix_fmt yuv420p \"{outputFilePath}\"";
// 执行 FFmpeg 命令并等待其完成
await RunFFmpegCommandAsync4(arguments);
}
private async Task RunFFmpegCommandAsync4(string args)
{
try
{
// 用于取消任务的Token
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken token = cancellationTokenSource.Token;
// 设置一个超时(例如10秒)
int timeoutMilliseconds = 5 * 1000;
// 设置 FFmpeg 可执行文件的完整路径
string ffmpegPath = @"C:\ffmpeg\bin\ffmpeg.exe"; // 这里是 FFmpeg 可执行文件的完整路径
// 创建进程启动信息
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = ffmpegPath, // 使用完整路径指定 FFmpeg 可执行文件
Arguments = args,//参数
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
// 在后台线程中执行 FFmpeg 命令
using (Process process = new Process())
{
process.StartInfo = startInfo;
try
{
process.Start();
// 启动任务来读取输出和错误流
Task<string> outputTask = Task.Run(() => process.StandardOutput.ReadToEnd(), token);
Task<string> errorTask = Task.Run(() => process.StandardError.ReadToEnd(), token);
// 等待直到任务完成,或者超时
//就是看这三个任务哪一个先完成
if (await Task.WhenAny(outputTask, errorTask, Task.Delay(timeoutMilliseconds)) == Task.Delay(timeoutMilliseconds))
{
// 如果超时,取消任务
cancellationTokenSource.Cancel();
Debug.WriteLine("Process timed out and was cancelled.");
// 强制结束ffmpeg进程
process.Kill();
//假设你有一个 ffmpeg 进程,它在后台处理一个视频转换任务。
//你希望在 ffmpeg 执行时,程序依然能够做其他事情(比如,更新界面、监听用户输入等)。
//这时你可以使用 process.WaitForExitAsync() 来等待进程完成,而不会导致应用程序的界面冻结或卡死。
await process.WaitForExitAsync();//异步等待完成
}
else
{
// 如果任务完成,输出结果
string output = await outputTask;
string error = await errorTask;
Debug.WriteLine("Output: " + output);
Debug.WriteLine("Error: " + error);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
finally
{
if (!process.HasExited)
{
// 如果进程没有退出,强制结束
process.Kill();
await process.WaitForExitAsync();
Console.WriteLine("Process was manually killed.");
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"执行 FFmpeg 命令失败: {ex.Message}");
}
}
2.小结
上述是Winform 使用ffmpeg异步调用生成视频Demo,关于ffmpeg exe资源下载详见另外一篇博客
原文地址:https://blog.csdn.net/BlueCapt/article/details/144019991
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!