use audio resampler on the write_to_disk example (#68)

This commit is contained in:
Théo Monnom
2023-05-13 01:48:06 +02:00
committed by GitHub
parent 76210c9f67
commit 2cad45cb39
4 changed files with 21 additions and 11 deletions
+18 -8
View File
@@ -2,6 +2,7 @@ use bytes::{BufMut, BytesMut};
use futures::StreamExt;
use livekit::prelude::*;
use livekit::webrtc::audio_stream::native::NativeAudioStream;
use livekit::webrtc::native::audio_resampler;
use std::env;
use tokio::fs::File;
use tokio::io::{AsyncWriteExt, BufWriter};
@@ -13,7 +14,7 @@ const FILE_PATH: &str = "record.wav";
pub struct WavHeader {
pub sample_rate: u32,
pub bit_depth: u16,
pub num_channels: u16,
pub num_channels: u32,
}
pub struct WavWriter {
@@ -41,9 +42,9 @@ impl WavWriter {
}
fn write_header(&mut self) -> Result<(), std::io::Error> {
let byte_rate = (self.header.sample_rate
let byte_rate = self.header.sample_rate
* self.header.bit_depth as u32
* self.header.num_channels as u32);
* self.header.num_channels as u32;
let block_align = byte_rate as u16 / self.header.sample_rate as u16;
@@ -53,7 +54,7 @@ impl WavWriter {
self.data.put_slice(b"fmt ");
self.data.put_u32_le(16); // Subchunk1Size (16 for PCM)
self.data.put_u16_le(1); // AudioFormat (1 for PCM)
self.data.put_u16_le(self.header.num_channels);
self.data.put_u16_le(self.header.num_channels as u16);
self.data.put_u32_le(self.header.sample_rate);
self.data.put_u32_le(byte_rate);
self.data.put_u16_le(block_align);
@@ -115,21 +116,30 @@ async fn record_track(audio_track: RemoteAudioTrack) -> Result<(), std::io::Erro
println!("Recording track {:?}", audio_track.sid());
let rtc_track = audio_track.rtc_track();
// TODO(theomonnom): Remove hardcoded values
let header = WavHeader {
sample_rate: 48000,
bit_depth: 16,
num_channels: 1,
num_channels: 2,
};
let mut resampler = audio_resampler::AudioResampler::default();
let mut wav_writer = WavWriter::create(FILE_PATH, header).await?;
let mut audio_stream = NativeAudioStream::new(rtc_track);
let max_record = 5 * header.sample_rate * header.num_channels as u32;
let mut sample_count = 0;
'recv_loop: while let Some(frame) = audio_stream.next().await {
for sample in frame.data {
wav_writer.write_sample(sample).await.unwrap();
let data = resampler.remix_and_resample(
&frame.data,
frame.samples_per_channel,
frame.num_channels,
frame.sample_rate,
header.num_channels,
header.sample_rate,
);
for sample in data {
wav_writer.write_sample(*sample).await.unwrap();
sample_count += 1;
if sample_count >= max_record {