fix codec comparison; encode with higher quality for intermediate results
All checks were successful
Trigger quay.io Webhook / run (push) Successful in 5s
All checks were successful
Trigger quay.io Webhook / run (push) Successful in 5s
This commit is contained in:
parent
b6fb0fa184
commit
7662150b89
3 changed files with 27 additions and 5 deletions
|
@ -51,7 +51,7 @@ impl Resolution {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn default_codec(self) -> FfmpegOutputFormat {
|
pub(crate) fn default_codec(self) -> FfmpegOutputFormat {
|
||||||
if self.width <= 1920 {
|
if self.width > 1920 {
|
||||||
FfmpegOutputFormat::Av1Opus
|
FfmpegOutputFormat::Av1Opus
|
||||||
} else {
|
} else {
|
||||||
FfmpegOutputFormat::AvcAac
|
FfmpegOutputFormat::AvcAac
|
||||||
|
|
|
@ -63,8 +63,14 @@ pub(crate) enum FfmpegOutputFormat {
|
||||||
AvcAac
|
AvcAac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) enum FfmpegOutputQuality {
|
||||||
|
Default,
|
||||||
|
VisuallyLossless
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) struct FfmpegOutput {
|
pub(crate) struct FfmpegOutput {
|
||||||
pub(crate) format: FfmpegOutputFormat,
|
pub(crate) format: FfmpegOutputFormat,
|
||||||
|
pub(crate) quality: FfmpegOutputQuality,
|
||||||
pub(crate) audio_bitrate: Option<u64>,
|
pub(crate) audio_bitrate: Option<u64>,
|
||||||
pub(crate) video_bitrate: Option<u64>,
|
pub(crate) video_bitrate: Option<u64>,
|
||||||
|
|
||||||
|
@ -89,6 +95,7 @@ impl FfmpegOutput {
|
||||||
pub(crate) fn new(format: FfmpegOutputFormat, path: PathBuf) -> Self {
|
pub(crate) fn new(format: FfmpegOutputFormat, path: PathBuf) -> Self {
|
||||||
Self {
|
Self {
|
||||||
format,
|
format,
|
||||||
|
quality: FfmpegOutputQuality::Default,
|
||||||
audio_bitrate: None,
|
audio_bitrate: None,
|
||||||
video_bitrate: None,
|
video_bitrate: None,
|
||||||
|
|
||||||
|
@ -117,7 +124,7 @@ impl FfmpegOutput {
|
||||||
self
|
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
|
// select codec and bitrate/crf
|
||||||
if venc {
|
if venc {
|
||||||
let vcodec = match (self.format, vaapi) {
|
let vcodec = match (self.format, vaapi) {
|
||||||
|
@ -133,10 +140,23 @@ impl FfmpegOutput {
|
||||||
if vcodec == "libsvtav1" {
|
if vcodec == "libsvtav1" {
|
||||||
cmd.arg("-svtav1-params").arg("fast-decode=1");
|
cmd.arg("-svtav1-params").arg("fast-decode=1");
|
||||||
cmd.arg("-preset").arg("7");
|
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" {
|
} else if vcodec == "h264" {
|
||||||
|
match self.quality {
|
||||||
|
FfmpegOutputQuality::Default => {
|
||||||
cmd.arg("-preset").arg("slow");
|
cmd.arg("-preset").arg("slow");
|
||||||
cmd.arg("-crf").arg("21");
|
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 {
|
} else if let Some(bv) = self.video_bitrate {
|
||||||
cmd.arg("-b:v").arg(bv.to_string());
|
cmd.arg("-b:v").arg(bv.to_string());
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ use crate::{
|
||||||
use anyhow::{bail, Context};
|
use anyhow::{bail, Context};
|
||||||
use camino::{Utf8Path as Path, Utf8PathBuf as PathBuf};
|
use camino::{Utf8Path as Path, Utf8PathBuf as PathBuf};
|
||||||
use console::style;
|
use console::style;
|
||||||
|
use ffmpeg::FfmpegOutputQuality;
|
||||||
use std::{
|
use std::{
|
||||||
borrow::Cow,
|
borrow::Cow,
|
||||||
collections::VecDeque,
|
collections::VecDeque,
|
||||||
|
@ -377,6 +378,7 @@ impl<'a> Renderer<'a> {
|
||||||
|
|
||||||
let output = self.video_file_output();
|
let output = self.video_file_output();
|
||||||
let mut ffmpeg = Ffmpeg::new(FfmpegOutput {
|
let mut ffmpeg = Ffmpeg::new(FfmpegOutput {
|
||||||
|
quality: FfmpegOutputQuality::VisuallyLossless,
|
||||||
video_bitrate: Some(source_res.bitrate() * 3),
|
video_bitrate: Some(source_res.bitrate() * 3),
|
||||||
..FfmpegOutput::new(self.format, output.clone())
|
..FfmpegOutput::new(self.format, output.clone())
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue