|
@@ -331,8 +331,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
// -f image2 -f webp
|
|
|
|
|
|
// Use ffmpeg to sample 100 (we can drop this if required using thumbnail=50 for 50 frames) frames and pick the best thumbnail. Have a fall back just in case.
|
|
|
- var args = useIFrame ? string.Format("-i {0} -threads 0 -v quiet -vframes 1 -vf \"{2},thumbnail=30\" -f image2 \"{1}\"", inputPath, "-", vf) :
|
|
|
- string.Format("-i {0} -threads 0 -v quiet -vframes 1 -vf \"{2}\" -f image2 \"{1}\"", inputPath, "-", vf);
|
|
|
+ var args = useIFrame ? string.Format("-i {0} -threads 1 -v quiet -vframes 1 -vf \"{2},thumbnail=30\" -f image2 \"{1}\"", inputPath, "-", vf) :
|
|
|
+ string.Format("-i {0} -threads 1 -v quiet -vframes 1 -vf \"{2}\" -f image2 \"{1}\"", inputPath, "-", vf);
|
|
|
|
|
|
var probeSize = GetProbeSizeArgument(new[] { inputPath }, protocol);
|
|
|
|
|
@@ -363,7 +363,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
};
|
|
|
|
|
|
_logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
|
|
|
-
|
|
|
+
|
|
|
await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
process.Start();
|
|
@@ -479,7 +479,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
Directory.CreateDirectory(targetDirectory);
|
|
|
var outputPath = Path.Combine(targetDirectory, filenamePrefix + "%05d.jpg");
|
|
|
|
|
|
- var args = string.Format("-i {0} -threads 0 -v quiet -vf \"{2}\" -f image2 \"{1}\"", inputArgument, outputPath, vf);
|
|
|
+ var args = string.Format("-i {0} -threads 1 -v quiet -vf \"{2}\" -f image2 \"{1}\"", inputArgument, outputPath, vf);
|
|
|
|
|
|
var probeSize = GetProbeSizeArgument(new[] { inputArgument }, protocol);
|
|
|
|
|
@@ -506,41 +506,52 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
|
await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
- process.Start();
|
|
|
-
|
|
|
- // Need to give ffmpeg enough time to make all the thumbnails, which could be a while,
|
|
|
- // but we still need to detect if the process hangs.
|
|
|
- // Making the assumption that as long as new jpegs are showing up, everything is good.
|
|
|
-
|
|
|
- bool isResponsive = true;
|
|
|
- int lastCount = 0;
|
|
|
+ bool ranToCompletion;
|
|
|
|
|
|
- while (isResponsive && !process.WaitForExit(120000))
|
|
|
+ try
|
|
|
{
|
|
|
- int jpegCount = Directory.GetFiles(targetDirectory, "*.jpg").Count();
|
|
|
- isResponsive = (jpegCount > lastCount);
|
|
|
- lastCount = jpegCount;
|
|
|
- }
|
|
|
+ process.Start();
|
|
|
|
|
|
- bool ranToCompletion = process.HasExited;
|
|
|
+ // Need to give ffmpeg enough time to make all the thumbnails, which could be a while,
|
|
|
+ // but we still need to detect if the process hangs.
|
|
|
+ // Making the assumption that as long as new jpegs are showing up, everything is good.
|
|
|
|
|
|
- if (!ranToCompletion)
|
|
|
- {
|
|
|
- try
|
|
|
+ bool isResponsive = true;
|
|
|
+ int lastCount = 0;
|
|
|
+
|
|
|
+ while (isResponsive && !process.WaitForExit(30000))
|
|
|
{
|
|
|
- _logger.Info("Killing ffmpeg process");
|
|
|
+ cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
- process.StandardInput.WriteLine("q");
|
|
|
+ int jpegCount = Directory.GetFiles(targetDirectory)
|
|
|
+ .Count(i => string.Equals(Path.GetExtension(i), ".jpg", StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
|
- process.WaitForExit(1000);
|
|
|
+ isResponsive = (jpegCount > lastCount);
|
|
|
+ lastCount = jpegCount;
|
|
|
}
|
|
|
- catch (Exception ex)
|
|
|
+
|
|
|
+ ranToCompletion = process.HasExited;
|
|
|
+
|
|
|
+ if (!ranToCompletion)
|
|
|
{
|
|
|
- _logger.ErrorException("Error killing process", ex);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ _logger.Info("Killing ffmpeg process");
|
|
|
+
|
|
|
+ process.StandardInput.WriteLine("q");
|
|
|
+
|
|
|
+ process.WaitForExit(1000);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ _logger.ErrorException("Error killing process", ex);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- resourcePool.Release();
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ resourcePool.Release();
|
|
|
+ }
|
|
|
|
|
|
var exitCode = ranToCompletion ? process.ExitCode : -1;
|
|
|
|