【问题标题】:Play/Stop MP3 Queue with Naudio or other使用 Naudio 或其他设备播放/停止 MP3 队列
【发布时间】:2017-04-03 13:27:17
【问题描述】:

我在停止/暂停 Mp3 队列时遇到问题。请问有什么帮助吗? 我使用 Githup 的这个类。它工作正常,但无法阻止它:

    public class playr
    {
        private Queue<string> playlist;
        private IWavePlayer player = new WaveOutEvent();
        private WaveStream fileWaveStream;

        public playr()
        {

        }
        public playr(List<string> startingPlaylist)
        {
            playlist = new Queue<string>(startingPlaylist);
        }
        public void PlaySong()
        {
            if (playlist.Count < 1)
            {
                return;
            }

                if (player != null && player.PlaybackState != PlaybackState.Stopped)
                {
                    player.Stop();
                }
                if (fileWaveStream != null)
                {
                    fileWaveStream.Dispose();
                }
                if (player != null)
                {
                    player.Dispose();
                    player = null;
                }

                player = new WaveOutEvent();


                fileWaveStream = new NAudio.Wave.Mp3FileReader(playlist.Dequeue(), new Mp3FileReader.FrameDecompressorBuilder(waveFormat => new NLayer.NAudioSupport.Mp3FrameDecompressor(waveFormat)));
                var stream = new BlockAlignReductionStream(fileWaveStream);

            player.Init(fileWaveStream);
            player.Play();
            player.PlaybackStopped += (sender, evn) => { PlaySong(); };


        }


    }

我从 datagridview 弹出 mp3 文件。目标是播放 mp3 声音和绘制图表。

 private void Play_Click(object sender, EventArgs e)
    {
        try
        {
              playlist = new List<string>();
                for (int item = 0; item < dataGridView1.Rows.Count - 1; item++)
                  {
                      playlist.Add(@"mp3Conversion\sounds\" + dataGridView1.Rows[item].Cells["mp3"].Value.ToString());

                  }

                playr playr = new playr(playlist);

                playr.PlaySong();

        }
        catch (Exception ex) { MessageBox.Show(ex.ToString()); }
    }

当我点击停止按钮时它不会停止。有没有办法添加通知器或管理队列?

    private void btnStop_Click(object sender, EventArgs e)
    {
        try
        {

            var playr = new playr(playlist);

            playr.stopit();

        }
        catch (Exception ex) { MessageBox.Show(ex.ToString()); }


    }

【问题讨论】:

    标签: c# charts queue mp3


    【解决方案1】:

    希望现在帮助你还为时不晚

    您不能暂停,因为您正在丢失对定义新对象的对象的引用

    你可以尝试将对象定义为静态对象来解决这个问题,但你必须非常小心地处理对象或从多线程访问它

    一个非常小的例子

        public class playr
    {
        private Queue<string> playlist;
        public static IWavePlayer player = new WaveOutEvent();
        // private WaveStream fileWaveStream;
    
        public playr()
        {
    
        }
        public playr(List<string> startingPlaylist)
        {
            playlist = new Queue<string>(startingPlaylist);
        }
    
        public void PlaySong()
        {
            if (playlist.Count < 1)
            {
                return;
            }
    
            if (player != null && player.PlaybackState != PlaybackState.Stopped)
            {
                player.Stop();
            }
    
            if (player != null)
            {
                player.Dispose();
                player = null;
            }
    
            player = new WaveOutEvent();
    
            var audioFilePath = playlist.First();
    
            var fileWaveStream = new AudioFileReader(audioFilePath);
    
            player.Init(fileWaveStream);
            player.Play();
            player.PlaybackStopped += (sender, evn) => { PlaySong(); };
        }
    }
    

    然后你可以从表单视图中处理“播放器”对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多