|
|
|
@ -871,6 +871,16 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
throw new InvalidOperationException("Empty or invalid input argument.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var encoderQuality = qualityScale;
|
|
|
|
|
if (vidEncoder.Contains("videotoolbox", StringComparison.InvariantCultureIgnoreCase))
|
|
|
|
|
{
|
|
|
|
|
// videotoolbox's mjpeg encoder uses jpeg quality instead of ffmpeg defined qscale
|
|
|
|
|
// ffmpeg qscale is a value from 1-31, with 1 being best quality and 31 being worst
|
|
|
|
|
// jpeg quality is a value from 0-100, with 0 being worst quality and 100 being best
|
|
|
|
|
// This mapping is just an estimation, with bias towards higher quality
|
|
|
|
|
encoderQuality = 100 - ((qualityScale - 1) * 3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Output arguments
|
|
|
|
|
var targetDirectory = Path.Combine(_configurationManager.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString("N"));
|
|
|
|
|
Directory.CreateDirectory(targetDirectory);
|
|
|
|
@ -879,12 +889,13 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
// Final command arguments
|
|
|
|
|
var args = string.Format(
|
|
|
|
|
CultureInfo.InvariantCulture,
|
|
|
|
|
"-loglevel error {0} -an -sn {1} -threads {2} -c:v {3} {4}-f {5} \"{6}\"",
|
|
|
|
|
"-loglevel error {0} -an -sn {1} -threads {2} -c:v {3} {4}{5}-f {6} \"{7}\"",
|
|
|
|
|
inputArg,
|
|
|
|
|
filterParam,
|
|
|
|
|
outputThreads.GetValueOrDefault(_threads),
|
|
|
|
|
vidEncoder,
|
|
|
|
|
qualityScale.HasValue ? "-qscale:v " + qualityScale.Value.ToString(CultureInfo.InvariantCulture) + " " : string.Empty,
|
|
|
|
|
qualityScale.HasValue ? "-qscale:v " + encoderQuality.Value.ToString(CultureInfo.InvariantCulture) + " " : string.Empty,
|
|
|
|
|
vidEncoder.Contains("videotoolbox", StringComparison.InvariantCultureIgnoreCase) ? "-allow_sw 1 " : string.Empty, // allow_sw fallback for some intel macs
|
|
|
|
|
"image2",
|
|
|
|
|
outputPath);
|
|
|
|
|
|
|
|
|
|