我正在使用ffmpeg.exe将视频文件转换为flv格式。为此,我使用Windows服务在后台运行转换过程。在尝试通过Windows服务转换大文件(文件大小> 14MB时,我经历过)时,它卡在了启动进程的行(即process.start();
)上。
但是,当我尝试直接从命令提示符执行ffmpeg.exe时,它没有任何问题。
我在Windows服务中的代码如下:
private Thread WorkerThread;
protected override void OnStart(string[] args)
{
WorkerThread = new Thread(new ThreadStart(StartHandlingVideo));
WorkerThread.Start();
}
protected override void OnStop()
{
WorkerThread.Abort();
}
private void StartHandlingVideo()
{
FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}", InputFile, OutputFile);
Process proc;
proc = new Process();
try
{
proc.StartInfo.FileName = spath + "\\ffmpeg\\ffmpeg.exe";
proc.StartInfo.Arguments = FilArgs;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
eventLog1.WriteEntry("Going to start process of convertion");
proc.Start();
string StdOutVideo = proc.StandardOutput.ReadToEnd();
string StdErrVideo = proc.StandardError.ReadToEnd();
eventLog1.WriteEntry("Convertion Successful");
eventLog1.WriteEntry(StdErrVideo);
}
catch (Exception ex)
{
eventLog1.WriteEntry("Convertion Failed");
eventLog1.WriteEntry(ex.ToString());
}
finally
{
proc.WaitForExit();
proc.Close();
}
我如何摆脱这种情况。
最佳答案
似乎您陷入了僵局,因为您对两个重定向流的末尾执行了同步读取。
来自MSDN的参考:
阅读时有一个类似的问题
来自标准输出的所有文本
和标准错误流。的
例如,遵循以下C#代码,
对两者都执行读取操作
流。
// Do not perform a synchronous read to the end of both
// redirected streams.
// string output = p.StandardOutput.ReadToEnd();
// string error = p.StandardError.ReadToEnd();
// p.WaitForExit();
// Use asynchronous read operations on at least one of the streams.
p.BeginOutputReadLine();
string error = p.StandardError.ReadToEnd();
p.WaitForExit();
该代码示例避免了死锁
通过异步执行条件
在StandardOutput上读取操作
流。导致死锁
如果父进程调用
p.StandardOutput.ReadToEnd后跟
p.StandardError.ReadToEnd和
子进程将足够的文本写入
填充其错误流。父母
过程将无限期地等待
子进程关闭其
StandardOutput流。孩子
过程将无限期地等待
父母从全文中读取
StandardError流。
您可以使用异步读取
避免这些依赖的操作
和他们的僵局潜力。
或者,您可以避免
通过创建两个死锁条件
线程并读取每个线程的输出
流在单独的线程上。