none
各位老师.求教.关于自动播放音乐的设计. RRS feed

  • 问题

  • 题目是这样的.

    打开软件 ---> 选择歌曲(多首) ---> 选择开始播放时间  ---->选择结束播放时间

    当达到开始播放时间时.按顺序播放选择的歌曲.当到这了结束播放时间时.立即停止播放音乐.

    这个数据不只一条.

    比如

    开始时间  结束时间  音乐路径
    10:00      11:00    d:\aa.mp3
    12:00      12:30    c:\bb.mp3

    需要在软件里现实.不能使用系统的  任务计划.

    想破脑袋了.也没搞出个有用的解决方案来.
    SO..来这里求助各位.

    先谢谢了.把所有的分都发出来了.
    2010年6月11日 6:18

答案

  • timer只是做时间控制,建立三个集合,一个放所有的开始的歌曲 key:歌曲连接 value:时间,另一个放所有的结束歌曲key:歌曲连接 value:时间,

    第三个放所有的线程集合key:歌曲名 value:线程

    在timer中遍历开始歌曲集合和结束歌曲集合

    开始集合中 有值:建立线程,打开线程,并把线程添加到线程集合中保管

    结束集合中 有值:根据歌曲名查找线程,关闭线程。

    2010年6月13日 2:47

全部回复

  • 用一个 System.Timers.Timer 每隔 1 秒执行一个特定的委托,这个委托从数据库读取记录,满足:开始时间 < 现在时间 < 结束时间。然后造一个列表用来存放当前正在播放的歌曲的记录。播放音乐如果是 MP3 的话自己在程序中嵌入一个 Windows Media Player,如果是 WAV 的话用 System.Media.SoundPlayer。基本思路就是这样的。

    不过有个问题就是如果数据库中的记录显示在同一时间有多条记录匹配需要播放的话就不好办了。最好能保证没有这种情况出现。


    Mark Zhou
    2010年6月11日 9:26
  • 感谢mazhou.只是里面会有不少同一时间的,比如

     

    11:00  ~ 12:00

    11:30 ~ 14:00

     

    还有就是.如果每一秒执行一次.但是.

    当把列表加入播放的时候.是不是应该要停止这个Timer呢.

    停止了还怎么去设置.结束播放的时间哦.

     

    2010年6月12日 2:49
  • timer只是做时间控制,建立三个集合,一个放所有的开始的歌曲 key:歌曲连接 value:时间,另一个放所有的结束歌曲key:歌曲连接 value:时间,

    第三个放所有的线程集合key:歌曲名 value:线程

    在timer中遍历开始歌曲集合和结束歌曲集合

    开始集合中 有值:建立线程,打开线程,并把线程添加到线程集合中保管

    结束集合中 有值:根据歌曲名查找线程,关闭线程。

    2010年6月13日 2:47
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Media;
    using AxWMPLib;

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            Dictionary<DateTime, String> starts = new Dictionary<DateTime, String>();
            Dictionary<DateTime, String> ends = new Dictionary<DateTime, String>();
            Dictionary<String, AxWindowsMediaPlayer> players = new Dictionary<string, AxWindowsMediaPlayer>();

            private void Form1_Load(object sender, EventArgs e)
            {
                starts.Add(DateTime.Now.AddSeconds(10),"m1.mp3");
                starts.Add(DateTime.Now.AddSeconds(15),"m2.mp3");
                ends.Add( DateTime.Now.AddSeconds(20),"m1.mp3");
                ends.Add( DateTime.Now.AddSeconds(25),"m2.mp3");

                foreach (DateTime start in starts.Keys)
                {
                    ListViewItem lvi = new ListViewItem(start.ToString());

                    this.listView1.Items.Add(lvi);
                }
                foreach (DateTime end in ends.Keys)
                {
                    ListViewItem lvi = new ListViewItem(end.ToString());

                    this.listView2.Items.Add(lvi);
                }

            }

            private void button1_Click(object sender, EventArgs e)
            {
               
              
            }

            private void button2_Click(object sender, EventArgs e)
            {
                playSound("m2.mp3");
            }
            public void playSound(String url)
            {
                AxWindowsMediaPlayer player = new AxWindowsMediaPlayer();
                this.Controls.Add(player);
                players.Add(url, player);
                player.URL = url;
            }
            public void closeSound(AxWindowsMediaPlayer close)
            {
                close.close();
            }

            private void timer1_Tick(object sender, EventArgs e)
            {
                this.label1.Text = DateTime.Now.ToString();
                foreach (DateTime start in starts.Keys)
                {
                    if (start.ToString().Equals(DateTime.Now.ToString()))
                    {
                        playSound(starts[start]);
                    }
                }
                foreach (DateTime end in ends.Keys)
                {
                    if (end.ToString().Equals(DateTime.Now.ToString()))
                    {
                        closeSound(players[ends[end]]);
                    }
                }
            }

           
        }
    }
    2010年6月13日 4:45
  • 前几天回家了.没上网.

    感谢jason.B 的方案

    2010年6月16日 6:02