C#中声音的播放主要有三种方法:

1.使用API函数。

2.使用SoundPlayer类播放。

3.使用DirectX进行播放。

一、使用API函数进行播放。

windows操作系统中的winmm.dll文件中封装了声音处理的函数。在C#中我们可以通过平台调用的方式使用这里边的API函数来播放声音。

下边的类中使用了PlaySound、sndPlaySound、mciSendString  3个API函数来播放声音。

其中mciSendString还可以播放mp3格式的声音。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Runtime.InteropServices;
namespace HuaXu
{
public static class WavPlayer
{
[DllImport("winmm.dll", SetLastError = true)]
static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);
[DllImport("winmm.dll", SetLastError = true)]
static extern long mciSendString(string strCommand,
StringBuilder strReturn,int iReturnLength, IntPtr hwndCallback);
[DllImport("winmm.dll")]
private static extern long sndPlaySound(string lpszSoundName, long uFlags); [Flags]
public enum SoundFlags
{
/// <summary>play synchronously (default)</summary>
SND_SYNC = 0x0000,
/// <summary>play asynchronously</summary>
SND_ASYNC = 0x0001,
/// <summary>silence (!default) if sound not found</summary>
SND_NODEFAULT = 0x0002,
/// <summary>pszSound points to a memory file</summary>
SND_MEMORY = 0x0004,
/// <summary>loop the sound until next sndPlaySound</summary>
SND_LOOP = 0x0008,
/// <summary>don’t stop any currently playing sound</summary>
SND_NOSTOP = 0x0010,
/// <summary>Stop Playing Wave</summary>
SND_PURGE = 0x40,
/// <summary>don’t wait if the driver is busy</summary>
SND_NOWAIT = 0x00002000,
/// <summary>name is a registry alias</summary>
SND_ALIAS = 0x00010000,
/// <summary>alias is a predefined id</summary>
SND_ALIAS_ID = 0x00110000,
/// <summary>name is file name</summary>
SND_FILENAME = 0x00020000,
/// <summary>name is resource name or atom</summary>
SND_RESOURCE = 0x00040004
} public static void Play(string strFileName)
{
PlaySound(strFileName, UIntPtr.Zero,
(uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_SYNC | SoundFlags.SND_NOSTOP));
}
public static void mciPlay(string strFileName)
{
string playCommand = "open " + strFileName + " type WAVEAudio alias MyWav";
mciSendString(playCommand, null, , IntPtr.Zero);
mciSendString("play MyWav", null, , IntPtr.Zero); }
public static void sndPlay(string strFileName)
{
sndPlaySound(strFileName, (long)SoundFlags.SND_SYNC);
}
}
}

其中SoundFlags枚举定义了各种播放的方式。

二、使用SoundPlayer播放声音。

System.Media名称空间下的类SoundPlayer 可以让我们很方便的播放wav波形声音文件。SoundPlayer类其实就是对winmm.dll文件中API函数的封装。

SoundPlayer类的使用很简单。如下:

                    SoundPlayer player = new SoundPlayer();
player.SoundLocation = "音乐文件名";
player.Load();
player.Play();

其中Play方法是异步方法,会在另一个线程中播放。如果我们有时候需要等声音播放完毕之后再进行下一步操作。即声音播放需要阻塞当前线程。就可以使用PlaySync()
方法。

SoundPlayer类的缺点:只能播放wav文件;在winxp下播放文件比较大或位率比较高的情况,PlaySync同步播放会有播放不完全的问题。

这个问题的产生是由于winmm.dll的版本问题引起的。在xp下winmm.dll的版本是5。在win7下是6。win7下就没有问题。如果要解决在

xp下播放不完全的问题。可以使用xp下的录音机打开声音文件,把声音文件另存为7kbit/s的位率格式,但这样声音效果就很差了。

三、使用DirectX进行播放。

首先要安装DirectX SDK。安装好之后,在C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0目录下有在.net下可以使用的dll文件。

