diff options
| author | Nathan Perry <avaglir@gmail.com> | 2019-02-17 21:26:36 -0500 |
|---|---|---|
| committer | Nathan Perry <avaglir@gmail.com> | 2019-02-17 21:26:36 -0500 |
| commit | f4c9c890ab80a3e6de37ba245244d0e69d9c542c (patch) | |
| tree | 673fcbd49ed543a4196d84e9c9d3e08a2790e4ec /src/commands | |
| parent | 3eecbaf1ff02122506ee8ee8c65e02ff1325aae0 (diff) | |
try using opus
Diffstat (limited to 'src/commands')
| -rw-r--r-- | src/commands/meme.rs | 57 |
1 files changed, 44 insertions, 13 deletions
diff --git a/src/commands/meme.rs b/src/commands/meme.rs index 160a652..e4fbde8 100644 --- a/src/commands/meme.rs +++ b/src/commands/meme.rs @@ -3,13 +3,19 @@ use std::{ sync::RwLock, }; +use byteorder::{ + ByteOrder, + NativeEndian, +}; use diesel::PgConnection; use failure::Error; -use flate2::{ - bufread::DeflateEncoder, - Compression, -}; use lazy_static::lazy_static; +use opus::{ + Application, + Bitrate, + Channels, + Encoder as OpusEncoder, +}; use rand::{Rng, thread_rng}; use serenity::{ builder::CreateMessage, @@ -26,7 +32,6 @@ use crate::{ audio::{ CtxExt, ffmpeg_dl, - Opus, parse_times, Pcm, PlayArgs, @@ -155,10 +160,7 @@ pub fn addaudiomeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<() let (start, end) = parse_times(opts); let youtube_url = ytdl_url(audio_link.as_str())?; - let mut audio_reader = DeflateEncoder::new( - BufReader::new(ffmpeg_dl::<Pcm>(&youtube_url, start, end, None)?), - Compression::best(), - ); + let mut audio_reader = BufReader::new(ffmpeg_dl::<Pcm>(&youtube_url, start, end, None)?); let text = match args.multiple_quoted::<String>() { Ok(text) => text.join(" "), @@ -177,15 +179,44 @@ pub fn addaudiomeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<() }) .ok(); - let mut audio_data = Vec::new(); - let bytes = audio_reader.read_to_end(&mut audio_data)?; + let i16_data: Vec<i16> = { + let mut audio_data = Vec::new(); + let bytes = audio_reader.read_to_end(&mut audio_data)?; + + let mut i16_data = Vec::with_capacity(bytes / 2); + i16_data.resize(bytes / 2, 0); + + NativeEndian::read_i16_into(&audio_data, &mut i16_data); + + i16_data + }; + + let mut enc = OpusEncoder::new(48000, Channels::Stereo, Application::Audio)?; + enc.set_vbr(false)?; + enc.set_bitrate(Bitrate::Bits(96 * 1024))?; + + let mut out = Vec::new(); + for elem in i16_data.chunks(960) { + let elem = if elem.len() == 960 { + elem + } else if elem.len() > 480 { + &elem[..480] + } else if elem.len() > 240 { + &elem[..240] + } else { + continue + }; + + let mut encoded = enc.encode_vec(elem, 1200)?; + out.append(&mut encoded); + } - if bytes == 0 { + if out.len() == 0 { debug!("read 0 bytes from audio reader"); return send(msg.channel_id, "🔇🔇🔇🔕🔕🔕🔕🔕🔇🔕🔕🔇🔕🔕📣📢📣📢📣", msg.tts); } - let audio_id = Audio::create(&conn, audio_data, msg.author.id.0)?; + let audio_id = Audio::create(&conn, out, msg.author.id.0)?; NewMeme { title, |
