我确实有一个非常特别的问题,我希望我能找到答案。
我正在尝试使用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编解码器。
非常感谢任何建议。
答案 0 :(得分:0)
问题似乎出在MediaFoundationReader无法处理ADTS容器中的HE-AACv2,这是一种标准的在线广播流格式,很可能是您正在处理的格式。
Adobe产品也存在相同的问题,即以完全相同的方式误码这种格式^将音频的前半部分扩展到整个持续时间,并且:Corrupted AAC files recorded from online stream
据说,它与HE-AACv2立体声流实际上是具有Parametric Stereo.
的附加信息通道的单声道流有关。