C#调用mciSendString播放音频文件
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 ...
随机推荐
- 【bzoj4355】Play with sequence 线段树区间最值操作
题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...
- 【uoj#175】新年的网警 结论题+Hash
题目描述 给出一张 $n$ 个点 $m$ 条边的无向连通图,每条边的边权为1.对于每个点 $i$ ,问是否存在另一个点 $j$ ,使得对于任意一个不为 $i$ 或 $j$ 的点 $k$ ,$i$ 到 ...
- 【bzoj2300】[HAOI2011]防线修建 离线+STL-set维护凸包
题目描述 给你(0,0).(n,0).(x,y)和另外m个点,除(0,0)(n,0)外每个点横坐标都大于0小于n,纵坐标都大于0. 输入 第一行,三个整数n,x,y分别表示河边城市和首都是(0,0), ...
- Python常忘的进阶知识(下)
0.目录 1.装饰器 1.1 为每个函数都增加一个功能 1.2 装饰器只是一种模式 1.3 语法糖 1.4 函数需要传递参数,该如何更改装饰器? 1.5 函数需要传递关键字参数,该如何更改装饰器? 2 ...
- 【BZOJ4004】装备购买(线性基)
[BZOJ4004]装备购买(线性基) 题面 BZOJ 洛谷 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am ...
- 【SPOJ】QTREE6(Link-Cut-Tree)
[SPOJ]QTREE6(Link-Cut-Tree) 题面 Vjudge 题解 很神奇的一道题目 我们发现点有黑白两种,又是动态加边/删边 不难想到\(LCT\) 最爆力的做法,显然是每次修改单点颜 ...
- python中如何优雅续行和换行
http://note.youdao.com/noteshare?id=8dbcb93991a89a6cfcd95580ed2198f0
- 9.Android UiAutomator正则表达式的使用
一.正则表达式元字符: 1.一些常用元字符: 元字符 描述 . 表示任意一个字符 \s 空格字符(空格键.tab.换行.换页.回车) \S 非空字符串([^\s]) \d 一个数字(相当于[0-9]中 ...
- php网摘收藏
1.thinkphp3.2.3开发手册: http://document.thinkphp.cn/manual_3_2.html 2.ThinkPHP3.2.3的函数汇总:http://www.thi ...
- 前端PHP入门-008-自定义函数
大家已经是有编程经验的WEB前端,那么对于函数已经很熟悉了,PHP当中定义函数跟你们学习的JavaScript一样 想想有哪些函数类型? 我们在实际开发过程当中需要有很多功能都需要反复使用到,而这些反 ...