C#调用mciSendString播放音频文件

时间:2022-11-01 18:07:16

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

一、函数的声明如下:

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

二、完整的代码如下,其中的细节都有注释说明。

需要注意两点:

1、文件路径要用""包含起来;

2、线程需要指定为STA。

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, , IntPtr.Zero); /*
* play device_alias from pos1 to pos2 wait repeat 开始设备播放
* 若省略from则从当前磁道开始播放。
* 若省略to则播放到结束。
* 若指明wait则等到播放完毕命令才返回。即指明wait会产生线程阻塞,直到播放完毕
* 若指明repeat则会不停的重复播放。
* 若同时指明wait和repeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。
*/
mciSendString("play media wait", null, , IntPtr.Zero); /*
* close    关闭设备
*/
mciSendString("close media", null, , IntPtr.Zero);
} /// <summary>
/// 循环播放
/// </summary>
/// <param name="file"></param>
private void PlayRepeat(string file)
{
mciSendString(string.Format("open \"{0}\" type mpegvideo alias media", file), null, , IntPtr.Zero);
mciSendString("play media repeat", null, , 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 == )
{
PlayRepeat(file);
}
else if (times > )
{
for (int i = ; 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("音频文件路径",播放次数);

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

  1. &period;NET winform播放音频文件

    前提:最近要求做一个在winform端做一个音频文件播放的功能,至此,总结最近搜寻的相关资料. 一.微软提供了三种方式来播放音频文件 1.通过System.Media.SoundPlayer来播放 2 ...

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

    原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...

  3. Qt 播放音频文件

    Qt播放音频文件的方法有好多中,简单介绍几种 不过一下几种方式都需要在Qt工程文件中添加 QT       += multimedia 第一 QMediaPlayer类 可以播放MP3文件,同时使用也 ...

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

    在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇 ...

  5. Unity 播放音频文件

    Unity 播放音频文件参考代码: public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = fal ...

  6. h5 audio播放音频文件

    h5 audio播放音频文件 注:下面html中样式及不相关的内容去掉了 第一个例子 播放没有防盗链的外网音频文件是可以的 <!doctype html> <html> &lt ...

  7. jquery自动播放音频文件

    使用jquery自动播放音频文件 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. 利用mciSendString播放音频

    最近在写音频播放器,不过有点懒散,开发进度很慢,一天只做了一点点东西.其实就是让程序能播放音频.这个在我大二学winform程序开发时书上有说,那是书上教的是用media player的COM组件,而 ...

  9. VC&plus;&plus;中MCI播放音频文件 【转】

    MCI播放mp3音频文件例程 源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Wi ...

随机推荐

  1. NOI2018准备Day14晚

    1个小时调处了前天晚上卡了一个晚上的数独,果然还是dfs回溯的问题. 1个小时做codevs2500城堡,然而并没有做出来 剩下1个小时,做了一道字符串的STL,空格和换行符 ,真心累啊...... ...

  2. c&num; 复习

    一.输入输出语句 二.异常语句 try catch  fina 保护程序,在出错的情况下也不会终止. 三.输入一个日期,判断是否正确. 每日一语:觉得自己做得到和做不到,其实只在一念之间.

  3. HTML的基本认识

    就目前学的HTML,感受最深的就是很多标签.HTML不怎么需要逻辑,只需记忆大量标签.不懂的可以参照W3C的文档.里面有很多学习的东西,很受用. 关于CSS基础: 基本选择器: 1.标签选择器    ...

  4. 斯坦福第七课:正则化&lpar;Regularization&rpar;

    7.1  过拟合的问题 7.2  代价函数 7.3  正则化线性回归 7.4  正则化的逻辑回归模型 7.1  过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集( ...

  5. C&num; 中控件 WebBrowser 对 frameset&sol; iframe 操作和内容获取

    1.获取frame的document HtmlDocument htmlDoc = webBrowser1.Document;  htmlDoc = webBrowser1.Document.Wind ...

  6. DOM4J介绍与代码示例【转载】

    DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...

  7. VBA -excel --遍历行

    Sub filter1()Rem MsgBox ("AAAAA")Rem 1 get selected zoneRem 2 loop rows and check columnRe ...

  8. js设置奇偶行数样式

    $(document).ready(function () { odd = { "background": "none" }; //奇数样式 even = { ...

  9. 我学的是设计模式的视频教程——装饰图案,装饰图案VS代理模式

    课程视频 装饰模式 装饰模式VS代理模式1 装饰模式VS代理模式2 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.

  10. ●BZOJ 1969 &lbrack;Ahoi2005&rsqb;LANE 航线规划

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1969 题解: 线段树,树链剖分,反向考虑思路是很巧妙,但是感觉代码真的恶心.. 反着考虑,先 ...