C#调用mciSendString播放音频文件

mciSendString函数是一个WinAPI,主要用来向MCI(Media Control Interface)设备发送字符串命令。

一、函数的声明如下:

        private static extern long mciSendString(
            string command,      //MCI命令字符串
            string returnString, //存放反馈信息的缓冲区
            int returnSize,      //缓冲区的长度
            IntPtr hwndCallback  //回调窗口的句柄,一般为NULL
            );  

二、完整的代码如下,其中的细节都有注释说明,要特别注意播放时的线程处理:

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace Zhy.MCI
{
    /*
     * 调用API函数mciSendString播放音频文件
     * 主要包括按指定次数播放以及循环播放
     * 作者:Zhy
     * 时间:2015-7-21
     */
    public class MCI
    {
        [DllImport("winmm.dll")]
        private static extern long mciSendString(
            string command,      //MCI命令字符串
            string returnString, //存放反馈信息的缓冲区
            int returnSize,      //缓冲区的长度
            IntPtr hwndCallback  //回调窗口的句柄,一般为NULL
            );                   //若成功则返回0,否则返回错误码。

        /// <summary>
        /// 按指定次数播放
        /// </summary>
        /// <param name="file"></param>
        private void PlayWait(string file)
        {
            /*
             * open device_name type device_type alias device_alias  打开设备
             * device_name     要使用的设备名,通常是文件名。
             * type device_type  设备类型,例如mpegvideo或waveaudio,可省略。
             * alias device_alias 设备别名,指定后可在其他命令中代替设备名。
             */
            mciSendString(string.Format("open {0} type mpegvideo alias media", file), null, 0, IntPtr.Zero);

            /*
             * play device_alias from pos1 to pos2 wait repeat  开始设备播放
             * 若省略from则从当前磁道开始播放。
             * 若省略to则播放到结束。
             * 若指明wait则等到播放完毕命令才返回。即指明wait会产生线程阻塞,直到播放完毕
             * 若指明repeat则会不停的重复播放。
             * 若同时指明wait和repeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。
             */
            mciSendString("play media wait", null, 0, IntPtr.Zero);

            /*
             * close    关闭设备
             */
            mciSendString("close media", null, 0, IntPtr.Zero);
        }

        /// <summary>
        /// 循环播放
        /// </summary>
        /// <param name="file"></param>
        private void PlayRepeat(string file)
        {
            mciSendString(string.Format("open {0} type mpegvideo alias media", file), null, 0, IntPtr.Zero);
            mciSendString("play media repeat", null, 0, IntPtr.Zero);
        }

        private Thread thread;
        /// <summary>
        /// 播放音频文件
        /// </summary>
        /// <param name="file">音频文件路径</param>
        /// <param name="times">播放次数,0:循环播放 大于0:按指定次数播放</param>
        public void Play(string file, int times)
        {
            //用线程主要是为了解决在播放的时候指定wait时产生线程阻塞,从而导致界面假死的现象
            thread = new Thread(() =>
                {
                    if (times == 0)
                    {
                        PlayRepeat(file);
                    }
                    else if (times > 0)
                    {
                        for (int i = 0; i < times; i++)
                        {
                            PlayWait(file);
                        }
                    }
                });

            //线程必须为单线程
            thread.SetApartmentState(ApartmentState.STA);
            thread.IsBackground = true;
            thread.Start();
        }

        /// <summary>
        /// 结束播放的线程
        /// </summary>
        public void Exit()
        {
            if (thread != null)
            {
                try
                {
                    thread.Abort();
                }
                catch { }
                thread = null;
            }
        }
    }
}

三、调用:

new MCI().Play("音频文件路径",播放次数);
 
时间: 2024-10-30 14:56:55

C#调用mciSendString播放音频文件的相关文章

ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件

原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class="MapClient.PicMusic" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx

Qt 播放音频文件

Qt播放音频文件的方法有好多中,简单介绍几种 不过一下几种方式都需要在Qt工程文件中添加 QT += multimedia 第一 QMediaPlayer类 可以播放MP3文件,同时使用也是最简单的了,具体代码 { player = new QMediaPlayer; connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); player->setMedia(QUrl::fromL

Android 使用系统的Activity播放音频文件 intent

Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File("/sdcard/record.wav")), "audio"); startActivity(intent); 这里可以播放wav.amr.MP3等

Unity 播放音频文件

Unity 播放音频文件参考代码: 1 public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = false, float fPerTime = 1f) 2 { 3 if (!strSoundName.Equals("")) 4 { 5 //设置背景音乐 6 AudioClip clip = Resources.Load<AudioClip>(strSoundName); 7

关于Window Server2008 服务器上无法播放音频文件的解决方案

在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇到此类问题,可按照我的方式处理: 若是3gp文件,在服务器IIS的MIME类型中直接添加扩展名为“.3gp” MIME类型为“video/3gpp” 若是mp4文件,在服务器IIS的MIME类型中直接添加扩展名为“.mp4” MIME类型为“video/mp4” 以此类推 此方法能彻底解决视频播放问

使用audio标签播放音频文件

HTML5定义了一个新的元素用来指定标准的方式来插入音频文件到web页面中:<audio>标签.使用audio标签可以控制音频的播放与停止,循环播放与播放次数设置,以及播放位置等等. 例如:<audio id="a"  preload="metadata"  src="flash/1.mp3"  controls = "controls"></audio> 使用audio标签播放音频文件

ios为了用户隐私安全,禁止自动播放音频文件的解决办法(微信端)

ios为了用户隐私安全,禁止自动播放音频文件 //通过参数给音频设置id和路径 utils = { playAudio: function (id, src) { var audio = $('#' + id); if (audio.attr('src') == undefined) { audio.attr('src', src); } //audio[0].play(); function audioAutoPlay() { audio[0].play(); document.addEven

调用录音界播放音频文件

/* 播放录音文件 */private void playMusic(File file){Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);/* 设置文件类型 */intent.setDataAndType(Uri.fromFile(file), "audio");startAc

VC++中MCI播放音频文件 【转】

MCI播放mp3音频文件例程 源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Winmm.lib.或添加代码#pragma   comment(lib, "winmm.lib") MCI_OPEN_PARMS op; void CMCIDlg::OnPlay() {  // TODO: Add your control notification handler code