refactor: 使用 UDP 传输音频流

This commit is contained in:
Del Wang
2025-12-31 22:53:33 +08:00
committed by Del
parent fbe64f63dd
commit 05d2174873
7 changed files with 592 additions and 403 deletions
+22 -8
View File
@@ -1,6 +1,6 @@
use opus::{Encoder, Decoder, Application, Bitrate, Channels};
use anyhow::{Result, Context};
use crate::config::AudioConfig;
use anyhow::{Context, Result};
use opus::{Application, Bitrate, Channels, Decoder, Encoder};
pub struct OpusCodec {
encoder: Encoder,
@@ -9,23 +9,37 @@ pub struct OpusCodec {
impl OpusCodec {
pub fn new(config: &AudioConfig) -> Result<Self> {
let channels = if config.channels == 1 { Channels::Mono } else { Channels::Stereo };
let channels = if config.channels == 1 {
Channels::Mono
} else {
Channels::Stereo
};
let mut encoder = Encoder::new(config.sample_rate, channels, Application::Audio)
.context("Failed to create Opus encoder")?;
encoder.set_bitrate(Bitrate::Bits(config.bitrate))?;
let decoder = Decoder::new(config.sample_rate, channels)
.context("Failed to create Opus decoder")?;
let decoder =
Decoder::new(config.sample_rate, channels).context("Failed to create Opus decoder")?;
Ok(Self { encoder, decoder })
}
pub fn encode(&mut self, pcm: &[i16], out: &mut [u8]) -> Result<usize> {
self.encoder.encode(pcm, out).context("Opus encoding failed")
self.encoder
.encode(pcm, out)
.context("Opus encoding failed")
}
pub fn decode(&mut self, opus: &[u8], out: &mut [i16]) -> Result<usize> {
self.decoder.decode(opus, out, false).context("Opus decoding failed")
self.decoder
.decode(opus, out, false)
.context("Opus decoding failed")
}
// Packet Loss Concealment
pub fn decode_loss(&mut self, out: &mut [i16]) -> Result<usize> {
// Fallback to silence as opus crate 0.3 doesn't expose safe PLC
out.fill(0);
Ok(out.len())
}
}