【发布时间】:2018-10-12 15:36:21
【问题描述】:
我正在处理语音记录。我需要使用.exe 文件将Wav 转换为.mp3 文件。一切都很好,我可以执行这个 exe,但是当进程以我的输出 .mp3 文件结束后我需要做一些事情。我知道我的输出目录,但在尚未创建 MP3 文件之前我无法处理它。我知道也许我需要使用 Thread.sleep(); 或类似的东西,因为我无法在文件不存在之前捕获它。
这是我的代码:
string mp3GuidName = Guid.NewGuid().ToString();
var mp3FilePath = WavFilePath.Replace("finalWavFile", mp3GuidName).Replace("wav", "mp3");
var extrasFilePath = HttpContext.Current.Server.MapPath("/").Replace("DevApp.Web", "Extras");
string strArguments = "/c start " + extrasFilePath + "lame.exe --abr 80 -V5 " + WavFilePath + " " + mp3FilePath;
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = strArguments ;
process.StartInfo = startInfo;
process.Start();
var attactment = new Attachment
{
CreatedOn = DateTime.Now,
UpdatedOn = DateTime.Now,
Title = mp3GuidName +".mp3",
Size = _storageProvider.GetFile(mp3FilePath).GetSize(), // here I am trying to get mp3 file but i cant catch it. Because if this wav files size is huge, then convert process is taking time and my mp3 file is not created yet.
FileExtension = _storageProvider.GetFile(mp3FilePath).GetFileType()
};
attactment.MimeType = _storageProvider.GetMimeType(attactment.FileExtension);
attactment.FileUrl = mp3GuidName+".mp3";// file.GetName();
attactment.AttachmentFolderId = folder.Id;
_attachmentRepository.Add(attactment);
我尝试使用process.WaitForExit();,但我无法解决这个问题。我仍然无法访问 mp3 文件。
那么我怎样才能捕捉到这个过程何时结束?
最好的问候。
【问题讨论】:
-
process.WaitForExit();应该可以工作。但是您还应该检查 lame.exe 是否产生一些错误(即,无论出于何种原因,无法进行 mp3 转换)。我不知道 lame.exe,但看看 lame.exe 是否在出现问题时返回退出代码(批处理文件中的“错误级别”值)。在进程退出后(而不是之前!)尝试检查Process.ExitCode属性。但首先,检查 Lame.exe 文档是否会提供退出代码以及它会提供哪些退出代码。 -
另外,你真的确定 Lame 正在被处决吗?您的代码实际上启动了 cmd.exe。当然它会很好地启动 cmd.exe(我猜),但这并不能证明 cmd.exe 本身能够运行 lame.exe。我在这里想说的是:确保变量 extrasFilePath 中的路径实际上是 lame.exe 的正确路径,并确保对所有人使用正确且有效的双引号您提供给 cmd.exe 的参数(在控制台窗口中,键入“cmd /?”以阅读有关如何正确引用的详细信息)
-
对我的第一条评论的小修正:如果您从参数字符串中删除
start参数,process.WaitForExit();应该可以工作。很抱歉没有早点发现。 -
感谢您的建议。我正在启动 cmd.exe,我的命令是用正确的参数启动另一个 exe。它工作正常。正如我所说,我只需要抓住这个过程完成的时间,以及在我需要做某事之后。
process.WaitForExit();的工作方式类似于“等等。我需要在处理过程中做一些事情。啊!好的。它完成了,现在我可以执行新的代码行了。” ? @elgonzo