|
@@ -827,7 +827,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
}
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
- public Task<string> ExtractVideoImagesOnIntervalAccelerated(
|
|
|
+ public async Task<string> ExtractVideoImagesOnIntervalAccelerated(
|
|
|
string inputFile,
|
|
|
string container,
|
|
|
MediaSourceInfo mediaSource,
|
|
@@ -918,18 +918,34 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
inputArg = "-hwaccel_flags +low_priority " + inputArg;
|
|
|
}
|
|
|
|
|
|
- if (enableKeyFrameOnlyExtraction)
|
|
|
- {
|
|
|
- inputArg = "-skip_frame nokey " + inputArg;
|
|
|
- }
|
|
|
-
|
|
|
var filterParam = encodingHelper.GetVideoProcessingFilterParam(jobState, options, vidEncoder).Trim();
|
|
|
if (string.IsNullOrWhiteSpace(filterParam))
|
|
|
{
|
|
|
throw new InvalidOperationException("EncodingHelper returned empty or invalid filter parameters.");
|
|
|
}
|
|
|
|
|
|
- return ExtractVideoImagesOnIntervalInternal(inputArg, filterParam, vidEncoder, threads, qualityScale, priority, cancellationToken);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return await ExtractVideoImagesOnIntervalInternal(
|
|
|
+ (enableKeyFrameOnlyExtraction ? "-skip_frame nokey " : string.Empty) + inputArg,
|
|
|
+ filterParam,
|
|
|
+ vidEncoder,
|
|
|
+ threads,
|
|
|
+ qualityScale,
|
|
|
+ priority,
|
|
|
+ cancellationToken).ConfigureAwait(false);
|
|
|
+ }
|
|
|
+ catch (FfmpegException ex)
|
|
|
+ {
|
|
|
+ if (!enableKeyFrameOnlyExtraction)
|
|
|
+ {
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+
|
|
|
+ _logger.LogWarning(ex, "I-frame trickplay extraction failed, will attempt standard way. Input: {InputFile}", inputFile);
|
|
|
+ }
|
|
|
+
|
|
|
+ return await ExtractVideoImagesOnIntervalInternal(inputArg, filterParam, vidEncoder, threads, qualityScale, priority, cancellationToken).ConfigureAwait(false);
|
|
|
}
|
|
|
|
|
|
private async Task<string> ExtractVideoImagesOnIntervalInternal(
|