diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs index 990dc7671..9637817ce 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs @@ -357,10 +357,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer _logger.ErrorException("AcceptWebSocketAsync error", ex); ctx.Response.StatusCode = 500; - } - finally - { - ctx.Response.Close(); + ctx.Response.Close(); } } diff --git a/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs b/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs index 709c21f50..9b1a73349 100644 --- a/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs +++ b/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs @@ -708,11 +708,26 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder /// The cancellation token. /// Task. /// Must use inputPath list overload - public Task ExtractImage(string[] inputFiles, InputType type, TimeSpan? offset, string outputPath, CancellationToken cancellationToken) + public async Task ExtractImage(string[] inputFiles, InputType type, TimeSpan? offset, string outputPath, CancellationToken cancellationToken) { var resourcePool = type == InputType.AudioFile ? _audioImageResourcePool : _videoImageResourcePool; - return ExtractImageInternal(GetInputArgument(inputFiles, type), type, offset, outputPath, resourcePool, cancellationToken); + var inputArgument = GetInputArgument(inputFiles, type); + + if (type != InputType.AudioFile) + { + try + { + await ExtractImageInternal(inputArgument, type, offset, outputPath, true, resourcePool, cancellationToken).ConfigureAwait(false); + return; + } + catch + { + _logger.Error("I-frame image extraction failed, will attempt standard way. Input: {0}", inputArgument); + } + } + + await ExtractImageInternal(inputArgument, type, offset, outputPath, false, resourcePool, cancellationToken).ConfigureAwait(false); } /// @@ -722,6 +737,7 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder /// The type. /// The offset. /// The output path. + /// if set to true [use I frame]. /// The resource pool. /// The cancellation token. /// Task. @@ -729,7 +745,7 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder /// or /// outputPath /// - private async Task ExtractImageInternal(string inputPath, InputType type, TimeSpan? offset, string outputPath, SemaphoreSlim resourcePool, CancellationToken cancellationToken) + private async Task ExtractImageInternal(string inputPath, InputType type, TimeSpan? offset, string outputPath, bool useIFrame, SemaphoreSlim resourcePool, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(inputPath)) { @@ -741,7 +757,7 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder throw new ArgumentNullException("outputPath"); } - var args = type != InputType.Dvd ? string.Format("-i {0} -threads 0 -v quiet -vframes 1 -filter:v select=\\'eq(pict_type\\,I)\\' -f image2 \"{1}\"", inputPath, outputPath) : + var args = useIFrame ? string.Format("-i {0} -threads 0 -v quiet -vframes 1 -filter:v select=\\'eq(pict_type\\,I)\\' -f image2 \"{1}\"", inputPath, outputPath) : string.Format("-i {0} -threads 0 -v quiet -vframes 1 -f image2 \"{1}\"", inputPath, outputPath); var probeSize = GetProbeSizeArgument(type);