0

出于测试目的,我已经实现了 c# 代码,只是为了播放缓冲区的一个片段(通过在 while 循环中执行它,我可以读取来自套接字的整个数据并播放)我使用了这三个版本的 nAudio(v1.2 ,v1.3,v1.7)这三个版本在这种情况下给出了不同的错误,我在下面列出了它们(我也很困惑为什么会这样)。我已经附上了我的源代码。

使用 NAudio 1.3 时

  • FormatException 未处理。
  • 说明 - 不是一个可识别的 MP3 块
  • 错误行:-使用 (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms))))

使用 NAudio 1.6 时

  • InvaliedOperationException 未处理
  • 说明 - 在采样率为 48000 的 mp3 中以 16000 的采样率获得帧。Mp3FileReader 不支持采样率更改。
  • 错误行 - 同一行

当使用 NAudio 1.7

  • NullReferenceException 未处理
  • 描述 - 对象引用未设置为对象的实例。
  • 错误行 - 同一行

我使用 1.7 而不是 1.6,因为它支持采样率更改(在来源中提到)。然后我得到上述错误。每次我得到同一行错误行。由于我是 C# 和 .net 平台的新手,我需要您的帮助来纠正这个问题。谢谢,期待回复。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using NAudio.Wave;
using System.IO;
using System.Threading;

namespace audioTest2
{
    class Program
    {
        public static void Main()
        {

                while (true)
                {
                    Console.WriteLine("Waiting for broadcast");


                    UdpClient listener = new UdpClient(5000);
                    IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 5000);
                    byte[] buffer = listener.Receive(ref groupEP);
                    using (Stream ms = new MemoryStream())
                    {

                        buffer = listener.Receive(ref groupEP);
                        Console.WriteLine("read : " + buffer.Length);
                        ms.Write(buffer,0,buffer.Length);

                        ms.Position = 0;
                        using (WaveStream blockAlignedStream =
                            new BlockAlignReductionStream(
                                WaveFormatConversionStream.CreatePcmStream(
                                    new Mp3FileReader(ms))))
                        {
                            using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                            {
                                waveOut.Init(blockAlignedStream);
                                waveOut.Play();
                                while (waveOut.PlaybackState == PlaybackState.Playing)
                                {
                                    System.Threading.Thread.Sleep(100);
                                }
                            }
                        }

                    }
                }
            }

        }

}
4

1 回答 1

0

我强烈建议您查看 NAudio 源代码(在 NAudioDemo 项目中)附带的 MP3 流媒体演示。读取 MP3 文件时不需要WaveFormatConversionStreamBlockAlignReduction流,并且应该避免函数回调 -WaveOutEvent改为使用。此外,Mp3FileReader该类是为整个 MP3 文件设计的,您可以在其中重新定位。您需要的方法是在 MP3 帧到达时对其进行解析,单独解码,并以某种方式缓冲音频(例如使用BufferedWaveProvider)。

于 2013-06-09T20:42:04.440 回答