gpt4 book ai didi

c# - NAudio 正确传输 MediaFoundationReader 的方法

转载 作者:行者123 更新时间:2023-12-03 00:30:45 29 4
gpt4 key购买 nike

我正在尝试使用 NAudio 播放广播流。这(显然)用几行代码是可行的:

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 单声道的浮点样本作为字节流发送到其他地方。所以我这样做:
//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 播放的更糟。

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

我究竟做错了什么?

最佳答案

啊,这是一个隐藏知识的问题。

循环本身在计时器事件滴答中被调用,这意味着循环的多个实例可以(并且将)被调用,因为 Read操作显然是阻塞的,直到接收到请求的数据或流因任何原因结束。

由于计时器不分青红皂白地计时循环是否退出,它正在运行它自己的脚趾。

我通过删除计时器刻度并将例程插入 Task 解决了这个问题。 .

关于c# - NAudio 正确传输 MediaFoundationReader 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48918471/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com