From 85e6a0cbeb56df66d4a3e151e1e0fb7c27200bcb Mon Sep 17 00:00:00 2001 From: Thomas Heck Date: Tue, 22 Dec 2020 13:20:55 +0100 Subject: [PATCH] add support for transcoding to mp3 --- example.audio-conv.yaml | 8 +++++++- src/config.rs | 26 ++++++++++++++++++++------ src/main.rs | 23 +++++++++++++++++++++-- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/example.audio-conv.yaml b/example.audio-conv.yaml index e855202..8d71829 100644 --- a/example.audio-conv.yaml +++ b/example.audio-conv.yaml @@ -6,4 +6,10 @@ matches: to: codec: opus bitrate: 160 - bitrate_type: vbr + bitrate_type: vbr # or cbr + + # for mp3: + # codec: mp3 + # # one of: 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 or 320 + # bitrate: 256 + # bitrate_type: vbr # or cbr diff --git a/src/config.rs b/src/config.rs index f68410b..6a7b17b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -25,8 +25,17 @@ pub enum Transcode { #[serde(default = "default_opus_bitrate")] bitrate: u16, - #[serde(default = "default_opus_bitrate_type")] - bitrate_type: OpusBitrateType, + #[serde(default = "bitrate_type_vbr")] + bitrate_type: BitrateType, + }, + + #[serde(rename = "mp3")] + Mp3 { + #[serde(default = "default_mp3_bitrate")] + bitrate: u16, + + #[serde(default = "bitrate_type_vbr")] + bitrate_type: BitrateType, }, } @@ -34,6 +43,7 @@ impl Transcode { pub fn extension(&self) -> &'static str { match self { Transcode::Opus { .. } => "opus", + Transcode::Mp3 { .. } => "mp3", } } } @@ -42,21 +52,25 @@ fn default_opus_bitrate() -> u16 { 160 } -fn default_opus_bitrate_type() -> OpusBitrateType { - OpusBitrateType::Vbr +fn bitrate_type_vbr() -> BitrateType { + BitrateType::Vbr +} + +fn default_mp3_bitrate() -> u16 { + 256 } impl Default for Transcode { fn default() -> Self { Transcode::Opus { bitrate: default_opus_bitrate(), - bitrate_type: default_opus_bitrate_type(), + bitrate_type: bitrate_type_vbr(), } } } #[derive(Clone, Debug, Deserialize)] -pub enum OpusBitrateType { +pub enum BitrateType { #[serde(rename = "cbr")] Cbr, #[serde(rename = "vbr")] diff --git a/src/main.rs b/src/main.rs index f04a358..f8d8b7b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -316,14 +316,33 @@ async fn transcode( encoder.set_property_from_str( "bitrate-type", match bitrate_type { - config::OpusBitrateType::Vbr => "1", - config::OpusBitrateType::Cbr => "0", + config::BitrateType::Vbr => "1", + config::BitrateType::Cbr => "0", }, ); dest_elems.push(encoder); dest_elems.push(gmake("oggmux")?); } + config::Transcode::Mp3 { + bitrate, + bitrate_type, + } => { + let encoder: Element = gmake("lamemp3enc")?; + // target: "1" = "bitrate" + encoder.set_property_from_str("target", "1"); + encoder.set_property("bitrate", &i32::from(*bitrate))?; + encoder.set_property( + "cbr", + match bitrate_type { + config::BitrateType::Vbr => &false, + config::BitrateType::Cbr => &true, + }, + )?; + + dest_elems.push(encoder); + dest_elems.push(gmake("id3v2mux")?); + } }; let file_dest: gstreamer_base::BaseSink = gmake("filesink")?;