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 ...
随机推荐
- BZOJ 2006 超级钢琴(堆+主席树)
很好的一道题. 题意:给出长度为n的数列,选择k个互不相同的区间,满足每个区间长度在[L,R]内,求所有选择的区间和的总和最大是多少.(n,k<=5e5). 首先将区间和转化为前缀和之差,那么我 ...
- Android四大组件之contentProvider
Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...
- Argus UVALive - 3135(优先队列 水题一道)
有一系列的事件,它每Period秒钟就会产生编号为qNum的事件,你的任务是模拟出前k个事件,如果多个事件同时发生,先处理qNum小的事件 今天再看看数据结构.. #include <iostr ...
- 3.7 TCP拥塞控制
3.7 TCP拥塞控制 在3.5.5流量控制中有,接收方通过维护一个rwnd来控制流量,本节中考虑三个问题: 第一, 一个TCP发送方如何限制它向其他连接发送流量的速率. 第二, 一个TCP发送方 ...
- OI队测题解:
Test 17 T1: 题目大意: 喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树. 所有星球间的双向航线的长度都为1.小昕要在若干个星球建矿石仓库,设立每个仓库的费用为K.对于未 ...
- Spring Boot系列教程十:Spring boot集成Sentinel Redis
前言 上一篇文章介绍了spring boot集成单点的redis,然而实际生产环境使用单点的redis风险很高,一旦宕机整个服务将无法使用,这篇文章介绍如何使用基于sentinel的redis高可用方 ...
- 洛谷5月月赛T30212 玩游戏 【分治NTT + 多项式求ln】
题目链接 洛谷T30212 题解 式子很容易推出来,二项式定理展开后对于\(k\)的答案即可化简为如下: \[k!(\sum\limits_{i = 0}^{k} \frac{\sum\limits_ ...
- CAS单点登录详细流程
一.CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS ...
- 框架----Django之Form提交验证(一)
一.Form提交验证与Ajax提交验证的运用实例 Form表单提交时会刷新页面,输入失败时,输入框内内容也会随之刷新不能保留:而Ajax提交是在后台偷偷提交,不会刷新页面,因此也就可以保留页面输入框内 ...
- Codeforces Round #306 (Div. 2)A B C D 暴力 位/暴力 暴力 构造
A. Two Substrings time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...