出于测试目的,我已经实现了 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);
}
}
}
}
}
}
}
}