NAudio2.2.1 循环播放mp3


这才是难点,也是重点。

在 NAudio 2.2.1 版本中,您可以使用 WaveOut 类和自定义循环来实现 MP3 文件的循环播放。以下是一个示例代码,演示如何使用 NAudio 2.2.1 版本来循环播放 MP3 文件:

using NAudio.Wave;
using System;
using System.IO;

namespace YourNamespace
{
    public class AudioPlayer
    {
        private WaveOut waveOut;
        private Mp3FileReader mp3File;

        public AudioPlayer(string mp3FilePath)
        {
            // 初始化 WaveOut 和 Mp3FileReader
            waveOut = new WaveOut();
            mp3File = new Mp3FileReader(mp3FilePath);

            // 创建自定义循环播放器
            var loopStream = new CustomLoopStream(mp3File);

            // 将循环播放器与 WaveOut 关联
            waveOut.Init(loopStream);
        }

        public void Play()
        {
            waveOut.Play();
        }

        public void Stop()
        {
            waveOut.Stop();
        }

        public void Dispose()
        {
            waveOut.Dispose();
            mp3File.Dispose();
        }
    }

    // 自定义循环播放器
    public class CustomLoopStream : WaveStream
    {
        private readonly WaveStream sourceStream;

        public CustomLoopStream(WaveStream sourceStream)
        {
            this.sourceStream = sourceStream;
        }

        public override WaveFormat WaveFormat => sourceStream.WaveFormat;

        public override long Length => long.MaxValue; // 无限循环

        public override long Position
        {
            get => sourceStream.Position;
            set => sourceStream.Position = value;
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            int bytesRead = 0;

            while (bytesRead < count)
            {
                int read = sourceStream.Read(buffer, offset + bytesRead, count - bytesRead);

                if (read == 0)
                {
                    sourceStream.Position = 0; // 返回到音频开头
                }
                else
                {
                    bytesRead += read;
                }
            }

            return bytesRead;
        }
    }
}

在上述示例中,我们创建了一个名为 AudioPlayer 的自定义类,用于播放 MP3 文件。在构造函数中,我们初始化了 WaveOutMp3FileReader,然后使用 CustomLoopStream 类来包装 Mp3FileReader 以实现循环播放。

CustomLoopStream 类继承自 WaveStream,并实现了自定义的循环逻辑。在 Read 方法中,它会不断读取音频数据,直到满足请求的字节数,然后返回数据。当到达音频末尾时,它会将音频流的位置重置到开头,实现无限循环。

您可以使用以下方式在您的应用程序中使用 AudioPlayer 类:

// 创建 AudioPlayer 实例并传入 MP3 文件的路径
AudioPlayer audioPlayer = new AudioPlayer("your_audio_file.mp3");

// 播放音频
audioPlayer.Play();

// 停止播放音频(如果需要)
// audioPlayer.Stop();

// 最后,当不再需要时,请记得释放资源
// audioPlayer.Dispose();

这将允许您循环播放 MP3 文件,直到您停止播放或释放资源。


background.gril.jpg

这才是难点,也是重点。

在 NAudio 2.2.1 版本中,您可以使用 WaveOut 类和自定义循环来实现 MP3 文件的循环播放。以下是一个示例代码,演示如何使用 NAudio 2.2.1 版本来循环播放 MP3 文件:

using NAudio.Wave;
using System;
using System.IO;

namespace YourNamespace
{
    public class AudioPlayer
    {
        private WaveOut waveOut;
        private Mp3FileReader mp3File;

        public AudioPlayer(string mp3FilePath)
        {
            // 初始化 WaveOut 和 Mp3FileReader
            waveOut = new WaveOut();
            mp3File = new Mp3FileReader(mp3FilePath);

            // 创建自定义循环播放器
            var loopStream = new CustomLoopStream(mp3File);

            // 将循环播放器与 WaveOut 关联
            waveOut.Init(loopStream);
        }

        public void Play()
        {
            waveOut.Play();
        }

        public void Stop()
        {
            waveOut.Stop();
        }

        public void Dispose()
        {
            waveOut.Dispose();
            mp3File.Dispose();
        }
    }

    // 自定义循环播放器
    public class CustomLoopStream : WaveStream
    {
        private readonly WaveStream sourceStream;

        public CustomLoopStream(WaveStream sourceStream)
        {
            this.sourceStream = sourceStream;
        }

        public override WaveFormat WaveFormat => sourceStream.WaveFormat;

        public override long Length => long.MaxValue; // 无限循环

        public override long Position
        {
            get => sourceStream.Position;
            set => sourceStream.Position = value;
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            int bytesRead = 0;

            while (bytesRead < count)
            {
                int read = sourceStream.Read(buffer, offset + bytesRead, count - bytesRead);

                if (read == 0)
                {
                    sourceStream.Position = 0; // 返回到音频开头
                }
                else
                {
                    bytesRead += read;
                }
            }

            return bytesRead;
        }
    }
}

在上述示例中,我们创建了一个名为 AudioPlayer 的自定义类,用于播放 MP3 文件。在构造函数中,我们初始化了 WaveOutMp3FileReader,然后使用 CustomLoopStream 类来包装 Mp3FileReader 以实现循环播放。

CustomLoopStream 类继承自 WaveStream,并实现了自定义的循环逻辑。在 Read 方法中,它会不断读取音频数据,直到满足请求的字节数,然后返回数据。当到达音频末尾时,它会将音频流的位置重置到开头,实现无限循环。

您可以使用以下方式在您的应用程序中使用 AudioPlayer 类:

// 创建 AudioPlayer 实例并传入 MP3 文件的路径
AudioPlayer audioPlayer = new AudioPlayer("your_audio_file.mp3");

// 播放音频
audioPlayer.Play();

// 停止播放音频(如果需要)
// audioPlayer.Stop();

// 最后,当不再需要时,请记得释放资源
// audioPlayer.Dispose();

这将允许您循环播放 MP3 文件,直到您停止播放或释放资源。


background.gril.jpg

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在