C# Winform--ffmpeg图片合成视频以及参数设置

1.代码部分

cs 复制代码
        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资源下载详见另外一篇博客

相关推荐
用户298698530142 小时前
PDF 转纯文本(TXT)免费攻略:轻松提取文字内容
人工智能·后端·c#
孙克旭_2 小时前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
斑马1392 小时前
Linux软件编程学习笔记(五)——线程
开发语言·php
吴声子夜歌2 小时前
Java——数组和集合(一)
java·开发语言
呆呆敲代码的小Y2 小时前
Lua 上值(UpValue)
开发语言·junit·lua·lua上值·upvalue
呆呆敲代码的小Y2 小时前
【游戏开发】C# 中的迭代器
java·开发语言·c#·迭代器
benchmark_cc2 小时前
K 线数据断层会对回测造成什么影响?从一个缺失交易日看懂量化策略为什么会失真
大数据·开发语言·数据分析·量化·股票数据·quantdash·量化数据源
benchmark_cc2 小时前
数据 API 稳定性为什么会影响量化策略?从数据获取到信号执行的完整分析
开发语言·python·数据分析·量化·股票数据·quantdash·量化数据源
2601_962180332 小时前
python——Django 框架
开发语言·python·django
长江后浪博客2 小时前
Conda环境下测试Intel NPU:Python版本如何选择?
开发语言·python·conda·openvino·intel npu