C#调用mciSendString播放AVI和MP3的类

13 篇文章 0 订阅

使用MCI播放类里包含了一些简单的MCI COMMAND命令。

如果要播放RMVB,则另外需要安装插件。

 

  1.       private void button1_Click(object sender, EventArgs e)
  2.         {            
  3.             if (Temp != null)
  4.             {
  5.                 Temp.Play();
  6.             }
  7.             else
  8.             {
  9.                 Temp = new Zgke.Media.Sound(panel1);
  10.                 Temp.PlayRun += new Zgke.Media.Sound._PlayRun(Temp_PlayRun);
  11.                 openFileDialog1.InitialDirectory = @"C:/temp";
  12.                 if (openFileDialog1.ShowDialog() == DialogResult.OK)
  13.                 {
  14.                     string TempFile = openFileDialog1.FileName;
  15.                     Temp.AddSoundFile(TempFile);
  16.                     Temp.Play();
  17.                 }
  18.             }            
  19.         }
  20.         void Temp_PlayRun(Zgke.Media.Sound sender, int PlayPoint)
  21.         {
  22.             this.Invoke((MethodInvoker)delegate { trackBar1.Maximum = sender.PlayMillisecond; trackBar1.Value = PlayPoint; this.Text = PlayPoint.ToString() + "/" + sender.PlayMillisecond.ToString(); });
  23.         }

 

