C#中使用声音播放暂停和恢复

编程入门 行业动态 更新时间:2024-10-20 06:36:32
本文介绍了C#中使用声音播放暂停和恢复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我是另一个人用C#和涉足想要创建一个简单的音频应用程序可以播放通过上传程序装入程序wav文件。我的问题是,我需要得到任何音频当前正在播放的音频文件的轨道定时器暂停文件时,我通过我的播放按钮重新启动音频文件被使用。我已经有一个全球性的计时器,baseTimer',那我想我可以用它来设置音频文件,已停止,曲目时间点。不过,我不知道如何做到这一点也不我真的知道如何使用所有的MCI命令呢。

I am another person dabbling with C# and wanting to create a simple audio application that plays wav files loaded into the program via an upload program. My issue is that I need to get whatever audio file currently being played to pause with the track timer of the audio file being used when I start the audio file again via my Play button. I already have a global timer, 'baseTimer', that I think I can use to set the audio file, that was stopped, track duration point. However I do not know how to accomplish this nor do I really know how to use all of the mci commands yet.

我已经展示我所有的code为我的主要应用...我也看过,我可能需要利用线程,但我也看到了,这将是不可能设置一个音频文件的轨道持续与线程

I have displayed all of my code for my main application... I also have read that I may need to utilize threading, but I've also read that it would be impossible to set an audio files track duration with a thread.

