我确实有一个非常特别的问题,我希望我能找到答案 .
我正在尝试从带有NAudio库的URL(在线流媒体广播,例如live.noroc.tv:8000/radionoroc.aacp)中读取AAC流,并获得IEEE 32位浮动样本 .
除此之外,我想将流重新采样到特定的采样率和通道数(速率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秒,尽管缓冲区阵列完全加载了样本(按此速率和通道数应包含10秒的音频样本) .
因此,最终的音频文件播放流的速度应该是它应该的速度的2倍(5秒的流播放为10) .
这有点与不同的位深度有关(我应该将每个样本的64位记录为与32相反) .
我在Windows Server 2008 R2 x64上进行测试,安装了MFT编解码器 .
非常感谢任何建议 .
1 回答
问题似乎是MediaFoundationReader无法处理ADTS容器中的HE-AACv2,它是一种标准的在线无线电流格式,很可能是您正在处理的那种格式 .
Adobe产品具有相同的问题,以完全相同的方式错误地将这种格式展开^将音频的前半部分延伸到整个持续时间并且:Corrupted AAC files recorded from online stream
据说,它与HE-AACv2立体声流有关,实际上是一个带有附加信息通道的单声道流Parametric Stereo.