You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何格式化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:18:24