首页 文章

AAC流重新取样错误

提问于
浏览
0

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

我正在尝试从带有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

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

    Adobe产品具有相同的问题,以完全相同的方式错误地将这种格式展开^将音频的前半部分延伸到整个持续时间并且:Corrupted AAC files recorded from online stream

    据说,它与HE-AACv2立体声流有关,实际上是一个带有附加信息通道的单声道流Parametric Stereo.

相关问题