diff --git a/ShareX.MediaLib/Enums.cs b/ShareX.MediaLib/Enums.cs index f636ad60e..d4bb1a50b 100644 --- a/ShareX.MediaLib/Enums.cs +++ b/ShareX.MediaLib/Enums.cs @@ -43,10 +43,12 @@ public enum ConverterVideoCodecs x264, [Description("H.265 / x265")] x265, - [Description("VP8 (WebM)")] + [Description("VP8")] vp8, - [Description("VP9 (WebM)")] + [Description("VP9")] vp9, + [Description("AV1")] + av1, [Description("MPEG-4 / Xvid")] xvid, [Description("GIF")] diff --git a/ShareX.MediaLib/FFmpegCLIManager.cs b/ShareX.MediaLib/FFmpegCLIManager.cs index 555efcb99..caf947387 100644 --- a/ShareX.MediaLib/FFmpegCLIManager.cs +++ b/ShareX.MediaLib/FFmpegCLIManager.cs @@ -51,6 +51,8 @@ public class FFmpegCLIManager : ExternalCLIManager public const int vp8_max = 63; public const int vp9_min = 0; public const int vp9_max = 63; + public const int av1_min = 0; + public const int av1_max = 63; public const int xvid_min = 1; public const int xvid_max = 31; public const int mp3_min = 0; diff --git a/ShareX.MediaLib/Forms/VideoConverterForm.cs b/ShareX.MediaLib/Forms/VideoConverterForm.cs index c38d87052..0fddc9c75 100644 --- a/ShareX.MediaLib/Forms/VideoConverterForm.cs +++ b/ShareX.MediaLib/Forms/VideoConverterForm.cs @@ -95,6 +95,7 @@ private void UpdateOptions() case ConverterVideoCodecs.x265: case ConverterVideoCodecs.vp8: case ConverterVideoCodecs.vp9: + case ConverterVideoCodecs.av1: case ConverterVideoCodecs.xvid: cbVideoQualityUseBitrate.Visible = true; tbVideoQuality.Visible = lblVideoQualityValue.Visible = lblVideoQualityLower.Visible = lblVideoQualityHigher.Visible = !Options.VideoQualityUseBitrate; @@ -124,6 +125,10 @@ private void UpdateOptions() tbVideoQuality.Minimum = FFmpegCLIManager.vp9_min; tbVideoQuality.Maximum = FFmpegCLIManager.vp9_max; break; + case ConverterVideoCodecs.av1: + tbVideoQuality.Minimum = FFmpegCLIManager.av1_min; + tbVideoQuality.Maximum = FFmpegCLIManager.av1_max; + break; case ConverterVideoCodecs.xvid: tbVideoQuality.Minimum = FFmpegCLIManager.xvid_min; tbVideoQuality.Maximum = FFmpegCLIManager.xvid_max; diff --git a/ShareX.MediaLib/VideoConverterOptions.cs b/ShareX.MediaLib/VideoConverterOptions.cs index e1815067c..67813b37a 100644 --- a/ShareX.MediaLib/VideoConverterOptions.cs +++ b/ShareX.MediaLib/VideoConverterOptions.cs @@ -136,6 +136,17 @@ public string GetFFmpegArgs() args.Append("-b:v 0 "); } break; + case ConverterVideoCodecs.av1: // https://trac.ffmpeg.org/wiki/Encode/AV1 + args.Append("-c:v libsvtav1 "); + if (VideoQualityUseBitrate) + { + args.Append($"-b:v {VideoQualityBitrate}k "); + } + else + { + args.Append($"-crf {VideoQuality.Clamp(FFmpegCLIManager.av1_min, FFmpegCLIManager.av1_max)} "); + } + break; case ConverterVideoCodecs.xvid: // https://trac.ffmpeg.org/wiki/Encode/MPEG-4 args.Append("-c:v libxvid "); if (VideoQualityUseBitrate) @@ -175,6 +186,10 @@ public string GetFFmpegArgs() args.Append("-c:a libvorbis "); args.Append("-q:a 3 "); break; + case ConverterVideoCodecs.av1: // https://ffmpeg.org/ffmpeg-codecs.html#libopus-1 + args.Append("-c:a libopus "); + args.Append("-b:a 128k "); + break; case ConverterVideoCodecs.xvid: // https://trac.ffmpeg.org/wiki/Encode/MP3 args.Append("-c:a libmp3lame "); args.Append("-q:a 4 "); @@ -201,6 +216,8 @@ public string GetFileExtension() case ConverterVideoCodecs.vp8: case ConverterVideoCodecs.vp9: return "webm"; + case ConverterVideoCodecs.av1: + return "mkv"; case ConverterVideoCodecs.xvid: return "avi"; case ConverterVideoCodecs.gif: