我正在使用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流。
  
  您可以使用异步读取
  避免这些依赖的操作
  和他们的僵局潜力。
  或者,您可以避免
  通过创建两个死锁条件
  线程并读取每个线程的输出
  流在单独的线程上。

10-08 03:52