NAudio流式传输MediaFoundationReader的正确方法

时间:2018-02-22 02:03:55

标签: c# audio naudio ms-media-foundation

我试图使用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更糟糕。

我试图查看是否有任何方法可以确定缓冲区中是否有足够的数据,如果没有,则避免读取流,但似乎没有任何设施可以做到这一点。

我做错了什么?

0 个答案:

没有答案