gpt4 book ai didi

audio - AAC 流重新采样不正确

转载 作者:行者123 更新时间:2023-12-03 02:13:16 25 4
gpt4 key购买 nike

我确实有一个非常特殊的问题,我希望我能找到答案。

我正在尝试使用 NAudio 库从 URL(在线流广播,例如 live.noroc.tv:8000/radionoroc.aacp)读取 AAC 流并获取 IEEE 32 位 float 样本。

除此之外,我想将流重新采样到特定的采样率和 channel 数(速率 5512,单声道)。

下面是实现这一点的代码:

int tenSecondsOfDownloadedAudio = 5512 * 10;
float[] buffer = new float[tenSecondsOfDownloadedAudio];
using (var reader = new MediaFoundationReader(pathToUrl))
{
var ieeeFloatWaveFormat = WaveFormat.CreateIeeeFloatWaveFormat(5512, 1); // mono
using (var resampler = new MediaFoundationResampler(reader, ieeeFloatWaveFormat))
{
var waveToSampleProvider = new WaveToSampleProvider(resampler);
int readSamples = 0;
int tempBuffer = new float[5512]; // 1 second buffer
while(readSamples <= tenSecondsOfDownloadedAudio)
{
int read = waveToSampleProvider.Read(tempBuffer, 0, tempBuffer.Length);
if(read == 0)
{
Thread.Sleep(500); // allow streaming buffer to get loaded
continue;
}

Array.Copy(tempBuffer, 0, buffer, readSamples, tempBuffer.Length);
readSamples += read;
}
}
}

然后使用以下简单方法将这些特定样本写入 Wave 音频文件:
using (var writer = new WaveFileWriter("path-to-audio-file.wav", WaveFormat.CreateIeeeFloatWaveFormat(5512, 1)))
{
writer.WriteSamples(samples, 0, samples.Length);
}

我遇到的是 NAudio 没有读取 10 秒的音频(因为它被请求),但只有 5 秒,尽管缓冲区数组完全加载了样本(以这种速率和 channel 计数应该包含 10 秒的音频样本) .

因此,最终的音频文件播放流的速度比它应该慢 2 倍(5 秒的流播放为 10)。

这是否与不同的位深度有关(我应该以每个样本 64 位记录,而不是 32 位)。

我在安装了 MFT 编解码器的 Windows Server 2008 R2 x64 上进行测试。

非常感谢任何建议。

最佳答案

问题似乎在于 MediaFoundationReader 无法在 ADTS 容器中处理 HE-AACv2,它是一种标准的在线 radio 流格式,很可能是您正在处理的格式。

Adobe 产品以完全相同的方式误用此格式^ 将音频的前半部分拉伸(stretch)到整个持续时间,并且:Corrupted AAC files recorded from online stream

据推测,它与 HE-AACv2 立体声流实际上是单声道流有关,带有用于 Parametric Stereo. 的附加信息 channel

关于audio - AAC 流重新采样不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22385783/

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