use audio resampler on the write_to_disk example (#68)
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user