From f4c9c890ab80a3e6de37ba245244d0e69d9c542c Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Sun, 17 Feb 2019 21:26:36 -0500 Subject: try using opus --- src/commands/meme.rs | 57 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 13 deletions(-) (limited to 'src/commands') 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::(&youtube_url, start, end, None)?), - Compression::best(), - ); + let mut audio_reader = BufReader::new(ffmpeg_dl::(&youtube_url, start, end, None)?); let text = match args.multiple_quoted::() { 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 = { + 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, -- cgit v1.3.1