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, 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("音频文件路径",播放次数);

转载于:https://www.cnblogs.com/zhou-yi/p/4710230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 存json中文乱码怎么设置_json接口插入数据库中文乱码

现象&#xff1a;1. 数据库中文乱码控制台显示中文乱码加载的日志2016-08-28 16:00:42,894 org.nutz.dao.impl.DaoSupport$1.invoke(DaoSupport.java:174) DEBUG - JDBC URL --> jdbc:mysql://139.129.118.219:13306/CloudServer2016-08-28 16:00:42,989 org.nutz.dao.impl.…

[转]进程间通信 - ipcrm

ipcrm 命令删除一个或更多的消息队列、信号量集或者共享内存标识。 简介 ipcrm [ -M key | -m id | -Q key | -q id | -S key | -s id ] ... 错误的用法 ipcrm {shm|msg|sem} id... 1.使用说明 ipcrm -M shmkey 移除用shmkey创建的共享内存段 ipcrm -m shmid 移除用shmid标…

python批量修改文件名为excel中指定名称_在Python脚本的帮助下,使用excelsh中的名称映射重命名文件夹中的文件名...

在一个文件夹中有许多CSV文件我想重命名。有一个excel工作表&#xff0c;其中包含要重命名为文件夹的文件名。在文件夹中的文件名为测试数据&#xff1f;30四月.csv在测试数据&#xff1f;20四月.csv在测试数据18四月.csv等等而excel工作表包含的名称为0.25-测试数据4月30日0.9…

sequelize连接mysql_Sequelize没有连接mysql

文件config / config.json{"development": {"username": "root","password": null,"database": "example","host": "example.sqlite","dialect": "sqlite"},"stage…

java开发微信公众平台备忘

简单记录下前段时间开发的电子书的 公众平台的一些备忘及开发心得经验等 eclipse的一些技巧: 1.ctrlshifto 自动添加必要import空间及移除无用import 项目备忘说明 1.struts配置 :resources->struts.xml 经验心得: 1.struts在前台显示后台属性&#xff1a;${属性名称}&#…

java初级程序员_为什么现在JAVA初级程序员要求这么高?

为什么现在JAVA初级程序员要求这么高&#xff1f;举个例子&#xff0c;在90年代&#xff0c;我们吃的是什么&#xff1f;有像现在每天没肉吃就吃不下饭的时候吗&#xff1f;那在90年代我们的编程技术又是什么样的&#xff1f;是不是垃圾的再垃圾不过了&#xff1f;那时候是不是…

html5晋级之路-css背景

css背景&#xff1a; css允许应用纯色作为背景&#xff0c;也允许使用图片来创建相当复杂的效果。 background-attachment 背景图像书否固定或随页面的其余部分滚动 background-color 设置元素的背景颜色 background-image 把…

java word在线预览_java 生成word文档并且在线预览的问题

富文本&#xff1f;用iText或者PD4ML直接转换为pdf[code"java"]String outputFile "D:/Test/demo_3.pdf";OutputStream os new FileOutputStream(outputFile);ITextRenderer renderer new ITextRenderer();ITextFontResolver fontResolver renderer.ge…

java中引用

谈论Java肯定离不开其中的垃圾回收机制&#xff0c;无论是通过引用计数算法判断对象的引用数量&#xff0c;还是通过根搜索算法判断对象的引用链是否可达&#xff0c;判断对象是否存活都与“引用”有关。 在JDK1.2之前&#xff0c;Java中引用的定义很传统&#xff1a;如果refer…

SQL SERVER 2014 各个版本支持的功能

转自&#xff1a;https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称EnterpriseBusiness IntelligenceStandardWebExpress with Advanced ServicesExpress with ToolsExpress单个实例使用的最大计算能力&#xff08;SQL Server 数据库引擎&#xff09;1操…

关于src和background

今天想修改imageview的src里的图片时&#xff0c;发现居然没有setSrcResource方法&#xff0c;但是setBackGroundResource肯定不行啊。 后来找了好几遍&#xff0c;其实与src对应的就是 setImageResource方法。以后别忘记了哦。转载于:https://www.cnblogs.com/heartstong/p/47…

java 线程只执行一次_java – 如何确保方法只执行一次并且只从一个线程执行?...

ShayHaned的解决方案使用锁定.您可以通过AtomicBoolean使其更高效,如&#xff1a;AtomicBoolean wasRun new AtomicBoolean(false);CountDownLatch initCompleteLatch new CountDownLatch(1);public void initialize() {if (!wasRun.getAndSet(true)) {List metadata getMet…

Android无法生成R文件的终极解决办法

R文件如果在clean项目&#xff08;Project—>Clean&#xff09;和 Fix Project Properties&#xff08;如下图&#xff09;&#xff1a; 如果在第一步无法解决的的时候&#xff0c;那可能原因就是资源文件调用的错误&#xff0c;比如资源文件命名不规范&#xff0c;多余的资…

java link_Java Link类代码示例

import org.nodes.Link; //导入依赖的package包/类public static double sizeBetaCopying(DGraph graph, DGraph sub,List> occurrences, boolean resetWiring, int iterations, double alpha){int numThreads Runtime.getRuntime().availableProcessors();List> wiring…

go read text file into string array

http://stackoverflow.com/questions/5884154/golang-read-text-file-into-string-array-and-write 方法一 1 package main2 3 import (4 "bufio"5 "fmt"6 "log"7 "os"8 )9 10 // readLines reads a whole file into memory …

des加密 ios 和java_三重Des对称加密在Android、Ios 和Java 平台的实现

//// CommonFunc.m// PRJ_base64//// Created by wangzhipeng on 12-11-29.// Copyright (c) 2012年 com.comsoft. All rights reserved.//#import "MyBase64.h"//引入IOS自带密码库#import //空字符串#define LocalStr_None ""static const char en…

BZOJ2976 : [Poi2002]出圈游戏

首先模拟一遍得到n个同余方程&#xff0c;然后用扩展欧几里得求出最小的可行解即可&#xff0c;时间复杂度$O(n^2)$。 #include<cstdio> #define N 30 int n,i,j,k,x,y,a[N],b[N],d[N],ans; namespace Solve{ int flag1,k1,m0,d,x,y; int exgcd(int a,int b,int&x,in…

java awt 教程_JAVA教程 第五讲 AWT图形用户界面设计

5.1 用AWT生成图形化用户界面抽象窗口工具包AWT (Abstract Window Toolkit) 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集&#xff0c;AWT可用于Java的applet和applications中。它支持图形用户界面编程的功能包括&#xff1a; 用户界面组件&am…

从C# String类理解Unicode(UTF8/UTF16)

上一篇博客&#xff1a;从字节理解Unicode&#xff08;UTF8/UTF16)。这次我将从C# code 中再一次阐述上篇博客的内容。 C# 代码看UTF8 代码如下&#xff1a; string test "UTF-8你"; //把字符转换为 byte[] byte[] bytearray_UTF8 Encoding.UTF8.GetBytes(test)…

java mvc mvp_MVC和MVP设计模式

参考博客http://www.cnblogs.com/end/archive/2011/06/02/2068512.html####MVC模式M&#xff1a;model 模型V&#xff1a;view视图C&#xff1a;controller控制器>我们知道&#xff0c;所有的软件的构成主要有两部分&#xff0c;分别是用户交互入口(USER INTERFACE)和数据(D…