【发布时间】:2014-03-13 17:03:14
【问题描述】:
我确实有一个非常特殊的问题,我希望我能找到答案。
我正在尝试使用 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 位)。
我在安装了 MFT 编解码器的 Windows Server 2008 R2 x64 上进行测试。
非常感谢任何建议。
【问题讨论】:
-
你在做什么来播放音频?两倍慢建议将立体声音频播放为单声道。
-
嗨,马克,感谢您查看此内容。我正在将音频样本写入 Wave 文件。我已经更新了源代码来描述我是如何做到这一点的。你的建议是有道理的,尽管这意味着我从
MediaFoundationResampler获得立体声样本,即使我已经明确指定了输入单声道格式。问候!
标签: audio streaming naudio aac