use std::time::Duration;
use anyhow::Result;
use bytes::Bytes;
const CHANNELS: u32 = 2;
const OPUS_BITRATE: u32 = 64_000;
pub struct AudioEncoder {
producer: moq_audio::AudioProducer,
}
impl AudioEncoder {
pub fn new(
mut broadcast: moq_net::BroadcastProducer,
catalog: moq_mux::catalog::Producer,
input_sample_rate: u32,
) -> Result<Self> {
let input = moq_audio::EncoderInput {
format: moq_audio::AudioFormat::U8,
sample_rate: input_sample_rate,
channels: CHANNELS,
};
let output = moq_audio::EncoderOutput {
bitrate: Some(OPUS_BITRATE),
..Default::default()
};
let producer = moq_audio::AudioProducer::new(&mut broadcast, catalog, "audio", input, output)?;
Ok(Self { producer })
}
pub fn track(&self) -> &moq_net::TrackProducer {
self.producer.track()
}
pub fn reset_epoch(&mut self) {
self.producer.reset_epoch();
}
pub fn push_samples(&mut self, samples: &[u8], elapsed: Duration) -> Result<()> {
let frame = moq_audio::Frame {
timestamp_us: elapsed.as_micros() as u64,
data: Bytes::copy_from_slice(samples),
};
self.producer.write(&frame)?;
Ok(())
}
}