add support for transcoding to mp3

This commit is contained in:
2020-12-22 13:20:55 +01:00
parent 61c275352d
commit 85e6a0cbeb
3 changed files with 48 additions and 9 deletions

View File

@@ -6,4 +6,10 @@ matches:
to: to:
codec: opus codec: opus
bitrate: 160 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

View File

@@ -25,8 +25,17 @@ pub enum Transcode {
#[serde(default = "default_opus_bitrate")] #[serde(default = "default_opus_bitrate")]
bitrate: u16, bitrate: u16,
#[serde(default = "default_opus_bitrate_type")] #[serde(default = "bitrate_type_vbr")]
bitrate_type: OpusBitrateType, 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 { pub fn extension(&self) -> &'static str {
match self { match self {
Transcode::Opus { .. } => "opus", Transcode::Opus { .. } => "opus",
Transcode::Mp3 { .. } => "mp3",
} }
} }
} }
@@ -42,21 +52,25 @@ fn default_opus_bitrate() -> u16 {
160 160
} }
fn default_opus_bitrate_type() -> OpusBitrateType { fn bitrate_type_vbr() -> BitrateType {
OpusBitrateType::Vbr BitrateType::Vbr
}
fn default_mp3_bitrate() -> u16 {
256
} }
impl Default for Transcode { impl Default for Transcode {
fn default() -> Self { fn default() -> Self {
Transcode::Opus { Transcode::Opus {
bitrate: default_opus_bitrate(), bitrate: default_opus_bitrate(),
bitrate_type: default_opus_bitrate_type(), bitrate_type: bitrate_type_vbr(),
} }
} }
} }
#[derive(Clone, Debug, Deserialize)] #[derive(Clone, Debug, Deserialize)]
pub enum OpusBitrateType { pub enum BitrateType {
#[serde(rename = "cbr")] #[serde(rename = "cbr")]
Cbr, Cbr,
#[serde(rename = "vbr")] #[serde(rename = "vbr")]

View File

@@ -316,14 +316,33 @@ async fn transcode(
encoder.set_property_from_str( encoder.set_property_from_str(
"bitrate-type", "bitrate-type",
match bitrate_type { match bitrate_type {
config::OpusBitrateType::Vbr => "1", config::BitrateType::Vbr => "1",
config::OpusBitrateType::Cbr => "0", config::BitrateType::Cbr => "0",
}, },
); );
dest_elems.push(encoder); dest_elems.push(encoder);
dest_elems.push(gmake("oggmux")?); 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")?; let file_dest: gstreamer_base::BaseSink = gmake("filesink")?;