AAC流重新取样错误

时间:2014-03-13 17:03:15

标签: audio streaming naudio aac

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

我正在尝试使用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 个答案:

答案 0 :(得分:0)

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

Adob​​e产品也存在相同的问题,即以完全相同的方式误码这种格式^将音频的前半部分扩展到整个持续时间,并且:Corrupted AAC files recorded from online stream

据说,它与HE-AACv2立体声流实际上是具有Parametric Stereo.

的附加信息通道的单声道流有关。