首页 > 编程语言 >C#同时播放两首音乐

C#同时播放两首音乐

时间:2023-01-25 22:32:12浏览次数:73  
标签:音效 C# System DirectSound 两首 播放 Microsoft DirectX


       说同时播放两首音乐有点不妥,因为这样没什么意义。今天我想说的是在播放背景音乐的同时,可以播放音效,类似于游戏中的声音。我们都知道在游戏中不仅有背景音乐,还有各种特殊的声音,其实就是音效啦。我在做课程设计时,正好也需要实现类似游戏的这种功能,心想这应该不难吧,做了才知道并非易事。

起初我是用System.Media.SoundPlayer来同时播放两首音乐,结果总是只听到一首歌的声音,网上查了下,

原来System.Media.SoundPlayer是不能同时播放两首歌曲的(注:我开了两个线程来播放也是不行)。既然不行,那只好寻找其它方法了,找了很久,网上的资料零零散散,具体介绍的没有一个(至少我没发现)。

经过努力,我实现了用C#在播放背景音乐的同时可以播放音效。我实现的思路如下:

1)用System.Media.SoundPlayer 来播放背景音乐

2)用Microsoft.DirectX.DirectSound 来播放音效(其实吧,按网上的说法,用DirectSound来同时播放两首音乐是完全可以的,这个我没有测试,有兴趣的童鞋不妨一试)


实现过程如下:

1)音乐资源文件的添加和System.Media.SoundPlayer的使用,请看我以下这篇文章,这里不再敖述。

2)这里主要介绍Microsoft.DirectX.DirectSound的使用方法

我测试时使用的DirectX版本为DirectX 10,其下载地址为:

​http://download.microsoft.com/download/F/1/7/F178BCE4-FA19-428F-BB60-F3DEE1130BFA/DXSDK_Feb10.exe​

下载DirectX 10,然后安装完DirectX 10后,我们就可以进到VS2008中对其进行引用了。


展开-->>解决方案资源管理器-->>TestCSharp(这是我的解决方案的名称,请灵活应变)-->>引用-->右键-->添加引用

//截图如下

C#同时播放两首音乐_Assembly


//在添加引用窗口中选择浏览,然后找到以下目录:

C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0

找到以上目录后,在该目录里面找到以下连个dll文件,将它们添加到工程中来

1.)Microsoft.DirectX.DirectSound.dll 2.)Microsoft.DirectX.dll

//呵呵,这两个dll文件我已经上传到网上了,下载地址为

//截图如下

C#同时播放两首音乐_解决方案_02


//添加完后,引用中就会出现Microsoft.DirectX.DirectSound.dllMicrosoft.DirectX.dll

如下图所示:

C#同时播放两首音乐_System_03

接下来我们就可以写代码来用Microsoft.DirectX.DirectSound来播放音效或音乐了。

//我程序截图如下

C#同时播放两首音乐_Assembly_04


程序代码如下(别忘了引入命名空间:using Microsoft.DirectX.DirectSound)

//程序启动时...
private void Form1_Load(object sender, EventArgs e)
{
System.Reflection.Assembly assembly;
System.Media.SoundPlayer sp;
assembly = System.Reflection.Assembly.GetExecutingAssembly();
sp = new System.Media.SoundPlayer(global::TestCSharp.Properties.Resources.bkMusic);
sp.PlayLooping();
}

//按钮【播放音效】
private void btnPlay_Click(object sender, EventArgs e)
{
SecondaryBuffer secBuffer;//缓冲区对象
Device secDev;//设备对象
secDev = new Device();
secDev.SetCooperativeLevel(this, CooperativeLevel.Normal);//设置设备协作级别
secBuffer = new SecondaryBuffer(global::TestCSharp.Properties.Resources.YinXiao, secDev);//创建辅助缓冲区
secBuffer.Play(0, BufferPlayFlags.Default);//设置缓冲区为默认播放
}




​​




标签:音效,C#,System,DirectSound,两首,播放,Microsoft,DirectX
From: https://blog.51cto.com/softo/6023027

相关文章

  • 解决C#用BindingSource控件绑定数据源时产生的错误
    今天在VS2008中用BindingSource控件绑定SQL2005数据库时出现了一个错误,提示信息如下:错误信息:未能从程序集Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage,V......
  • VS2008使用Access数据库,不能更新数据库中数据的原因
    参考文章:​​http://zhidao.baidu.com/question/150772502.html​​本文关键词:VS2008运行工程,Access数据库中的数据更新不了,数据库中的数据被还原,数据添加不了,往数据库添......
  • Day01 - HTML&CSS
    1.html介绍简介html叫超文本标记语言,是开发网页的语言html中的标签大多数都是成对出现的,格式:<标签名></标签名>html的定义HTML的全称为:HyperTextMark-upLa......
  • Ceph MDS服务的多主一备高可用架构
      cephmds高可用  Cephmds(metadataservice)作为ceph的访问入口,需要实现高性能及数据备份,而MDS支持多MDS结构,甚至还能实现类似于rediscluster的多主从结......
  • C++面向对象
    封装继承多态允许将子类类型的指针赋值给父类类型的指针多态的实现方式覆盖override,重载overload覆盖是子类重新定义父类的虚函数重载是指允许存在多个同名函数,而这......
  • ThinkPHP函数详解:cache方法
    cache方法是3.0版本开始新增的缓存管理方法。注意:3.1.2版本后因cache方法并入原S方法,所以cache方法不再建议使用,用S方法即可。cache用于缓存设置、获取、删除操作用......
  • 在CListView中添加点击右键消息响应函数!
    //简单几步就可以了,整个过程描述和截图如下所下:用ClassWizard中的MessageMaps功能添加对NM_RCLICK消息的响应函数://添加成功后,直接编辑函数代码即可voidCRightMenuView:......
  • VC下这样创建实例m_pRecordset.CreateInstance(_uuidof(Connection))不一定成功!...
    //昨天在打开数据库的记录集时,出现了一个错误,错误提示为无效的指针类型,上网查了一下,原来是我的//的程序在创建实例时,出现了错误,呵呵,以前我都是这样创建实例的:m_pRecordset.......
  • 注意:Java中Switch语句的参数类型-_-!...
    Java中不能将float和doublu类数据作为switch(...)中的表达式!其它语言有待验证-_-!...验证代码如下:publicclasstest{publicstaticvoidmain(String[]args){floatb......
  • C#输出SQL 2005表中所有记录!...
      主要代码如下:    //连接字符串stringstrConn="userid=sa;password=123456;initialcatalog=MyDb;Server=192.168.47.144,1433;ConnectTimeout=10";......