首先引用添加引用Microsoft.DirectX.AudioVideoPlayback

using Microsoft.DirectX.AudioVideoPlayback;

然后实例化Audo类的对象,就可以播放包括mp3格式的音乐文件了。

                Audio audio = new Audio("hello.mp3");
audio.play();

转载http://www.cnblogs.com/chenjiahong/articles/2716552.html

c#播放声音文件的更多相关文章

  1. MFC使用Windows media player播放声音文件

    一.在需要播放声音的资源上添加控件 资源视图  . 选择添加控件的资源(如对话框).右键单击.插入ActiveX控件.调整你需要的控件属性并记录ID 二.在项目中添加播放声音的类 点击菜单中的项目.添 ...

  2. iOS 播放声音文件

    播放声音可以通过3中方式来完成. 1.AVAudioPlayer 使用简单方便,但只能播放本地音频,不支持流媒体播放. //初始化文件地址 NSBundle *bundle = [NSBundle m ...

  3. Winform_播放声音文件

    1.调用非托管的dll using System.Runtime.InteropServices;  //DllImport命名空间的引用 class test  //提示音 { [DllImport ...

  4. js 播放声音文件

    from:http://hi.baidu.com/xykking/item/7f64a04364e43ce4bdf45127 我在做项目的时候,也遇到了这个问题,可以灵活的使用下面的这两种方法,我使用 ...

  5. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  6. 将声音文件加入VC

    概述 VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,VC++是Windows ...

  7. iOS开发--音乐文件播放工具类的封装(包含了音效的封装)

    一.头文件 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface ...

  8. 几种C#实现播放声音的方法

    在这里介绍使用C#实现播放声音的几种方法,都是利用组件等方法来实现的,有兴趣的话可以看下. 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroS ...

  9. Windows Phone 8初学者开发—第20部分:录制Wav音频文件

    原文 Windows Phone 8初学者开发—第20部分:录制Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Develop ...

随机推荐

  1. poj 1195Mobile phones

    http://poj.org/problem?id=1195 #include <cstdio> #include <cstring> #include <algorit ...

  2. Windows8.1 preview硬盘安装(图解)

    本人小本系统是win7 32位的,想要装win8 64位 ,想直接镜像安装不可能,因为位数不同.U盘只有2G ,显然也放不下3.6G的win8系统.借助NT6 HDD Installer,可以在本地硬 ...

  3. 【HDOJ】1313 Round and Round We Go

    大数乘,果断java A了. import java.util.Scanner; import java.lang.StringBuilder; import java.math.BigInteger ...

  4. static用法一

    #include "stdafx.h" #include "string.h" struct student { int num; ]; char sex; } ...

  5. C# 多线程经典示例 吃苹果

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解. 示例概述: 下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈 ...

  6. Windows 已在 DImageProcess.exe 中触发一个断点。

    其原因可能是堆被损坏,这说明 DImageProcess.exe 中或它所加载的任何 DLL 中有 Bug. 原因也可能是用户在 DImageProcess.exe 具有焦点时按下了 F12. 输出窗 ...

  7. JS 实现显示和隐藏div(以百度地图为例)

    主要参考的文章:https://my.oschina.net/xsh1208/blog/215811,https://zhidao.baidu.com/question/568774688.html ...

  8. AFNetworking (3.1.0) 源码解析 <一>

    首先说一下AFNetworking的github地址:GitHub - AFNetworking/AFNetworking: A delightful networking framework for ...

  9. Android Studio 2.1.x 关联SDK API Source

    问题: 看图=>,当在android studio里ctrl+鼠标左键查看例如: TextUtils.isEmpty(content);这段代码的isEmpty方法的实现的时候经常就跑到如图所示 ...

  10. ActionScript通用开发框架

    ActionScript 3(简称as)自2006年诞生以来,出现了一大批很优秀框架.就我的知识领域,运用包括pureMVC.pushButton Engine(组件框架).Robotlegs.Ash ...