From 459e2ee3574c93d4eb7a46b8487d35af19b44105 Mon Sep 17 00:00:00 2001 From: Jaex Date: Thu, 11 May 2023 15:16:00 +0300 Subject: [PATCH] Added NVENC support to video converter tool --- ShareX.MediaLib/Enums.cs | 4 +++ ShareX.MediaLib/Forms/VideoConverterForm.cs | 4 +++ ShareX.MediaLib/VideoConverterOptions.cs | 36 +++++++++++++++++++++ ShareX.ScreenCaptureLib/Enums.cs | 4 +-- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/ShareX.MediaLib/Enums.cs b/ShareX.MediaLib/Enums.cs index a005f367e..b2db727f1 100644 --- a/ShareX.MediaLib/Enums.cs +++ b/ShareX.MediaLib/Enums.cs @@ -43,6 +43,10 @@ public enum ConverterVideoCodecs x264, [Description("H.265 / x265")] x265, + [Description("H.264 / NVENC")] + h264_nvenc, + [Description("HEVC / NVENC")] + hevc_nvenc, [Description("VP8")] vp8, [Description("VP9")] diff --git a/ShareX.MediaLib/Forms/VideoConverterForm.cs b/ShareX.MediaLib/Forms/VideoConverterForm.cs index 0fddc9c75..f9b7a9fb9 100644 --- a/ShareX.MediaLib/Forms/VideoConverterForm.cs +++ b/ShareX.MediaLib/Forms/VideoConverterForm.cs @@ -93,6 +93,8 @@ private void UpdateOptions() { case ConverterVideoCodecs.x264: case ConverterVideoCodecs.x265: + case ConverterVideoCodecs.h264_nvenc: + case ConverterVideoCodecs.hevc_nvenc: case ConverterVideoCodecs.vp8: case ConverterVideoCodecs.vp9: case ConverterVideoCodecs.av1: @@ -110,10 +112,12 @@ private void UpdateOptions() switch (Options.VideoCodec) { case ConverterVideoCodecs.x264: + case ConverterVideoCodecs.h264_nvenc: tbVideoQuality.Minimum = FFmpegCLIManager.x264_min; tbVideoQuality.Maximum = FFmpegCLIManager.x264_max; break; case ConverterVideoCodecs.x265: + case ConverterVideoCodecs.hevc_nvenc: tbVideoQuality.Minimum = FFmpegCLIManager.x265_min; tbVideoQuality.Maximum = FFmpegCLIManager.x265_max; break; diff --git a/ShareX.MediaLib/VideoConverterOptions.cs b/ShareX.MediaLib/VideoConverterOptions.cs index 90ad458be..7a5e986e2 100644 --- a/ShareX.MediaLib/VideoConverterOptions.cs +++ b/ShareX.MediaLib/VideoConverterOptions.cs @@ -118,6 +118,38 @@ public string GetFFmpegArgs() args.Append($"-crf {VideoQuality.Clamp(FFmpegCLIManager.x265_min, FFmpegCLIManager.x265_max)} "); } break; + case ConverterVideoCodecs.h264_nvenc: // https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENC + args.Append("-c:v h264_nvenc "); + args.Append("-preset p4 "); + args.Append("-tune hq "); + args.Append("-profile:v high "); + if (VideoQualityUseBitrate) + { + args.Append($"-b:v {VideoQualityBitrate}k "); + } + else + { + args.Append("-rc vbr "); + args.Append($"-cq {VideoQuality.Clamp(FFmpegCLIManager.x264_min, FFmpegCLIManager.x264_max)} "); + args.Append("-b:v 0 "); + } + break; + case ConverterVideoCodecs.hevc_nvenc: // https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENC + args.Append("-c:v hevc_nvenc "); + args.Append("-preset p4 "); + args.Append("-tune hq "); + args.Append("-profile:v main "); + if (VideoQualityUseBitrate) + { + args.Append($"-b:v {VideoQualityBitrate}k "); + } + else + { + args.Append("-rc vbr "); + args.Append($"-cq {VideoQuality.Clamp(FFmpegCLIManager.x265_min, FFmpegCLIManager.x265_max)} "); + args.Append("-b:v 0 "); + } + break; case ConverterVideoCodecs.vp8: // https://trac.ffmpeg.org/wiki/Encode/VP8 args.Append("-c:v libvpx "); if (VideoQualityUseBitrate) @@ -184,6 +216,8 @@ public string GetFFmpegArgs() { case ConverterVideoCodecs.x264: // https://trac.ffmpeg.org/wiki/Encode/AAC case ConverterVideoCodecs.x265: + case ConverterVideoCodecs.h264_nvenc: + case ConverterVideoCodecs.hevc_nvenc: args.Append("-c:a aac "); args.Append("-b:a 128k "); break; @@ -218,6 +252,8 @@ public string GetFileExtension() default: case ConverterVideoCodecs.x264: case ConverterVideoCodecs.x265: + case ConverterVideoCodecs.h264_nvenc: + case ConverterVideoCodecs.hevc_nvenc: return "mp4"; case ConverterVideoCodecs.vp8: case ConverterVideoCodecs.vp9: diff --git a/ShareX.ScreenCaptureLib/Enums.cs b/ShareX.ScreenCaptureLib/Enums.cs index b54f87b01..a719c299e 100644 --- a/ShareX.ScreenCaptureLib/Enums.cs +++ b/ShareX.ScreenCaptureLib/Enums.cs @@ -88,9 +88,9 @@ public enum FFmpegVideoCodec libx264, [Description("H.265 / x265")] libx265, - [Description("VP8 (WebM)")] + [Description("VP8")] libvpx, - [Description("VP9 (WebM)")] + [Description("VP9")] libvpx_vp9, [Description("MPEG-4 / Xvid")] libxvid,