From 7662150b893f00e54f62eb8fb916ebac959a717a Mon Sep 17 00:00:00 2001 From: Dominic Date: Wed, 26 Jun 2024 12:04:39 +0200 Subject: [PATCH] fix codec comparison; encode with higher quality for intermediate results --- src/project.rs | 2 +- src/render/ffmpeg.rs | 28 ++++++++++++++++++++++++---- src/render/mod.rs | 2 ++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/project.rs b/src/project.rs index a16da81..3611317 100644 --- a/src/project.rs +++ b/src/project.rs @@ -51,7 +51,7 @@ impl Resolution { } pub(crate) fn default_codec(self) -> FfmpegOutputFormat { - if self.width <= 1920 { + if self.width > 1920 { FfmpegOutputFormat::Av1Opus } else { FfmpegOutputFormat::AvcAac diff --git a/src/render/ffmpeg.rs b/src/render/ffmpeg.rs index 8772136..af41095 100644 --- a/src/render/ffmpeg.rs +++ b/src/render/ffmpeg.rs @@ -63,8 +63,14 @@ pub(crate) enum FfmpegOutputFormat { AvcAac } +pub(crate) enum FfmpegOutputQuality { + Default, + VisuallyLossless +} + pub(crate) struct FfmpegOutput { pub(crate) format: FfmpegOutputFormat, + pub(crate) quality: FfmpegOutputQuality, pub(crate) audio_bitrate: Option, pub(crate) video_bitrate: Option, @@ -89,6 +95,7 @@ impl FfmpegOutput { pub(crate) fn new(format: FfmpegOutputFormat, path: PathBuf) -> Self { Self { format, + quality: FfmpegOutputQuality::Default, audio_bitrate: None, video_bitrate: None, @@ -117,7 +124,7 @@ impl FfmpegOutput { self } - fn append_to_cmd(self, cmd: &mut Command, venc: bool, _aenc: bool, mut vaapi: bool) { + fn append_to_cmd(self, cmd: &mut Command, venc: bool, _aenc: bool, vaapi: bool) { // select codec and bitrate/crf if venc { let vcodec = match (self.format, vaapi) { @@ -133,10 +140,23 @@ impl FfmpegOutput { if vcodec == "libsvtav1" { cmd.arg("-svtav1-params").arg("fast-decode=1"); cmd.arg("-preset").arg("7"); - cmd.arg("-crf").arg("28"); + cmd.arg("-crf").arg(match self.quality { + FfmpegOutputQuality::Default => "28", + FfmpegOutputQuality::VisuallyLossless => "18" + }); } else if vcodec == "h264" { - cmd.arg("-preset").arg("slow"); - cmd.arg("-crf").arg("21"); + match self.quality { + FfmpegOutputQuality::Default => { + cmd.arg("-preset").arg("slow"); + cmd.arg("-crf").arg("21"); + }, + FfmpegOutputQuality::VisuallyLossless => { + // the quality is not impacted by speed, only the bitrate, and + // for this setting we don't really care about bitrate + cmd.arg("-preset").arg("veryfast"); + cmd.arg("-crf").arg("17"); + } + } } else if let Some(bv) = self.video_bitrate { cmd.arg("-b:v").arg(bv.to_string()); } diff --git a/src/render/mod.rs b/src/render/mod.rs index 1e361cc..1845862 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -15,6 +15,7 @@ use crate::{ use anyhow::{bail, Context}; use camino::{Utf8Path as Path, Utf8PathBuf as PathBuf}; use console::style; +use ffmpeg::FfmpegOutputQuality; use std::{ borrow::Cow, collections::VecDeque, @@ -377,6 +378,7 @@ impl<'a> Renderer<'a> { let output = self.video_file_output(); let mut ffmpeg = Ffmpeg::new(FfmpegOutput { + quality: FfmpegOutputQuality::VisuallyLossless, video_bitrate: Some(source_res.bitrate() * 3), ..FfmpegOutput::new(self.format, output.clone()) });