具体类

 

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Runtime.InteropServices; 
  5. using System.Text; 
  6. using System.IO ;
  7. using System.Windows.Forms;
  8. namespace Zgke.Media
  9.   /// <summary> 
  10.    /// Media 播放类。
  11.    /// zgke@sina.com
  12.    /// 
  13.   /// </summary> 
  14.   public class Sound
  15.   {
  16.       private Panel m_PlayPanel;
  17.       public Sound(Panel PanelShow)
  18.       {
  19.           m_PlayPanel = PanelShow;
  20.           _MyTime.Interval = 1;
  21.           _MyTime.Tick += new EventHandler(_MyTime_Tick);
  22.           PanelShow.SizeChanged += new EventHandler(PanelShow_SizeChanged);
  23.       }
  24.       /// <summary>
  25.       /// 控制大小
  26.       /// </summary>
  27.       /// <param name="sender"></param>
  28.       /// <param name="e"></param>
  29.       void PanelShow_SizeChanged(object sender, EventArgs e)
  30.       {
  31.           string _Temp = "".PadLeft(128, ' ');
  32.           _Long = mciSendString("put ZgkeMedia window at 0 0 " + m_PlayPanel.Width.ToString() + " " + m_PlayPanel.Height.ToString(), _Temp, 128, 0); //播放音频文件            
  33.    
  34.       }
  35.       /// <summary>
  36.       /// 时间处理
  37.       /// </summary>
  38.       /// <param name="sender"></param>
  39.       /// <param name="e"></param>
  40.       void _MyTime_Tick(object sender, EventArgs e)
  41.       {
  42.           int _TempPoint = PlayPoint;       //获取当前播放时间
  43.           if (_TempPoint != _OldIndex)  //如果播放时间是当前获取的时间 不进行处理
  44.           {
  45.               if (_TempPoint != m_PlayMillisecond)                  //如果是播放到最后
  46.               {
  47.                   if (PlayRun != null) PlayRun(this, _TempPoint+1);         //运行委托
  48.               }
  49.               else
  50.               {
  51.                   while (true)         //一直循环到结束
  52.                   {
  53.                       string _Temp = GetPlayMode();             //获取播放类型
  54.                       if (_Temp == "stopped" || _Temp =="")         //如果是停止状态或则退出状态
  55.                       {
  56.                           Stop();             //停止播放                             
  57.                           if (PlayRun != null) PlayRun(this, m_PlayMillisecond);       //执行委托
  58.                           _MyTime.Enabled = false;          //关闭时间控件
  59.                           break;                        
  60.                       }
  61.                       else
  62.                       {
  63.                           Application.DoEvents();        //进行界面处理
  64.                       }
  65.                   }
  66.               }
  67.               _OldIndex = _TempPoint;      //设置当前时间为处理后
  68.           }
  69.       }
  70.       [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  71.       private static extern int GetShortPathName(string lpszLongPath,string shortFile,int cchBuffer);
  72.       [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
  73.       public static extern int mciSendString(string lpstrCommand,string lpstrReturnString,int uReturnLength,int hwndCallback);
  74.   
  75.       #region 播放属性
  76.       private IList<string> m_SoundPathList = new List<string>();
  77.       /// <summary>
  78.       /// 播放列表
  79.       /// </summary>
  80.       public IList<string> SountPathList { get { return m_SoundPathList; } }
  81.       /// <summary>
  82.       /// 当前播放ID
  83.       /// </summary>
  84.       private int m_PlayIndex = 0;
  85.       /// <summary>
  86.       /// 播放索引
  87.       /// </summary>
  88.       public int PlayIndex { get { return PlayIndex; } }
  89.       private int m_PlayMillisecond = 0;
  90.       /// <summary>
  91.       /// 返回时间总长度
  92.       /// </summary>
  93.       public int PlayMillisecond { get { return m_PlayMillisecond; } }
  94.       /// <summary>
  95.       /// 当前播放时间
  96.       /// </summary>
  97.       public int PlayPoint
  98.       {
  99.           get
  100.           {
  101.               string _Temp = "".PadLeft(128, ' ');
  102.               int TTT=mciSendString("status ZgkeMedia position", _Temp, 128, 0);
  103.               _Temp = _Temp.Trim().Remove(_Temp.Trim().Length - 1, 1);
  104.               if (_Temp.Length == 0) return 0;
  105.               return Int32.Parse(_Temp);
  106.           }
  107.           set
  108.           {
  109.               if (value > m_PlayMillisecond) return;
  110.               string _Temp = "".PadLeft(128, ' ');
  111.               string _PlayType = GetPlayMode();             //获取播放类型  
  112.               _Long = mciSendString("Seek ZgkeMedia to " + value.ToString(), _Temp, 128, 0); //暂停文件  //移动到那里
  113.               switch (_PlayType)
  114.               {
  115.                   case "playing":                     
  116.                       _Long = mciSendString("play ZgkeMedia", _Temp, 128, 0); //继续播放文件 
  117.                       _MyTime.Enabled = true;
  118.                       break;
  119.                   default:
  120.                       break;
  121.               }             
  122.           }
  123.       }
  124.       /// <summary>
  125.       /// 音量 
  126.       /// </summary>
  127.       public int Volume
  128.       {
  129.           get
  130.           {
  131.               string _Temp = "".PadLeft(128, ' ');
  132.               mciSendString("status ZgkeMedia volume", _Temp, 128, 0);
  133.               _Temp = _Temp.Trim().Remove(_Temp.Trim().Length - 1, 1);
  134.               if (_Temp.Length == 0) return 0;
  135.               return Int32.Parse(_Temp);
  136.              
  137.           }
  138.           set
  139.           {
  140.               string _Temp = "".PadLeft(128, ' ');
  141.               mciSendString("setaudio ZgkeMedia volume to " + value.ToString(), _Temp, 128, 0);
  142.           }
  143.       }   
  144.       #endregion
  145.       /// <summary>
  146.       /// API的信息 0为正常
  147.       /// </summary>
  148.       private int _Long = 0;
  149.       /// <summary>
  150.       /// 时间控件 WINDOWS.FROM.TIMER 其他的取不到时间
  151.       /// </summary>
  152.       private Timer _MyTime = new Timer();
  153.       public delegate void _PlayRun(Sound sender,int PlayPoint);
  154.       public event _PlayRun PlayRun;
  155.       /// <summary>
  156.       /// 上次记录的时间
  157.       /// </summary>
  158.       private int _OldIndex = 0;
  159.       /// <summary>
  160.       /// 添加文件
  161.       /// </summary>
  162.       /// <param name="FileName">文件路径</param>
  163.       public void AddSoundFile(string FileName)
  164.       {
  165.           m_SoundPathList.Add(FileName);
  166.       }
  167.       /// <summary>
  168.       /// 播放
  169.       /// </summary>
  170.       public void Play()
  171.       {
  172.           _MyTime.Enabled = false;          
  173.           if (m_SoundPathList.Count == 0) return;
  174.           string _Temp = GetPlayMode();
  175.           switch (_Temp)  //根据播放状态设置
  176.           {
  177.               case "playing":
  178.                   _MyTime.Enabled = true;
  179.                   return;
  180.               case "paused":
  181.                   _Temp = "".PadLeft(128, ' ');
  182.                   _Long = mciSendString("Resume ZgkeMedia", _Temp, 128, 0); //继续播放  
  183.                   _MyTime.Enabled = true;
  184.                   return;
  185.               case "stopped":
  186.                   _Temp = "".PadLeft(128, ' ');
  187.                   _Long = mciSendString("play ZgkeMedia", _Temp, 128, 0); //继续播放文件 
  188.                   _MyTime.Enabled = true;
  189.                   break;                
  190.               default:
  191.                   break;
  192.           }
  193.           string _FilePath = "".PadLeft(260, ' ');
  194.           string _W32Path = m_SoundPathList[m_PlayIndex];
  195.           int xxx = GetShortPathName(_W32Path, _FilePath, 260);
  196.           _FilePath = _FilePath.Trim().Remove(_FilePath.Trim().Length - 1, 1);
  197.           string _FileType = GetFileType(_W32Path);       //获取文件类型
  198.          
  199.           if (_FileType.Length == 0) return;     
  200.           switch (_FileType)
  201.           {
  202.               case "digitalvideo":
  203.                   PlayMpeg(_FilePath, "MPEGVideo");
  204.                   break;           
  205.               default:
  206.                   PlaySount(_FilePath, _FileType);
  207.                   break;
  208.           }
  209.           _MyTime.Enabled = true;
  210.       }
  211.       /// <summary>
  212.       /// 播放声音类型
  213.       /// </summary>
  214.       private void PlaySount(string _FilePath,string _FileType)
  215.       {
  216.           string _PlayCommand = "open " + _FilePath + " alias ZgkeMedia type " + _FileType;
  217.           string _Temp = "".PadLeft(128, ' ');
  218.           _Long = mciSendString(_PlayCommand, _Temp, 128, 0); //初始化音频文件   
  219.           _Temp = "".PadLeft(128, ' ');
  220.           _Long = mciSendString("play ZgkeMedia", _Temp, 128, 0); //播放音频文件
  221.           _Temp = "".PadLeft(128, ' ');
  222.           _Long = mciSendString("status ZgkeMedia length", _Temp, 128, 0);  //获取时间                  
  223.           if (_Temp.Trim().Remove(_Temp.Trim().Length - 1, 1).Length == 0) return;
  224.           m_PlayMillisecond = Int32.Parse(_Temp.Trim());
  225.       }
  226.       /// <summary>
  227.       /// 播放AVI类型
  228.       /// </summary>
  229.       /// <param name="_FilePath"></param>
  230.       private void PlayMpeg(string _FilePath,string _FileType)
  231.       {
  232.           string _PlayCommand = "open " + _FilePath + " alias ZgkeMedia type "+_FileType+" parent " + m_PlayPanel.Handle.ToInt32().ToString() + " style child";
  233.           string _Temp = "".PadLeft(128, ' ');
  234.           _Long = mciSendString(_PlayCommand, _Temp, 128, 0); //初始化音频文件 
  235.           //"put AVI 文件名 window at X Y Width Height",                  
  236.           _Temp = "".PadLeft(128, ' ');
  237.           _Long = mciSendString("put ZgkeMedia window at 0 0 " + m_PlayPanel.Width.ToString() + " " + m_PlayPanel.Height.ToString(), _Temp, 128, 0); //播放音频文件            
  238.           _Temp = "".PadLeft(128, ' ');
  239.           _Long = mciSendString("play ZgkeMedia", _Temp, 128, 0); //播放音频文件                 
  240.           _Temp = "".PadLeft(128, ' ');
  241.           _Long = mciSendString("status ZgkeMedia length", _Temp, 128, 0);  //获取时间                  
  242.           if (_Temp.Trim().Remove(_Temp.Trim().Length - 1, 1).Length == 0) return;
  243.           m_PlayMillisecond = Int32.Parse(_Temp.Trim());                 
  244.       }
  245.       /// <summary>
  246.       /// 停止播放
  247.       /// </summary>
  248.       public void Stop()
  249.       {
  250.           string _Temp = "".PadLeft(128, ' ');
  251.           _Long = mciSendString("close ZgkeMedia", _Temp, 128, 0); //关闭文件     
  252.           _MyTime.Enabled = false;
  253.       }
  254.       /// <summary>
  255.       /// 暂停
  256.       /// </summary>
  257.       public void Pause()
  258.       {
  259.           string _Temp = "".PadLeft(128, ' ');
  260.           _Long = mciSendString("pause ZgkeMedia", _Temp, 128, 0); //暂停文件 
  261.           _MyTime.Enabled = false;
  262.       }
  263.     
  264.    
  265.       /// <summary>
  266.       /// 获取文件的播放类型
  267.       /// </summary>
  268.       /// <param name="FileName">文件</param>
  269.       /// <returns>类型</returns>
  270.       private string GetFileType(string FileName)
  271.       {          
  272.           string _FilePath = "".PadLeft(260, ' ');
  273.           _Long = GetShortPathName(FileName, _FilePath, 260);
  274.           _FilePath = _FilePath.Trim().Remove(_FilePath.Trim().Length - 1, 1);
  275.           string _Temp = "".PadLeft(128, ' ');
  276.           _Long = mciSendString("capability " + _FilePath + " device type", _Temp, 128, 0);
  277.           if (_Temp.Length == 0 || _Temp.Trim().Remove(_Temp.Trim().Length - 1, 1).Length == 0)
  278.           {
  279.               return "digitalvideo";
  280.           }
  281.           return _Temp.Trim().Remove(_Temp.Trim().Length-1,1);
  282.       }
  283.       /// <summary>
  284.       /// 获取播放状态
  285.       /// </summary>
  286.       /// <returns></returns>
  287.       private string GetPlayMode()
  288.       {
  289.           string _Temp = "".PadLeft(128, ' ');
  290.           mciSendString("status ZgkeMedia mode",_Temp,128,0);          
  291.           return _Temp.Trim().Remove(_Temp.Trim().Length-1,1);
  292.       }      
  293.   }
  294. }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值