From 1204e4ae9b0d5114157422457147ba09c97169ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melvyn=20La=C3=AFly?= Date: Sun, 22 Apr 2018 17:26:32 +0200 Subject: [PATCH] Fix some bugs --- MovieBarCodeGenerator/FfmpegWrapper.cs | 24 +++++++++++++++++++----- MovieBarCodeGenerator/MainForm.cs | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/MovieBarCodeGenerator/FfmpegWrapper.cs b/MovieBarCodeGenerator/FfmpegWrapper.cs index 94a6685..31472bb 100644 --- a/MovieBarCodeGenerator/FfmpegWrapper.cs +++ b/MovieBarCodeGenerator/FfmpegWrapper.cs @@ -20,7 +20,7 @@ public FfmpegWrapper(string ffmpegExecutablePath) FfmpegExecutablePath = ffmpegExecutablePath; } - private Process StartFfmpegInstance(string args) + private Process StartFfmpegInstance(string args, bool redirectError = false) { try { @@ -28,8 +28,11 @@ private Process StartFfmpegInstance(string args) { FileName = FfmpegExecutablePath, Arguments = args, + // Warning: if a standard stread is redirected but is not read, + // its buffer might fill up and block the whole process. + // Only redirect a standard stream if you read it! RedirectStandardOutput = true, - RedirectStandardError = true, + RedirectStandardError = redirectError, UseShellExecute = false, CreateNoWindow = true, }); @@ -45,12 +48,14 @@ public TimeSpan GetMediaDuration(string inputPath, CancellationToken cancellatio { var args = $"-i \"{inputPath}\""; - var process = StartFfmpegInstance(args); + var process = StartFfmpegInstance(args, redirectError: true); using (cancellationToken.Register(() => process.Kill())) { var output = process.StandardError.ReadToEnd(); + cancellationToken.ThrowIfCancellationRequested(); + var match = Regex.Match(output, @"Duration: (.*?),"); if (match.Success) { @@ -75,10 +80,19 @@ public IEnumerable GetImagesFromMedia(string inputPath, int frameCount, var process = StartFfmpegInstance(args); - using (cancellationToken.Register(() => process.Kill())) + IEnumerable GetLazyStream() { - return ReadBitmapStream(process.StandardOutput.BaseStream); + using (cancellationToken.Register(() => process.Kill())) + { + foreach (var item in ReadBitmapStream(process.StandardOutput.BaseStream)) + { + yield return item; + } + cancellationToken.ThrowIfCancellationRequested(); + } } + + return GetLazyStream(); } private IEnumerable ReadBitmapStream(Stream stdout) diff --git a/MovieBarCodeGenerator/MainForm.cs b/MovieBarCodeGenerator/MainForm.cs index 07f7671..3a62b2f 100644 --- a/MovieBarCodeGenerator/MainForm.cs +++ b/MovieBarCodeGenerator/MainForm.cs @@ -61,6 +61,7 @@ private async void generateButton_Click(object sender, EventArgs e) _cancellationTokenSource.Cancel(); _cancellationTokenSource = null; generateButton.Text = GenerateButtonText; + progressBar1.Value = progressBar1.Minimum; return; }