public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } System.Timers.Timer baseTimer = new System.Timers.Timer(); List<string> PlayList = new List<string>(); List<byte> PlayList_byte; int soundNum = 0; private string music_PATH { get; set; } private string talk_PATH { get; set; } private byte Pause_TIME { get; set; } private string Pause_RADIO { get; set; } bool isStopped = new bool(); bool isPaused = new bool(); [DllImport("winmm.dll")] private static extern uint mciSendString(string command, StringBuilder returnValue, int returnLength, IntPtr winHandle); public static int GetSoundLength(string fileName) { StringBuilder lengthBuf = new StringBuilder(32); mciSendString(string.Format("open \"{0}\" type waveaudio alias wave", fileName), null, 0, IntPtr.Zero); mciSendString("status wave length", lengthBuf, lengthBuf.Capacity, IntPtr.Zero); mciSendString("close wave", null, 0, IntPtr.Zero); int length = 0; int.TryParse(lengthBuf.ToString(), out length); return length; } private void SetPath() { music_PATH = @"..\\..\\commercial\list.txt"; talk_PATH = @"..\\..\\main\list.txt"; StreamReader myReader; using (myReader = new StreamReader(music_PATH)) { while (myReader.Peek() != -1) { string read = myReader.ReadLine(); PlayList.Add(read); } } using (myReader = new StreamReader(talk_PATH)) { while (myReader.Peek() != -1) { string read = myReader.ReadLine(); PlayList.Add(read); } myReader.Close(); } foreach (string sound in PlayList) { soundNum++; } } private string CurrentSound() { try { Random _randx = new Random(); int pick = _randx.Next(0, soundNum); string currentaudio = PlayList[pick]; Pause_RADIO = currentaudio; return currentaudio; } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } return null; } string _SelectedSound = ""; private string _Sound(string currentradio, string pattern) { foreach (Match entry in Regex.Matches(currentradio, pattern)) { _SelectedSound = entry.Value.ToString(); } if (_SelectedSound == "music") { return "commercial"; } else if (_SelectedSound == "talk") { return "main"; } return null; } private void _SetTimer(string currentradio, string pattern) { baseTimer.Interval = GetSoundLength(@"..\\..\\" + pattern + @"\" + currentradio); } private bool isRepeat(string lastradio, string currentradio) { if (lastradio == currentradio) { return true; } else { return false; } } private void baseTimerElasped(object sender, ElapsedEventArgs e) { Radio.FrmMain play = new Radio.FrmMain(); play.PlayPlayer(); } private void PlayPlayer() { MediaPlayer wavplayer; try { if (soundNum == 0) { SetPath(); PlayPlayer(); } else { string currentradio = CurrentSound(); bool localcheck = isRepeat(_SelectedSound, currentradio); if (localcheck == true) { PlayPlayer(); } else { string Pattern = @"(music|talk)"; string selected = _Sound(currentradio, Pattern); _SetTimer(currentradio, selected); switch (selected) { case "commercial": music_PATH = @"..\\..\\commercial\"; PlayList_byte = new List<byte>(File.ReadAllBytes(music_PATH + currentradio)); wavplayer = new MediaPlayer(PlayList_byte.GetRange(0, PlayList_byte.Count).ToArray()); wavplayer.Play(); baseTimer.Start(); break; case "main": talk_PATH = @"..\\..\\main\"; PlayList_byte = new List<byte>(File.ReadAllBytes(talk_PATH + currentradio)); wavplayer = new MediaPlayer(PlayList_byte.GetRange(0, PlayList_byte.Count).ToArray()); wavplayer.Play(); baseTimer.Start(); break; } } } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message + ex.StackTrace + ex.Source); } } private void PausePlayer() { MediaPlayer wavplayer = new MediaPlayer(PlayList_byte.GetRange(0, PlayList_byte.Count).ToArray()); baseTimer.Stop(); MessageBox.Show("Count: " + PlayList_byte.Count + "Pause_TIME: " + Pause_TIME + "\nPlaylist_byte" + PlayList_byte.ToString()); try { switch (isPaused) { case false: isPaused = true; wavplayer.Stop(); break; case true: isPaused = false; string localcheck = _Sound(Pause_RADIO, @"(music|talk)"); switch (localcheck) { case "commercial": music_PATH = @"..\\..\\commercial\"; wavplayer.Play(PlayList_byte.GetRange(PlayList_byte.Count - Pause_TIME, PlayList_byte.Count - Pause_TIME).ToArray()); break; case "main": talk_PATH = @"..\\..\\main\"; wavplayer.Play(PlayList_byte.GetRange(PlayList_byte.Count - Pause_TIME, PlayList_byte.Count - Pause_TIME).ToArray()); break; } break; } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message + ex.Data); } } private void btnPlay_Click(object sender, EventArgs e) { switch (isStopped) { case false: isStopped = true; btnPlay.Image = Image.FromFile(@"..\\..\\Pause.png"); lblPlay.Text = "Pause"; if (isPaused == false) { PlayPlayer(); } else { PausePlayer(); } break; case true: isStopped = false; btnPlay.Image = Image.FromFile(@"..\\..\\Play.png"); lblPlay.Text = "Play"; PausePlayer(); break; } baseTimer.Elapsed += new ElapsedEventHandler(baseTimerElasped); } private void btnNext_Click(object sender, EventArgs e) { PlayPlayer(); } private void btnStop_Click(object sender, EventArgs e) { MediaPlayer wavplayer = new MediaPlayer(); wavplayer.Stop(); baseTimer.Stop(); } private void btnQuit_Click(object sender, EventArgs e) { Application.Exit(); } private void btnGetUpload_Click(object sender, EventArgs e) { Uploader FrmUpload = new Uploader(); FrmUpload.Show(); this.Hide(); } } class MediaPlayer { SoundPlayer wavplayer; public MediaPlayer() { Stop(); } public MediaPlayer(byte[] buffer) { MemoryStream memStream = new MemoryStream(buffer, true); wavplayer = new SoundPlayer(memStream); } public void Play() { wavplayer.Play(); } public void Play(byte[] buffer) { wavplayer.Stream.Seek(0, SeekOrigin.Begin); wavplayer.Stream.Write(buffer, 0, buffer.Length); wavplayer.Play(); } public void Stop() { wavplayer.Stop(); } }

编辑:

有关清晰currentaudio有一个文件,如它这样的music3.wav或talk1.wav。

For clarity currentaudio has a file as such "music3.wav" or "talk1.wav" in it.

推荐答案

的声音播放是极其有限的,并且不支持暂停和恢复。你能够使用WPF MediaElement的呢?你会发现它是更强大,支持多种播放类型的文件,重新定位,设置音量,暂停和恢复。你也可以用它来获取文件长度,而不是MCI。

SoundPlayer is extremely limited, and doesn't support Pause and Resume. Are you able to use the WPF MediaElement instead? You will find it is much more powerful, supporting playing files of many types, repositioning, setting volume, pausing and resuming. You can also use it to get the file length instead of mci.

更多推荐

C#中使用声音播放暂停和恢复

本文发布于:2023-11-07 06:10:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1565746.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:声音

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!