mk-dl-bot_legacy/src/dl/ffmpeg.rs
2024-02-21 14:17:21 +02:00

57 lines
No EOL
1.5 KiB
Rust

use super::spawn::{spawn, SpawnError};
pub struct FFMpeg {}
impl FFMpeg {
const MP3_BITRATES: [u16; 14] = [
32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,
];
pub fn round_mp3_bitrate(abr: f32) -> u16 {
let abr = abr.ceil() as u16;
Self::MP3_BITRATES
.into_iter()
.find(|f| abr <= *f)
.unwrap_or(320)
}
pub async fn convert_to_mp3(
input_path: &str,
output_path: &str,
bitrate: u16,
) -> Result<(), SpawnError> {
let output = spawn(
"ffmpeg",
[
"-i",
input_path,
"-codec:a",
"libmp3lame",
"-b:a",
"32k",
output_path,
],
)
.await?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use crate::dl::ffmpeg::FFMpeg;
#[test]
fn round_mp3_bitrate() {
assert_eq!(FFMpeg::round_mp3_bitrate(0.0), 32);
assert_eq!(FFMpeg::round_mp3_bitrate(30.803), 32);
assert_eq!(FFMpeg::round_mp3_bitrate(31.957), 32);
assert_eq!(FFMpeg::round_mp3_bitrate(47.245), 48);
assert_eq!(FFMpeg::round_mp3_bitrate(62.564), 64);
assert_eq!(FFMpeg::round_mp3_bitrate(124.216), 128);
assert_eq!(FFMpeg::round_mp3_bitrate(129.492), 160);
assert_eq!(FFMpeg::round_mp3_bitrate(320.1), 320);
assert_eq!(FFMpeg::round_mp3_bitrate(319.4), 320);
assert_eq!(FFMpeg::round_mp3_bitrate(999.99), 320);
}
}