2010-11-24 12 views
1

ffmpeg.exeを使用して、ビデオファイルをflv形式に変換しています。その目的のために、私はWindowsサービスを使用して、変換プロセスをバックグラウンドで実行します大きなファイルを(私はそれがファイルサイズが14MBを超えると経験しました)Windowsサービスを介して変換しようとしている間に、プロセス(すなわち、process.start();)を開始する行にこだわってしまいます。大きなファイルを処理している間にwindowsサービス経由でffmpeg.exeを実行できない

しかし、私はコマンドプロンプトから直接ffmpeg.exeを実行しようとしたときに問題なく動作しました。私はこのような状況を取り除くことができますどのように

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(); 
} 

を:は次のように

マイコードでWindowsサービスです。

+0

なぜビデオ変換タスクをWindowsサービスとして実行しますか? –

答えて

6

リダイレクトされた両方のストリームの終わりまで同期読み取りを実行したため、デッドロックが発生したようです。

MSDNからの参照:あなたは標準出力 と標準エラーストリームの両方から にすべてのテキストを読んだとき

同様の問題があります。 は、 ストリームの両方に対して読み取り操作を実行します。

// 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ストリームから読み取ることを無期限に待機します。

の非同期読み取り操作を使用して、これらの依存関係を避けることができます。 とそのデッドロックの可能性。 また、2つの スレッドを作成し、別のスレッドで各 ストリームの出力を読み取ることによって、 デッドロック状態を回避できます。

+1

ありがとうございました...それは本当の問題で、私はちょうど次の行をコメントしました:1)proc.StartInfo.RedirectStandardOutput = true; 2)文字列StdOutVideo = proc.StandardOutput.ReadToEnd();それは私のために働いた。コードがproc.start()で止まってしまったので、少し混乱しました。それ以降は読み込み行がありました。読書はいつ始まりますか?(これはproc.start()中に起こります)。私を救ってくれてどうもありがとう... – Harun

関連する問題