首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用NAudio播放来自UDP数据包的音频流?

如何使用NAudio播放来自UDP数据包的音频流?
EN

Stack Overflow用户
提问于 2020-05-26 19:18:28
回答 1查看 869关注 0票数 1

我从Voicemeeter本地接收数据,它使用VBAN协议发送字节流。

我试图使用NAudio来解码字节,并使用WaveOutEvent播放音频。我的实现与来自NetworkChatDemo的NAudioDemo几乎是一样的,查看这个链接来了解更多关于NAudio的信息,这是一个很棒的音频库,非常感谢Mark。

我的实施:

代码语言:javascript
运行
复制
private readonly ILogger<AudioController> _logger;
        private NetworkAudioPlayer player;
        private readonly INetworkChatCodec _codec;


        public AudioController(ILogger<AudioController> logger)
        {
            _logger = logger;
            _codec = new ALawChatCodec();
        }

        [HttpGet]
        [Route("start")]
        public IActionResult Start()
        {

            var receiver = new UdpAudioReceiver(6980);
            player = new NetworkAudioPlayer(_codec, receiver);

            return Ok("Hello");
        }

网络音频播放器:

代码语言:javascript
运行
复制
private readonly INetworkChatCodec codec;
    private readonly IAudioReceiver receiver;
    private readonly IWavePlayer waveOut;
    private readonly BufferedWaveProvider waveProvider;

    public NetworkAudioPlayer(INetworkChatCodec codec, IAudioReceiver receiver)
    {
        this.codec = codec;
        this.receiver = receiver;
        receiver.OnReceived(OnDataReceived);

        waveOut = new WaveOutEvent();
        waveProvider = new BufferedWaveProvider(codec.RecordFormat);
        waveProvider.BufferDuration = TimeSpan.FromSeconds(300);
        waveOut.Init(waveProvider);
        waveOut.Play();
    }

    void OnDataReceived(byte[] compressed)
    {
        byte[] decoded = codec.Decode(compressed, 0, compressed.Length);
        waveProvider.AddSamples(decoded, 0, decoded.Length);
    }

    public void Dispose()
    {
        receiver?.Dispose();
        waveOut?.Dispose();
    }

在这个实施过程中,我有两个问题:

  • 首先,我无法将BufferDuration设置为无限值,因为它是一个活动流。
  • 第二,除了噪音,我什么也没听到。

如何将BufferDuration设置为无穷大?

如何正确播放音频?

更新:我能够解决第一个问题,方法是将DiscardOnBufferOverflow的bufferPorivider值设置为等于true。

关于噪音问题,我已经从这个问题中找到了解决方案,Mark提到

另外,您是否确定在接收的网络数据包中没有周围的元数据?如果是这样的话,那就需要去掉,否则就会产生噪音。

因此,在向BufferProvider添加示例时,我将偏移量的值更改为等于28,这将导致异常:

代码语言:javascript
运行
复制
  void OnDataReceived(byte[] compressed)
        {
            var l = compressed.Length;
            waveProvider.AddSamples(compressed, 28, compressed.Length);
        }

堆栈跟踪:

代码语言:javascript
运行
复制
    > 
> System.ArgumentException
  HResult=0x80070057
  Message=Source array was not long enough. Check the source index, length, and the array's lower bounds. (Parameter 'sourceArray')
  Source=System.Private.CoreLib
  StackTrace:
   at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
   at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length)
   at NAudio.Utils.CircularBuffer.Write(Byte[] data, Int32 offset, Int32 count)
   at NAudio.Wave.BufferedWaveProvider.AddSamples(Byte[] buffer, Int32 offset, Int32 count)
   at POC.AudioStreaming.AudioManagers.NetworkAudioPlayer.OnDataReceived(Byte[] compressed) in C:\dev\POC.AudioStreaming\POC.AudioStreaming\AudioManagers\NetworkAudioPlayer.cs:line 41
   at POC.AudioStreaming.AudioManagers.UdpAudioReceiver.ListenerThread(Object state) in C:\dev\POC.AudioStreaming\POC.AudioStreaming\AudioManagers\UdpAudioReceiver.cs:line 38
   at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
   at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
   at System.Threading.QueueUserWorkItemCallback.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

如何解决此异常?

EN

Stack Overflow用户

发布于 2020-05-27 10:35:40

我通过使用Skip函数从接收到的数据包中修剪前28个字节来解决异常:

代码语言:javascript
运行
复制
 void OnDataReceived(byte[] compressed)
    {
        byte[] buffer = compressed.Skip(28).ToArray();
        waveProvider.AddSamples(buffer, 0, buffer.Length);
    }

通过解决异常,我能够很好地听到声音。我也回答了我的问题。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62029728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档