diff --git a/NotEnoughAV1Encodes/MainWindow.xaml b/NotEnoughAV1Encodes/MainWindow.xaml
index 09a62a8..db8422d 100644
--- a/NotEnoughAV1Encodes/MainWindow.xaml
+++ b/NotEnoughAV1Encodes/MainWindow.xaml
@@ -291,7 +291,8 @@
-
+
+
@@ -578,6 +579,30 @@
+
+
diff --git a/NotEnoughAV1Encodes/MainWindow.xaml.cs b/NotEnoughAV1Encodes/MainWindow.xaml.cs
index 9e5f69f..57add1e 100644
--- a/NotEnoughAV1Encodes/MainWindow.xaml.cs
+++ b/NotEnoughAV1Encodes/MainWindow.xaml.cs
@@ -836,6 +836,18 @@ private void ComboBoxVideoEncoder_SelectionChanged(object sender, System.Windows
ComboBoxVideoBitDepth.Visibility = Visibility.Collapsed;
ComboBoxVideoBitDepthLimited.Visibility = Visibility.Visible;
}
+ else if (ComboBoxVideoEncoder.SelectedIndex is (int) Video.Encoder.NVENCAV1)
+ {
+ // av1 hardware (nvenc rtx 4000)
+ SliderEncoderPreset.Maximum = 2;
+ SliderEncoderPreset.Value = 1;
+ CheckBoxTwoPassEncoding.IsEnabled = false;
+ CheckBoxTwoPassEncoding.IsOn = false;
+ CheckBoxRealTimeMode.IsOn = false;
+ CheckBoxRealTimeMode.Visibility = Visibility.Collapsed;
+ ComboBoxVideoBitDepth.Visibility = Visibility.Collapsed;
+ ComboBoxVideoBitDepthLimited.Visibility = Visibility.Visible;
+ }
if (ComboBoxVideoEncoder.SelectedIndex is (int) Video.Encoder.X264)
{
if (ComboBoxQualityMode.SelectedIndex == 2)
@@ -1038,6 +1050,25 @@ private void ComboBoxQualityModeQSVAV1_SelectionChanged(object sender, System.Wi
}
}
+ private void ComboBoxQualityModeNVENCAV1_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
+ {
+ if (ComboBoxQualityModeNVENCAV1.SelectedIndex == 0)
+ {
+ SliderQualityNVENCAV1.IsEnabled = true;
+ TextBoxBitrateNVENCAV1.IsEnabled = false;
+ }
+ else if (ComboBoxQualityModeNVENCAV1.SelectedIndex == 1)
+ {
+ SliderQualityNVENCAV1.IsEnabled = false;
+ TextBoxBitrateNVENCAV1.IsEnabled = true;
+ }
+ else if (ComboBoxQualityModeNVENCAV1.SelectedIndex == 2)
+ {
+ SliderQualityNVENCAV1.IsEnabled = false;
+ TextBoxBitrateNVENCAV1.IsEnabled = true;
+ }
+ }
+
private void CheckBoxTwoPassEncoding_Checked(object sender, RoutedEventArgs e)
{
if (ComboBoxVideoEncoder.SelectedIndex == (int) Video.Encoder.SVTAV1 && ComboBoxQualityModeSVTAV1.SelectedIndex == 0 && CheckBoxTwoPassEncoding.IsOn)
@@ -1099,6 +1130,12 @@ private void SliderEncoderPreset_ValueChanged(object sender, RoutedPropertyChang
{
LabelSpeedValue.Content = GenerateQuickSyncEncoderSpeed();
}
+
+ // av1 hardware (nvenc rtx 4000)
+ if (ComboBoxVideoEncoder.SelectedIndex is (int)Video.Encoder.NVENCAV1)
+ {
+ LabelSpeedValue.Content = GenerateNVENCEncoderSpeed();
+ }
}
private void CheckBoxCustomVideoSettings_Toggled(object sender, RoutedEventArgs e)
@@ -1575,6 +1612,7 @@ private string GenerateEncoderCommand()
9 => GenerateHEVCFFmpegCommand(),
10 => GenerateAVCFFmpegCommand(),
12 => GenerateQuickSyncCommand(),
+ 13 => GenerateNVENCCommand(),
_ => ""
};
@@ -1947,7 +1985,7 @@ private string GenerateAVCFFmpegCommand()
private string GenerateQuickSyncCommand()
{
string settings = "-f yuv4mpegpipe - | " +
- "\"" + Path.Combine(Directory.GetCurrentDirectory(), "Apps", "qsvenc", "QSVEncC64.exe") + "\" --y4m -i -";
+ "\"" + Path.Combine(Directory.GetCurrentDirectory(), "Apps", "qsvenc", "QSVEncC64.exe") + "\" --y4m -i -";
// Codec
settings += " --codec av1";
@@ -1988,6 +2026,38 @@ private string GenerateQuickSyncCommand()
return settings;
}
+ private string GenerateNVENCCommand()
+ {
+ string settings = "-f yuv4mpegpipe - | " +
+ "\"" + Path.Combine(Directory.GetCurrentDirectory(), "Apps", "nvenc", "NVEncC64.exe") + "\" --y4m -i -";
+
+ // Codec
+ settings += " --codec av1";
+
+ // Quality / Bitrate Selection
+ string quality = ComboBoxQualityModeQSVAV1.SelectedIndex switch
+ {
+ 0 => " --cqp " + SliderQualityQSVAV1.Value,
+ 1 => " --vbr " + TextBoxBitrateQSVAV1.Text,
+ 2 => " --cbr " + TextBoxBitrateQSVAV1.Text,
+ _ => ""
+ };
+
+ // Preset
+ settings += quality + " --quality " + GenerateNVENCEncoderSpeed();
+
+ // Bit-Depth
+ settings += " --output-depth ";
+ settings += ComboBoxVideoBitDepthLimited.SelectedIndex switch
+ {
+ 0 => "8",
+ 1 => "10",
+ _ => "8"
+ };
+
+ return settings;
+ }
+
private string GenerateMPEGEncoderSpeed()
{
return SliderEncoderPreset.Value switch
@@ -2021,6 +2091,17 @@ private string GenerateQuickSyncEncoderSpeed()
};
}
+ private string GenerateNVENCEncoderSpeed()
+ {
+ return SliderEncoderPreset.Value switch
+ {
+ 0 => "quality",
+ 1 => "default",
+ 2 => "performance",
+ _ => "default"
+ };
+ }
+
private string GenerateKeyFrameInerval()
{
int seconds = 10;
diff --git a/NotEnoughAV1Encodes/Video/Encoder.cs b/NotEnoughAV1Encodes/Video/Encoder.cs
index bdac99c..4ed963c 100644
--- a/NotEnoughAV1Encodes/Video/Encoder.cs
+++ b/NotEnoughAV1Encodes/Video/Encoder.cs
@@ -11,6 +11,7 @@ public enum Encoder
SVTAV1 = 7,
X265 = 9,
X264 = 10,
- QSVAV1 = 12
+ QSVAV1 = 12,
+ NVENCAV1 = 13
}
}
diff --git a/NotEnoughAV1Encodes/Video/VideoEncode.cs b/NotEnoughAV1Encodes/Video/VideoEncode.cs
index dab20c3..ce3cbdf 100644
--- a/NotEnoughAV1Encodes/Video/VideoEncode.cs
+++ b/NotEnoughAV1Encodes/Video/VideoEncode.cs
@@ -119,7 +119,7 @@ public void Encode(int _workerCount, List VideoChunks, Queue.QueueElemen
ChunkOutput = "\"" + Path.Combine(Global.Temp, "NEAV1E", queueElement.UniqueIdentifier, "Video", index.ToString("D6") + ".mp4") + "\"";
}
- if (queueElement.EncodingMethod == (int) Encoder.QSVAV1)
+ if (queueElement.EncodingMethod is (int) Encoder.QSVAV1 or (int) Encoder.NVENCAV1)
{
ChunkOutput = " -o \"" + Path.Combine(Global.Temp, "NEAV1E", queueElement.UniqueIdentifier, "Video", index.ToString("D6") + ".webm") + "\"";
}
diff --git a/NotEnoughAV1Encodes/Video/VideoMuxer.cs b/NotEnoughAV1Encodes/Video/VideoMuxer.cs
index cd5be2c..7c0a10e 100644
--- a/NotEnoughAV1Encodes/Video/VideoMuxer.cs
+++ b/NotEnoughAV1Encodes/Video/VideoMuxer.cs
@@ -108,7 +108,7 @@ private static void MuxFFmpegChunks(Queue.QueueElement queueElement)
string DAR = "";
// Set Display Aspect Ratio for external encoders
- if (queueElement.EncodingMethod is (int) Encoder.AOMENC or (int) Encoder.RAV1E or (int) Encoder.SVTAV1 && !string.IsNullOrEmpty(queueElement.VideoDB.MIDisplayAspectRatio))
+ if (queueElement.EncodingMethod is (int) Encoder.AOMENC or (int) Encoder.RAV1E or (int) Encoder.SVTAV1 or (int) Encoder.QSVAV1 or (int) Encoder.NVENCAV1 && !string.IsNullOrEmpty(queueElement.VideoDB.MIDisplayAspectRatio))
{
if (queueElement.VideoDB.MIPixelAspectRatio != "1.000")
{
@@ -235,7 +235,7 @@ private static IOrderedEnumerable GetSortedVideoChunks(Queue.QueueElemen
IOrderedEnumerable sortedChunks = null;
// FFmpeg AOM, Rav1e, SVT-AV1, VPX-VP9
- if (queueElement.EncodingMethod is (int) Encoder.AOMFFMPEG or (int) Encoder.RAV1EFFMPEG or (int) Encoder.SVTAV1FFMPEG or (int) Encoder.VPXVP9FFMPEG or (int) Encoder.QSVAV1)
+ if (queueElement.EncodingMethod is (int) Encoder.AOMFFMPEG or (int) Encoder.RAV1EFFMPEG or (int) Encoder.SVTAV1FFMPEG or (int) Encoder.VPXVP9FFMPEG or (int) Encoder.QSVAV1 or (int) Encoder.NVENCAV1)
{
Global.Logger("DEBUG - VideoMuxer.Concat() => Reading Chunk Directory by *.webm files", queueElement.Output + ".log");
sortedChunks = Directory.GetFiles(Path.Combine(Global.Temp, "NEAV1E", queueElement.UniqueIdentifier, "Video"), "*.webm").OrderBy(f => f);
diff --git a/NotEnoughAV1Encodes/Video/VideoSettings.cs b/NotEnoughAV1Encodes/Video/VideoSettings.cs
index d49a7c6..679814f 100644
--- a/NotEnoughAV1Encodes/Video/VideoSettings.cs
+++ b/NotEnoughAV1Encodes/Video/VideoSettings.cs
@@ -72,6 +72,11 @@ public class VideoSettings
public int QSVAV1Quantizer { get; set; } = 24;
public string QSVAV1Bitrate { get; set; } = "2000";
+ // Video Quality Settings NVENC AV1
+ public int NVENCAV1QualityMode { get; set; }
+ public int NVENCAV1Quantizer { get; set; } = 24;
+ public string NVENCAV1Bitrate { get; set; } = "2000";
+
// Audio
public int AudioCodecMono { get; set; } = 0;
public int AudioBitrateMono { get; set; } = 64;