fix: encode renders as wav instead of opus to address errors
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
use std::{convert::Infallible, fmt::Display};
|
||||
use std::{convert::Infallible, fmt::Display, io::Cursor};
|
||||
|
||||
use hound::{SampleFormat, WavSpec};
|
||||
use opendal::Operator;
|
||||
use opus2::Application;
|
||||
use time::{UtcDateTime, format_description::StaticFormatDescription, macros::format_description};
|
||||
use twilight_model::id::{
|
||||
Id,
|
||||
@@ -42,7 +42,7 @@ impl Display for Render {
|
||||
let start = start.format(&DATE_FORMAT).unwrap();
|
||||
let end = end.format(&DATE_FORMAT).unwrap();
|
||||
|
||||
write!(f, "{guild_id}/{voice_channel_id}/{start}_{end}.opus")
|
||||
write!(f, "{guild_id}/{voice_channel_id}/{start}_{end}.wav")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,24 +66,32 @@ impl RenderManager {
|
||||
(),
|
||||
Infallible, // TODO: a real error type
|
||||
> {
|
||||
let mut encoder =
|
||||
opus2::Encoder::new(sample_rate, channels, Application::Audio).expect("TODO");
|
||||
let channels = channels as u16;
|
||||
|
||||
let estimated_max_size = samples.len() * size_of::<i16>() / size_of::<u8>();
|
||||
tracing::debug!(?estimated_max_size);
|
||||
let encode_result = encoder.encode_vec(&samples, estimated_max_size);
|
||||
if let Err(error) = &encode_result {
|
||||
tracing::error!(%error);
|
||||
} else {
|
||||
tracing::info!("encode ok");
|
||||
let wav_spec = WavSpec {
|
||||
channels,
|
||||
sample_rate,
|
||||
bits_per_sample: 16,
|
||||
sample_format: SampleFormat::Int,
|
||||
};
|
||||
|
||||
let mut buffer = Vec::new();
|
||||
let writer = Cursor::new(&mut buffer);
|
||||
|
||||
let mut wav_writer = hound::WavWriter::new(writer, wav_spec).expect("TODO");
|
||||
|
||||
let mut sample_writer = wav_writer.get_i16_writer(samples.len() as u32);
|
||||
|
||||
for sample in samples {
|
||||
sample_writer.write_sample(sample);
|
||||
}
|
||||
let bytes = encode_result.expect("TODO");
|
||||
sample_writer.flush().expect("TODO");
|
||||
|
||||
wav_writer.finalize().expect("TODO");
|
||||
|
||||
let path = render.to_string();
|
||||
|
||||
let write_result = self.operator.write(&path, bytes).await;
|
||||
tracing::info!(?write_result);
|
||||
write_result.expect("TODO");
|
||||
self.operator.write(&path, buffer).await.expect("TODO");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user