我试图使用NAudio播放shoutcast流。这是可行的(显然)有几行代码:
var url = "http://dance.radiomonster.fm/320.mp3";
using(var radioStream = new MediaFoundationReader(url))
using(var wo = new WaveOutEvent())
{
wo.Init(radioStream);
wo.Play();
while (wo.PlaybackState == PlaybackState.Playing)
{
Thread.Sleep(1000);
}
}
适合播放。但是,我需要将其转换为48 KHz mono的浮点样本作为字节流在别处发送。所以我这样做:
//Convert the wave to 48 khz, mono
str1 = new WaveFormatConversionProvider(new WaveFormat(48000,1), radioStream);
//Convert the converted wave to floats
str = new Wave16ToFloatProvider(str1);
在此前的迭代中,我会做这样的事情来检索数据:
while ((readResultCount = str.Read(result, 0, result.Length)) > 0)
{
float[] output = new float[result.Length / sizeof(float)];
Buffer.BlockCopy(result, 0, output, 0, sizeof(float) * output.Length);
au.EnqueueEncodeVoiceData(output);
}
但是,这会导致音频输出比已经过的CD更糟糕。
我试图查看是否有任何方法可以确定缓冲区中是否有足够的数据,如果没有,则避免读取流,但似乎没有任何设施可以做到这一点。
我做错了什么?