如何格式化FFmpeg参数字符串将textBox输入传入FFmpeg类参数
问题描述
我创建了如下参数配置窗体:
我需要使用ffmpegArguments变量将textBox控件中输入的内容传递给FFmpeg类的启动参数。目前FFmpeg类的Start方法中通过FileName、Framerate两个变量拼接基础调用参数,需要实现textBox输入内容的格式化逻辑,结合两个已有变量生成符合要求的FFmpeg进程启动参数。
当前项目中使用的FFmpeg类代码如下:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.IO.Pipes; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Capture_Screen { internal class FFmpeg_Capture { public string workingDirectory; public string outputDirectory; public string ffmpegArguments; private Process process; public FFmpeg_Capture() { } public void Start(string FileName, int Framerate) { process = new Process(); process.StartInfo.FileName = outputDirectory; // 配置ffmpeg.exe所在路径 process.EnableRaisingEvents = false; process.StartInfo.WorkingDirectory = workingDirectory; // 配置输出文件目录 process.StartInfo.Arguments = @"-y -f gdigrab -framerate " + Framerate + " -i desktop -preset ultrafast -pix_fmt yuv420p " + FileName; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = true; //重定向标准输入 process.StartInfo.CreateNoWindow = true; process.Start(); } public void Stop() { byte[] qKey = Encoding.GetEncoding("gbk").GetBytes("q"); //获取'q'键的编码 process.StandardInput.BaseStream.Write(qKey, 0, 1); //向FFmpeg子进程的标准输入写入'q' process.StandardInput.BaseStream.Flush(); //刷新标准输入流 process.Close(); process.Dispose(); } } }
解决方案
直接调整Start方法内的参数拼接逻辑,将公共字段ffmpegArguments承载的文本框输入内容插入到参数串的合适位置即可,注意参数间保留空格、对含空格的路径做引号包裹避免解析错误。
- 调用
Start方法前,先将窗体textBox控件的输入内容赋值给FFmpeg_Capture实例的ffmpegArguments字段 - 参数拼接顺序调整为:固定基础采集参数 → 用户自定义参数 → 输出文件名参数
- 对可能包含空格的输出文件路径,统一用双引号包裹,符合FFmpeg参数解析规则
修改后Start方法的核心参数拼接代码:
public void Start(string FileName, int Framerate) { process = new Process(); process.StartInfo.FileName = outputDirectory; process.EnableRaisingEvents = false; process.StartInfo.WorkingDirectory = workingDirectory; // 拼接参数,自动处理自定义参数为空的情况,给文件名加双引号兼容空格路径 process.StartInfo.Arguments = string.Format( "-y -f gdigrab -framerate {0} -i desktop {1} -preset ultrafast -pix_fmt yuv420p \"{2}\"", Framerate, string.IsNullOrWhiteSpace(ffmpegArguments) ? "" : ffmpegArguments.Trim(), FileName ); process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = true; process.StartInfo.CreateNoWindow = true; process.Start(); }
注意:如果用户在文本框中输入的自定义参数包含带空格的路径,需要和直接使用FFmpeg命令行的规则一致,手动给对应路径包裹双引号,否则会出现参数解析错误。
窗体侧调用参考代码:
private void StartRecordBtn_Click(object sender, EventArgs e) { FFmpeg_Capture capture = new FFmpeg_Capture(); capture.outputDirectory = Application.StartupPath + @"\ffmpeg.exe"; capture.workingDirectory = @"D:\ScreenRecords\"; // 读取文本框输入的自定义参数 capture.ffmpegArguments = ArgsTextBox.Text.Trim(); string outputFile = Path.Combine(capture.workingDirectory, $"{DateTime.Now:yyyyMMdd_HHmmss}.mp4"); capture.Start(outputFile, 60); }
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

