mirror of
https://git.asonix.dog/asonix/pict-rs
synced 2024-12-22 19:31:35 +00:00
Only include -b:v 0 for VP9
also simplify building arguments
This commit is contained in:
parent
3aecef3a9e
commit
496bcc5dc1
3 changed files with 65 additions and 105 deletions
|
@ -235,6 +235,13 @@ impl VideoFormat {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OutputVideoFormat {
|
impl OutputVideoFormat {
|
||||||
|
pub(crate) const fn is_vp9(&self) -> bool {
|
||||||
|
match self {
|
||||||
|
Self::Webm { video_codec, .. } => video_codec.is_vp9(),
|
||||||
|
Self::Mp4 { .. } => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) const fn from_parts(
|
pub(crate) const fn from_parts(
|
||||||
video_codec: VideoCodec,
|
video_codec: VideoCodec,
|
||||||
audio_codec: Option<AudioCodec>,
|
audio_codec: Option<AudioCodec>,
|
||||||
|
@ -374,6 +381,10 @@ impl Mp4Codec {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebmAlphaCodec {
|
impl WebmAlphaCodec {
|
||||||
|
const fn is_vp9(&self) -> bool {
|
||||||
|
matches!(self, Self::Vp9)
|
||||||
|
}
|
||||||
|
|
||||||
const fn ffmpeg_codec(self) -> &'static str {
|
const fn ffmpeg_codec(self) -> &'static str {
|
||||||
match self {
|
match self {
|
||||||
Self::Vp8 => "vp8",
|
Self::Vp8 => "vp8",
|
||||||
|
@ -383,6 +394,13 @@ impl WebmAlphaCodec {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebmCodec {
|
impl WebmCodec {
|
||||||
|
const fn is_vp9(self) -> bool {
|
||||||
|
match self {
|
||||||
|
Self::Av1 => false,
|
||||||
|
Self::Alpha(AlphaCodec { codec, .. }) => codec.is_vp9(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const fn ffmpeg_codec(self) -> &'static str {
|
const fn ffmpeg_codec(self) -> &'static str {
|
||||||
match self {
|
match self {
|
||||||
Self::Av1 => "av1",
|
Self::Av1 => "av1",
|
||||||
|
|
|
@ -60,66 +60,43 @@ async fn transcode_files(
|
||||||
output_format: OutputVideoFormat,
|
output_format: OutputVideoFormat,
|
||||||
crf: u8,
|
crf: u8,
|
||||||
) -> Result<(), FfMpegError> {
|
) -> Result<(), FfMpegError> {
|
||||||
|
let mut args = vec![
|
||||||
|
"-hide_banner",
|
||||||
|
"-v",
|
||||||
|
"warning",
|
||||||
|
"-f",
|
||||||
|
input_format.ffmpeg_format(),
|
||||||
|
"-i",
|
||||||
|
input_path,
|
||||||
|
"-pix_fmt",
|
||||||
|
output_format.pix_fmt(),
|
||||||
|
"-vf",
|
||||||
|
"scale=trunc(iw/2)*2:trunc(ih/2)*2",
|
||||||
|
];
|
||||||
|
|
||||||
if let Some(audio_codec) = output_format.ffmpeg_audio_codec() {
|
if let Some(audio_codec) = output_format.ffmpeg_audio_codec() {
|
||||||
Process::run(
|
args.extend(["-c:a", audio_codec]);
|
||||||
"ffmpeg",
|
|
||||||
&[
|
|
||||||
"-hide_banner",
|
|
||||||
"-v",
|
|
||||||
"warning",
|
|
||||||
"-f",
|
|
||||||
input_format.ffmpeg_format(),
|
|
||||||
"-i",
|
|
||||||
input_path,
|
|
||||||
"-pix_fmt",
|
|
||||||
output_format.pix_fmt(),
|
|
||||||
"-vf",
|
|
||||||
"scale=trunc(iw/2)*2:trunc(ih/2)*2",
|
|
||||||
"-c:a",
|
|
||||||
audio_codec,
|
|
||||||
"-c:v",
|
|
||||||
output_format.ffmpeg_video_codec(),
|
|
||||||
"-b:v",
|
|
||||||
"0",
|
|
||||||
"-crf",
|
|
||||||
&crf.to_string(),
|
|
||||||
"-f",
|
|
||||||
output_format.ffmpeg_format(),
|
|
||||||
output_path,
|
|
||||||
],
|
|
||||||
)?
|
|
||||||
.wait()
|
|
||||||
.await?;
|
|
||||||
} else {
|
} else {
|
||||||
Process::run(
|
args.push("-an")
|
||||||
"ffmpeg",
|
}
|
||||||
&[
|
|
||||||
"-hide_banner",
|
args.extend(["-c:v", output_format.ffmpeg_video_codec()]);
|
||||||
"-v",
|
|
||||||
"warning",
|
if output_format.is_vp9() {
|
||||||
"-f",
|
args.extend(["-b:v", "0"]);
|
||||||
input_format.ffmpeg_format(),
|
}
|
||||||
"-i",
|
|
||||||
input_path,
|
let crf = crf.to_string();
|
||||||
"-pix_fmt",
|
|
||||||
output_format.pix_fmt(),
|
args.extend([
|
||||||
"-vf",
|
|
||||||
"scale=trunc(iw/2)*2:trunc(ih/2)*2",
|
|
||||||
"-an",
|
|
||||||
"-c:v",
|
|
||||||
output_format.ffmpeg_video_codec(),
|
|
||||||
"-b:v",
|
|
||||||
"0",
|
|
||||||
"-crf",
|
"-crf",
|
||||||
&crf.to_string(),
|
&crf,
|
||||||
"-f",
|
"-f",
|
||||||
output_format.ffmpeg_format(),
|
output_format.ffmpeg_format(),
|
||||||
output_path,
|
output_path,
|
||||||
],
|
]);
|
||||||
)?
|
|
||||||
.wait()
|
Process::run("ffmpeg", &args)?.wait().await?;
|
||||||
.await?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,56 +79,21 @@ async fn convert(
|
||||||
|
|
||||||
let input_arg = format!("{input}:{input_file_str}");
|
let input_arg = format!("{input}:{input_file_str}");
|
||||||
let output_arg = format!("{output}:-");
|
let output_arg = format!("{output}:-");
|
||||||
|
let quality = quality.map(|q| q.to_string());
|
||||||
|
|
||||||
let process = if coalesce {
|
let mut args = vec!["convert", "-strip", "-auto-orient", &input_arg];
|
||||||
if let Some(quality) = quality {
|
|
||||||
Process::run(
|
if let Some(quality) = &quality {
|
||||||
"magick",
|
args.extend(["-quality", quality]);
|
||||||
&[
|
|
||||||
"convert",
|
|
||||||
"-strip",
|
|
||||||
"-auto-orient",
|
|
||||||
&input_arg,
|
|
||||||
"-quality",
|
|
||||||
&quality.to_string(),
|
|
||||||
"-coalesce",
|
|
||||||
&output_arg,
|
|
||||||
],
|
|
||||||
)?
|
|
||||||
} else {
|
|
||||||
Process::run(
|
|
||||||
"magick",
|
|
||||||
&[
|
|
||||||
"convert",
|
|
||||||
"-strip",
|
|
||||||
"-auto-orient",
|
|
||||||
&input_arg,
|
|
||||||
"-coalesce",
|
|
||||||
&output_arg,
|
|
||||||
],
|
|
||||||
)?
|
|
||||||
}
|
}
|
||||||
} else if let Some(quality) = quality {
|
|
||||||
Process::run(
|
|
||||||
"magick",
|
|
||||||
&[
|
|
||||||
"convert",
|
|
||||||
"-strip",
|
|
||||||
"-auto-orient",
|
|
||||||
&input_arg,
|
|
||||||
"-quality",
|
|
||||||
&quality.to_string(),
|
|
||||||
&output_arg,
|
|
||||||
],
|
|
||||||
)?
|
|
||||||
} else {
|
|
||||||
Process::run(
|
|
||||||
"magick",
|
|
||||||
&["convert", "-strip", "-auto-orient", &input_arg, &output_arg],
|
|
||||||
)?
|
|
||||||
};
|
|
||||||
|
|
||||||
let reader = process.read();
|
if coalesce {
|
||||||
|
args.push("-coalesce");
|
||||||
|
}
|
||||||
|
|
||||||
|
args.push(&output_arg);
|
||||||
|
|
||||||
|
let reader = Process::run("magick", &args)?.read();
|
||||||
|
|
||||||
let clean_reader = crate::tmp_file::cleanup_tmpfile(reader, input_file);
|
let clean_reader = crate::tmp_file::cleanup_tmpfile(reader, input_file);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue