diff --git a/VideoNodes/FFMpegEncoder.cs b/VideoNodes/FFMpegEncoder.cs index 8f1c001e..d5619049 100644 --- a/VideoNodes/FFMpegEncoder.cs +++ b/VideoNodes/FFMpegEncoder.cs @@ -67,9 +67,9 @@ public class FFMpegEncoder } string argsString = String.Join(" ", arguments.Select(x => x.IndexOf(" ") > 0 ? "\"" + x + "\"" : x)); - Logger.ILog(new string('-', ("FFMpeg.Arguments: " + argsString).Length)); - Logger.ILog("FFMpeg.Arguments: " + argsString); - Logger.ILog(new string('-', ("FFMpeg.Arguments: " + argsString).Length)); + Logger.ILog(new string('-', ("FFmpeg.Arguments: " + argsString).Length)); + Logger.ILog("FFmpeg.Arguments: " + argsString); + Logger.ILog(new string('-', ("FFmpeg.Arguments: " + argsString).Length)); var task = ExecuteShellCommand(ffMpegExe, arguments, 0); task.Wait(); diff --git a/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderExecutor.cs b/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderExecutor.cs index 0454f453..c8b0ea1d 100644 --- a/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderExecutor.cs +++ b/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderExecutor.cs @@ -256,7 +256,8 @@ public class FfmpegBuilderExecutor: FfmpegBuilderNode internal string[] GetHardwareDecodingArgs(NodeParameters args, string localFile) { - var video = this.Model.VideoStreams.Where(x => x.Stream.IsImage == false).FirstOrDefault(); + string testFile = FileHelper.Combine(args.TempPath, Guid.NewGuid() + ".hwtest.mkv"); + var video = this.Model.VideoStreams.FirstOrDefault(x => x.Stream.IsImage == false); if (string.IsNullOrWhiteSpace(video?.Stream?.Codec)) return new string[] { }; bool isH264 = video.Stream.Codec.Contains("264"); @@ -265,50 +266,63 @@ public class FfmpegBuilderExecutor: FfmpegBuilderNode var decoders = isH264 ? Decoders_h264(args) : isHevc ? Decoders_hevc(args) : Decoders_Default(args); - foreach (var hw in decoders) + try { - if (hw == null) - continue; - if (CanUseHardwareEncoding.DisabledByVariables(args, hw)) + foreach (var hw in decoders) { - args.Logger?.ILog("HW disabled by variables: " + string.Join(", ", hw)); - continue; + if (hw == null) + continue; + if (CanUseHardwareEncoding.DisabledByVariables(args, hw)) + { + args.Logger?.ILog("HW disabled by variables: " + string.Join(", ", hw)); + continue; + } + + try + { + var arguments = new List() + { + "-y", + }; + arguments.AddRange(hw); + arguments.AddRange(new[] + { + "-i", localFile, + "-frames:v", "10", + testFile + }); + + var result = args.Execute(new ExecuteArgs + { + Command = FFMPEG, + ArgumentList = arguments.ToArray() + }); + if (result.ExitCode == 0) + { + args.Logger?.ILog("Supported hardware decoding detected: " + string.Join(" ", hw)); + + return hw; + } + } + catch (Exception) + { + } } + args.Logger?.ILog("No hardware decoding availble"); + return new string[] { }; + } + finally + { try { - var arguments = new List() - { - "-y", - }; - arguments.AddRange(hw); - arguments.AddRange(new[] - { - "-f", "lavfi", - "-i", "color=color=red", - "-frames:v", "10", - localFile - }); - - var result = args.Execute(new ExecuteArgs - { - Command = FFMPEG, - ArgumentList = arguments.ToArray() - }); - if (result.ExitCode == 0) - { - args.Logger?.ILog("Supported hardware decoding detected: " + string.Join(" ", hw)); - - return hw; - } + if (System.IO.File.Exists(testFile)) + System.IO.File.Delete(testFile); } catch (Exception) { } } - - args.Logger?.ILog("No hardware decoding availble"); - return new string[] { }; } private static readonly bool IsMac = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);