【问题标题】:System.Diagnostics.Process pipe (vertical bar) not accepted as argumentSystem.Diagnostics.Process 管道(竖线)不被接受为参数
【发布时间】:2014-05-30 07:50:55
【问题描述】:

我正在尝试使用 System.Diagnostics.Process 执行 this code。它在命令行中运行良好。但在 C# 中,| 字符失败。

var myProcess = new Process();
var p = new ProcessStartInfo();

var sArgs = " -i emp.mp3 -f wav - | neroAacEnc -ignorelength -q 0.5 -if - -of emp.mp4";
p.FileName = "ffmpeg.exe";
p.CreateNoWindow = false;
p.RedirectStandardOutput = false;
p.UseShellExecute = false;
p.Arguments = sArgs;

myProcess.StartInfo = p;

myProcess.Start();
myProcess.WaitForExit();

它给出了以下错误:

无法为“|”找到合适的输出格式:参数无效

我在 stackoverflow 上环顾四周,发现以下提示,但它也不起作用:

var psi = new ProcessStartInfo("ffmpeg.exe");
psi.Arguments = 
    "\"-i emp.mp3 -f wav -\" | \"neroAacEnc -ignorelength -q 0.5 -if - -of emp.mp4\"";
psi.CreateNoWindow = false;
psi.UseShellExecute = false;

var process = new Process { StartInfo = psi };

process.Start();
process.WaitForExit();

给出以下错误:

无法识别的选项'i emp.mp3 -f wav -'
未能设置值“|”对于选项'i emp.mp3 -f wav -'

【问题讨论】:

  • “|” character 不是 ffmpeg 的参数,它是 shell 中的命令重定向运算符(管道),用于将一个程序的输出重定向到另一个程序的输入。
  • 您知道如何在不使用管道并使用 C# 代码的情况下重定向输入吗?
  • 您可以调用 cmd.exe 并将完整的命令传递给它。
  • 谢谢,我以前试过,但肯定漏掉了什么,因为它现在可以正常工作了!

标签: c# command-line ffmpeg


【解决方案1】:

感谢Lee他的cmets,问题已经解决。只需调用 cmd.exe 并将完整的命令传递给它:

var myProcess = new Process();
var p = new ProcessStartInfo("cmd.exe");
var sArgs = "/C ffmpeg.exe -i emp.mp3 -f wav - | neroAacEnc -ignorelength -q 0.5 -if - -of emp.mp4";
p.CreateNoWindow = false;
p.RedirectStandardOutput = false;
p.UseShellExecute = false;
p.Arguments = sArgs;
myProcess.StartInfo = p;
myProcess.Start();
myProcess.WaitForExit();

【讨论】:

  • 如果可执行路径和/或一个或多个参数包含空格并且需要用引号括起来,请记住将整个命令字符串(/C 之后的部分)括在一组额外的引号(根据 cmd.exe 的帮助,“行为 [对于包含引号的重要命令字符串] 是查看第一个字符是否是引号字符,如果是,则去除前导字符并删除最后一个引号字符命令行,保留最后一个引号字符之后的任何文本")。
猜你喜欢
  • 2023-04-05
  • 2011-12-19
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2018-03-06
  • 1970-01-01
相关资源
最近更新 更多