我正在尝试通过流媒体制作MP3播放器。互联网源上的mp3文件可以在这个项目中实时播放。另外我想让它支持暂停,停止,前进,后退。要获得这些功能,我需要编写一个灵活的播放器。
所以我写了这段代码:
WaveOut outer;
AcmMp3FrameDecompressor decompressor;
BufferedWaveProvider provider;
public void Play()
{
Task.Run(() =>
{
var response = WebRequest.Create(url).GetResponse();
var responseStream = response.GetResponseStream();
Mp3Frame frame;
byte[] buffer = new byte[30000];
int bytesRead = 0;
MemoryStream ms = new MemoryStream();
ReadFullyStream fully = new ReadFullyStream(ms);
do
{
bytesRead = responseStream.Read(buffer, 0, buffer.Length);
ms.Write(buffer, 0, bytesRead);
frame = Mp3Frame.LoadFromStream(fully);
if (decompressor == null)
{
decompressor = CreateFrameDecompressor(frame) as AcmMp3FrameDecompressor;
provider = new BufferedWaveProvider(decompressor.OutputFormat);
provider.BufferDuration = TimeSpan.FromSeconds(50);
outer = new WaveOut();
outer.Init(provider);
outer.Play();
}
int decompressed = decompressor.DecompressFrame(frame, buffer, 0);
provider.AddSamples(buffer, 0, decompressed);
}
while (bytesRead > 0);
});
}
在上面的代码中,由于frame为null,因此抛出异常。这意味着LoadMp3FromStream
不适用于MemoryStream
。我该如何解决?
答案 0 :(得分:1)
如果你得到一个空的MP3帧,那么这只是意味着它在输入数据中找不到MP3帧。那么你确定它是你传入的有效MP3。
另外,您可能想查看我关于playing streaming MP3的博文,看看该代码是否适用于您的文件。