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播放音频文件的更多相关文章
-
.NET winform播放音频文件
前提:最近要求做一个在winform端做一个音频文件播放的功能,至此,总结最近搜寻的相关资料. 一.微软提供了三种方式来播放音频文件 1.通过System.Media.SoundPlayer来播放 2 ...
-
ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件
原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...
-
Qt 播放音频文件
Qt播放音频文件的方法有好多中,简单介绍几种 不过一下几种方式都需要在Qt工程文件中添加 QT += multimedia 第一 QMediaPlayer类 可以播放MP3文件,同时使用也 ...
-
关于Window Server2008 服务器上无法播放音频文件的解决方案
在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇 ...
-
Unity 播放音频文件
Unity 播放音频文件参考代码: public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = fal ...
-
h5 audio播放音频文件
h5 audio播放音频文件 注:下面html中样式及不相关的内容去掉了 第一个例子 播放没有防盗链的外网音频文件是可以的 <!doctype html> <html> < ...
-
jquery自动播放音频文件
使用jquery自动播放音频文件 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
-
利用mciSendString播放音频
最近在写音频播放器,不过有点懒散,开发进度很慢,一天只做了一点点东西.其实就是让程序能播放音频.这个在我大二学winform程序开发时书上有说,那是书上教的是用media player的COM组件,而 ...
-
VC++中MCI播放音频文件 【转】
MCI播放mp3音频文件例程 源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Wi ...
随机推荐
-
NOI2018准备Day14晚
1个小时调处了前天晚上卡了一个晚上的数独,果然还是dfs回溯的问题. 1个小时做codevs2500城堡,然而并没有做出来 剩下1个小时,做了一道字符串的STL,空格和换行符 ,真心累啊...... ...
-
c# 复习
一.输入输出语句 二.异常语句 try catch fina 保护程序,在出错的情况下也不会终止. 三.输入一个日期,判断是否正确. 每日一语:觉得自己做得到和做不到,其实只在一念之间.
-
HTML的基本认识
就目前学的HTML,感受最深的就是很多标签.HTML不怎么需要逻辑,只需记忆大量标签.不懂的可以参照W3C的文档.里面有很多学习的东西,很受用. 关于CSS基础: 基本选择器: 1.标签选择器 ...
-
斯坦福第七课:正则化(Regularization)
7.1 过拟合的问题 7.2 代价函数 7.3 正则化线性回归 7.4 正则化的逻辑回归模型 7.1 过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集( ...
-
C# 中控件 WebBrowser 对 frameset/ iframe 操作和内容获取
1.获取frame的document HtmlDocument htmlDoc = webBrowser1.Document; htmlDoc = webBrowser1.Document.Wind ...
-
DOM4J介绍与代码示例【转载】
DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...
-
VBA -excel --遍历行
Sub filter1()Rem MsgBox ("AAAAA")Rem 1 get selected zoneRem 2 loop rows and check columnRe ...
-
js设置奇偶行数样式
$(document).ready(function () { odd = { "background": "none" }; //奇数样式 even = { ...
-
我学的是设计模式的视频教程——装饰图案,装饰图案VS代理模式
课程视频 装饰模式 装饰模式VS代理模式1 装饰模式VS代理模式2 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.
-
●BZOJ 1969 [Ahoi2005]LANE 航线规划
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1969 题解: 线段树,树链剖分,反向考虑思路是很巧妙,但是感觉代码真的恶心.. 反着考虑,先 ...