流媒体播放时,NAudio Mp3Frame为空

时间:2016-09-16 21:23:58

标签: c# audio-streaming naudio

我正在尝试通过流媒体制作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。我该如何解决?

1 个答案:

答案 0 :(得分:1)

如果你得到一个空的MP3帧,那么这只是意味着它在输入数据中找不到MP3帧。那么你确定它是你传入的有效MP3。

另外,您可能想查看我关于playing streaming MP3的博文,看看该代码是否适用于您的文件。