我通过调用c#程序中的进程来使用sox。我知道挂在WaitForExit或Start方法上很受欢迎,但我无法处理它。也许我从代码负责运行流程开始(这是this topic中来自最佳评级答案的复制和粘贴:
using (Process process = new Process())
{
process.StartInfo.FileName = _soxExePath;
process.StartInfo.Arguments = _task.Arguments.RemoveFirstOccurence("sox");
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
StringBuilder output = new StringBuilder();
StringBuilder error = new StringBuilder();
using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
{
process.OutputDataReceived += (sender, e) =>
{
if (e.Data == null)
{
outputWaitHandle.Set();
}
else
{
output.AppendLine(e.Data);
}
};
process.ErrorDataReceived += (sender, e) =>
{
if (e.Data == null)
{
errorWaitHandle.Set();
}
else
{
error.AppendLine(e.Data);
}
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
if (process.WaitForExit(timeout) &&
outputWaitHandle.WaitOne(timeout) &&
errorWaitHandle.WaitOne(timeout))
{
result = process.ExitCode == 0;
}
else
{
// Timed out.
}
}
}
正如您所看到的那样,标准输出是异步处理的,但程序仍在WaitForExit上挂起(即使超时设置为100000)。当我在Windows中键入完全相同的命令时,cmd处理只需不到一秒钟,因此操作不是很大。
sox --combine mix 1.wav 2.wav 3.wav -p | sox - --combine concatenate 4.wav output.wav << causing problem
我知道这是因为Sox正在为stdout创建第一个操作。当我尝试一些立即保存到文件的命令时没有问题。
sox --combine mix 1.wav 2.wav 3.wav output.wav << no problem
答案 0 :(得分:0)
答案在于你如何称呼sox。我猜你不会完全得到你想要的输出等。
process.StartInfo.FileName = _soxExePath;
process.StartInfo.Arguments = _task.Arguments.RemoveFirstOccurence("sox");
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.EnableRaisingEvents = true;
//<set event handlers here>
process.Exited += // define what to do to clear up
process.Start();
Theres 2的不同之处,一是打开启用事件发送和接收任何输出和输入的启用,你应该只需要设置收到的输出数据,你似乎不会发送新的东西。此外,通过听取退出,你可以处理它的全部事实..而不是挂起你的应用程序,希望听到它完成..
答案 1 :(得分:0)
我的解决方案是here,只是将cmd作为Process调用,并将路径传递给可执行文件,将sox的参数作为进程args传递。