mirror of https://github.com/n00mkrad/flowframes
Add Intel QuickSync (QSV) encoder support
This commit is contained in:
parent
b782c8334d
commit
8749f425de
|
@ -12,7 +12,7 @@
|
|||
public class Encoding
|
||||
{
|
||||
public enum Codec { H264, H265, AV1, VP9, ProRes, Gif, Png, Jpeg, Webp, Ffv1, Huffyuv, Magicyuv, Rawvideo }
|
||||
public enum Encoder { X264, X265, SvtAv1, VpxVp9, Nvenc264, Nvenc265, NvencAv1, Amf264, Amf265, ProResKs, Gif, Png, Jpeg, Webp, Ffv1, Huffyuv, Magicyuv, Rawvideo }
|
||||
public enum Encoder { X264, X265, SvtAv1, VpxVp9, Nvenc264, Nvenc265, NvencAv1, Amf264, Amf265, Qsv264, Qsv265, ProResKs, Gif, Png, Jpeg, Webp, Ffv1, Huffyuv, Magicyuv, Rawvideo }
|
||||
public enum PixelFormat { Yuv420P, Yuva420P, Yuv420P10Le, Yuv422P, Yuv422P10Le, Yuv444P, Yuv444P10Le, Yuva444P10Le, Rgb24, Rgba, Pal8 };
|
||||
|
||||
public class Quality
|
||||
|
|
|
@ -28,6 +28,8 @@ namespace Flowframes.Data
|
|||
{ Enums.Encoding.Encoder.NvencAv1.ToString(), "AV1 NVENC" },
|
||||
{ Enums.Encoding.Encoder.Amf264.ToString(), "h264 AMF" },
|
||||
{ Enums.Encoding.Encoder.Amf265.ToString(), "h265 AMF" },
|
||||
{ Enums.Encoding.Encoder.Qsv264.ToString(), "h264 QuickSync" },
|
||||
{ Enums.Encoding.Encoder.Qsv265.ToString(), "h265 QuickSync" },
|
||||
{ Enums.Encoding.Encoder.Gif.ToString(), "GIF" },
|
||||
{ Enums.Encoding.Encoder.Png.ToString(), "PNG" },
|
||||
{ Enums.Encoding.Encoder.Jpeg.ToString(), "JPEG" },
|
||||
|
|
|
@ -271,6 +271,18 @@ namespace Flowframes.Media
|
|||
args.Add($"-b:v 0 -rc cqp -qp_i {crf} -qp_p {crf} -quality 2");
|
||||
}
|
||||
|
||||
if (enc == Encoder.Qsv264)
|
||||
{
|
||||
int crf = GetCrf(settings);
|
||||
args.Add($"-preset veryslow -global_quality {crf}");
|
||||
}
|
||||
|
||||
if (enc == Encoder.Qsv265)
|
||||
{
|
||||
int crf = GetCrf(settings);
|
||||
args.Add($"-preset veryslow -global_quality {crf}");
|
||||
}
|
||||
|
||||
if (enc == Encoder.ProResKs)
|
||||
{
|
||||
var profile = ParseUtils.GetEnum<Quality.ProResProfile>(settings.Quality, true, Strings.VideoQuality);
|
||||
|
|
|
@ -136,6 +136,32 @@ namespace Flowframes.MiscUtils
|
|||
};
|
||||
}
|
||||
|
||||
if (encoder == Encoder.Qsv264)
|
||||
{
|
||||
return new EncoderInfoVideo
|
||||
{
|
||||
Codec = Codec.H264,
|
||||
Name = "h264_qsv",
|
||||
PixelFormats = new List<PixFmt>() { PixFmt.Yuv420P },
|
||||
QualityLevels = ParseUtils.GetEnumStrings<Quality.Common>(),
|
||||
QualityDefault = (int)Quality.Common.VeryHigh,
|
||||
HwAccelerated = true,
|
||||
};
|
||||
}
|
||||
|
||||
if (encoder == Encoder.Qsv265)
|
||||
{
|
||||
return new EncoderInfoVideo
|
||||
{
|
||||
Codec = Codec.H265,
|
||||
Name = "hevc_qsv",
|
||||
PixelFormats = new List<PixFmt>() { PixFmt.Yuv420P },
|
||||
QualityLevels = ParseUtils.GetEnumStrings<Quality.Common>(),
|
||||
QualityDefault = (int)Quality.Common.VeryHigh,
|
||||
HwAccelerated = true,
|
||||
};
|
||||
}
|
||||
|
||||
if (encoder == Encoder.ProResKs)
|
||||
{
|
||||
return new EncoderInfoVideo
|
||||
|
@ -274,7 +300,11 @@ namespace Flowframes.MiscUtils
|
|||
var allEncoders = Enum.GetValues(typeof(Encoder)).Cast<Encoder>();
|
||||
var supportedCodecs = GetSupportedCodecs(format);
|
||||
var availableEncoders = supportedCodecs.SelectMany(codec => allEncoders.Where(enc => enc.GetInfo().Codec == codec)).ToList();
|
||||
RemoveIncompatibleEncoders(ref availableEncoders, new[] { Encoder.Nvenc264, Encoder.Nvenc265, Encoder.NvencAv1, Encoder.Amf264, Encoder.Amf265 });
|
||||
RemoveIncompatibleEncoders(ref availableEncoders, new[] {
|
||||
Encoder.Nvenc264, Encoder.Nvenc265, Encoder.NvencAv1,
|
||||
Encoder.Amf264, Encoder.Amf265,
|
||||
Encoder.Qsv264, Encoder.Qsv265,
|
||||
});
|
||||
return availableEncoders;
|
||||
}
|
||||
|
||||
|
@ -306,6 +336,8 @@ namespace Flowframes.MiscUtils
|
|||
multiplier = 1.15f;
|
||||
if (encoder == Encoder.NvencAv1)
|
||||
multiplier = 1.3f;
|
||||
if (encoder == Encoder.Qsv265)
|
||||
multiplier = 0.8f;
|
||||
|
||||
return (baseCrf * multiplier).RoundToInt();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue