gpt4 book ai didi

audio - 如何在Rust中将16位PCM音频的采样率从24000 Hz更改为48000 Hz?

转载 作者:行者123 更新时间:2023-12-03 11:46:46 28 4
gpt4 key购买 nike

我正在从Google的文本到语音服务获取16位PCM数据(24000 Hz),然后将其存储在u8数组中。有没有一种简单的方法可以将其重采样到48000 Hz,而输出是u8阵列?我不了解FFmpeg上的任何在线示例。
现在,我将其包装在游标中以分别读取每个i16,然后将它们分别复制一次(即1234变成11223344)。我的逻辑是,由于原始音频为24000,因此将其翻倍就可以达到48000,对吗?

let mut raw = Cursor::new(raw);
let mut new_samples = Vec::new();

loop {
match raw.read_i16::<LittleEndian>() {
Ok(x) => {
samples.push(x);
samples.push(x);
}
Err(_) => break,
}
}
接下来,我使用猎犬箱将新样本转换为48000 WAV。
let mut new_wav = Cursor::new(Vec::new());
let mut writer = WavWriter::new(
&mut new_wav,
WavSpec {
channels: 1,
sample_rate: 48000,
bits_per_sample: 16,
sample_format: SampleFormat::Int,
},
)
.unwrap();

new_samples
.into_iter()
.for_each(|x| writer.write_sample(x).unwrap());

writer.finalize().unwrap();
现在,new_wav应该具有48000 Hz的音频。但是,这不起作用。使用Discord鸣鸟 crate 播放时,我只是听到一个非常简短的静电:
call.lock().await.play_source(Input::new(
false,
new_wav.into_inner().into(),
Codec::Pcm,
Container::Raw,
None,
));

最佳答案

好吧,我知道了。这就是我做的。

let mut original = Cursor::new(original);
let mut resampled = Cursor::new(Vec::new());

loop {
match original.read_i16::<LittleEndian>() {
Ok(x) => {
// Write it twice
resampled.write_i16::<LittleEndian>(x).unwrap();
resampled.write_i16::<LittleEndian>(x).unwrap();
}
Err(_) => break,
}
}
现在,“重采样”为48000 Hz(并且可以完美播放)。

关于audio - 如何在Rust中将16位PCM音频的采样率从24000 Hz更改为48000 Hz?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66206380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com