diff --git a/.gitignore b/.gitignore index 0e4c305..4162bab 100644 --- a/.gitignore +++ b/.gitignore @@ -330,3 +330,5 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser +#FFMPEG binaries +/Encoder/ffmpeg/* \ No newline at end of file diff --git a/Encoder/Encoder.csproj b/Encoder/Encoder.csproj index 59f3754..74bad04 100644 --- a/Encoder/Encoder.csproj +++ b/Encoder/Encoder.csproj @@ -18,4 +18,17 @@ + + + + + + + Always + + + Always + + + diff --git a/Encoder/EncoderService.cs b/Encoder/EncoderService.cs index e7414ec..2d8abbf 100644 --- a/Encoder/EncoderService.cs +++ b/Encoder/EncoderService.cs @@ -1,4 +1,6 @@ +using System.Diagnostics; using FFMpegCore; +using FFMpegCore.Helpers; using Microsoft.Extensions.Options; namespace Encoder; @@ -81,6 +83,20 @@ public class EncoderService : BackgroundService, IEncoderService { job.Status = JobStatus.InProgress; var file = job.FilePath; string outputPath = Path.Combine(options.TemporaryFilesPath, Path.GetFileName(job.FilePath)); + + // Determine if an NVDA graphics card is available for hardware acceleration + ProcessStartInfo psi = new ProcessStartInfo { + FileName = Path.Combine(options.FfmpegPath, "ffmpeg.exe"), + Arguments = @"-hide_banner -init_hw_device ""list""", + CreateNoWindow = true, + UseShellExecute = true, + RedirectStandardOutput = true + }; + using Process ffmpeg = Process.Start(psi)!; + string output = await ffmpeg.StandardOutput.ReadToEndAsync(cancellationToken); + await ffmpeg.WaitForExitAsync(cancellationToken); + bool nvenc = output.Contains("cuda"); + IEncodingStrategy strategy = job.RequestedEncoding switch { EncoderType.H264 => new H264EncodingStrategy(file, outputPath, job), EncoderType.HEVC => new HEVCEncodingStrategy(file, outputPath, job),