在C#中利用DirectX实现声音播放

    我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得?我也不知道。

 这里是展示最简单的DirectX播放声音的例子,我尽量省略了无关的代码。最后的代码只有19行,够简单了吧?

 准备工作:

 1.安装了DirectX SDK(有9个DLL文件)。这里我们只用到MicroSoft.DirectX.dll 和 Microsoft.Directx.DirectSound.dll

 2.一个WAV文件。(这样的文件比较好找,在QQ的目录里就不少啊。这里就不多说了。)名字叫SND.WAV,放在最后目标程序的同个目录下面

 开始写程序啦。随便用个UltraEdit就好了。

 1.引入DirectX 的DLL文件的名字空间:

using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;

 2.建立设备。在我们导入的Microsoft.DirectX.DirectSound空间中,有个Device的类。这个是表示系统中的声音设备。

Device dv=new Device();

 3.设置CooperativeLevel。因为windows是多任务的系统,设备不是独占的,所以在使用设备前要为这个设备设置CooperativeLevel。调用Device的SetCooperativeLevel方法:其中,第一个参数是一个Control,第二个参数是个枚举类型。

 在这个程序中,Control我随便弄了个参数塞进去(很汗吧!)。如果在windows程序中,可以用this代替。第二个参数就是优先级别,这里表示优先播放。

dv.SetCooperativeLevel((new UF()),CooperativeLevel.Priority);

 4.开辟缓冲区。对于上面的声音设备,他有个自己的缓冲区,叫主缓冲区。系统中,一个设备有唯一的主缓冲区。由于windows是多任务(又是这个!),所以可以有几个程序同时利用一个设备播放声音,所以每个程序都自己开辟一个二级缓冲区,放自己的声音。

 系统根据各个程序的优先级别,按照相应的顺序分别去各个二级缓冲区中读取内容到主缓冲区中播放。这里,我们为SND.WAV开辟一个缓冲区。

 其中,第一个参数表示文件名(傻瓜都看出来了!),第二个就是需要使用的设备。

SecondaryBuffer buf=new SecondaryBuffer(@"snd.wav",dv);

 5.接下来就可以播放啦。第一个参数表示优先级别,0是最低的。第2个参数是播放方式,这里是循环播放。

buf.Play(0,BufferPlayFlags.Looping);

 6.由于命令行程序没有消息循环,执行完代码就退出了,所以,我们需要暂停程序。

Console.Read();

 7.关键的部分已经完了,这里只是交代一下刚才的那个倒霉的new UF() 是什么东西。这个完全是为了应付SetCooperativeLevel的参数要求。我不知道这样做有什么附作用(各位如果因此把声卡烧了…………)

class UF:Form{}

 8.代码写完啦~~~。下面可以编译了,这里编译比较复杂点。

csc /r:directX\MicroSoft.DirectX.dll;directX\Microsoft.Directx.DirectSound.dll dxsnd.cs

 这里,我把2个DLL文件放在当前目录的directx目录下(这个是我自己建的,你只需要指出这2个文件的位置就可以了。)

 顺便把我的目录结构说明一下:

|
|--dxsnd.cs
|--snd.wav
|--<directx>
|
|--MicroSoft.DirectX.dll
|--Microsoft.Directx.dll

 下面是完整代码:

//dxsnd.cs
using System;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;
using System.Windows.Forms;
namespace test1
{
 class test
 {
  public static void Main(string [] args)
  {
   Device dv=new Device();
   dv.SetCooperativeLevel((new UF()),CooperativeLevel.Priority);
   SecondaryBuffer buf=new SecondaryBuffer(@"snd.wav",dv);
   buf.Play(0,BufferPlayFlags.Looping);
   Console.ReadLine();
  }
  class UF:Form{}
 }
}

时间: 2024-10-03 12:04:19

在C#中利用DirectX实现声音播放的相关文章

android中利用ImageView 图片循环播放

xml  代码如下 复制代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_par

DirectX编程:[初级]C#中利用DirectSound播放WAV格式声音[最少只要4句话]

  网上已经有很多朋友介绍过如何在C#中利用DirectSound来播放声音.今天自己试了下,发现真得很简单,对于初学者来说最简单不过了.只需要短短几句代码.其中关键的只要4句左右代码就OK了.       效果图如下 :             平台:VS.NET 2005 ,DirectX SDK(June 2008)       需要引用的外部DLL:Microsoft.DirectX.dll 和 Microsoft.DirectX.DirectSound.dll.       需要引用的

DirectX编程:C#中利用Socket实现网络语音通信[初级版本]

 [声明:本篇来源:http://www.cnblogs.com/stg609/archive/2008/11/19/1334544.html 作者:stg609]       现在时下的VOIP软件很多,比较有名的就是Skype,还有其它诸如UUcall. 快门等等.它们提供的功能除了网络上的语音通话外,还可以与固定电话.手机等通话.在本篇中主要介绍利用C#实现语音通信的基本方法.但是目前只实现了网 络上语音传输的基本功能,而且比较粗糙,没有采用什么算法来优化,所以大家千万不要期望过高.我写这

DirectX编程:[初级]C# 中利用 DirectSound 录音

花了一阵子,把DirectX安装后自带的帮助文件中的那部分关于DirectSound录音这块给看完了,顺便把那部分翻译成了中文,有些地方可能翻译的不是很通顺,不过总体上还是能看得懂的.查看中文翻译,建议大家在进行学习前可以先去看看.       期间也看了些别人的相关文章,感觉有点思路后就开始动手了,很高兴最后能顺利通过测试.不过我这个功能很简单,也不完善,只是最基本的可以录音.还待以后深入学习.       开发平台:VS.NET 2005 ,Windows XP SP2 ,DirectX S

系统中有多块声卡,C#编程中MediaPlayer控件可以将声音播放给指定的声卡吗?

问题描述 C#编程中,用MediaPlayer控件来播放网络上的流媒体,如何将声音播放给指定的声卡(我的系统中装有多块声卡)呢?请问该如何编程呢,MediaPlayer控件中有这样的函数吗?跪谢各位大侠了! 解决方案 解决方案二:你不能通过windows的驱动去操作.你可能只能去跟厂商联系,看看如何是用汇编语言.c语言跟板卡通讯.解决方案三:感觉比较复杂啊,能不能调用相关dll实现呢?

用JavaScript实现利用FLASH嵌入声音

javascript 本JavaScipt教程将让你感受到FLASH给您带来有声世界的无穷魅力.在开始本教程之前,我先介绍一下本教程涉及到的内容:隐藏嵌入的SWF. 播放流同步的SWF. 从指定的帧上开始流. 停止和播放流. 检查是否磁道在播放. 检查是否播放器准备好. 检查SWF转载的百分比.验证SWF是否完全装载好.检查播放器的版本号.设置最小的播放器版本号. 清除错误信息等等.好吧,开始我们的教程吧. 隐藏嵌入的SWF FlashSound的javascript API往网页插入一个Fla

用&amp;#106avascript实现利用FLASH嵌入声音

本JavaScipt教程将让你感受到FLASH给您带来有声世界的无穷魅力.在开始本教程之前,我先介绍一下本教程涉及到的内容:隐藏嵌入的SWF. 播放流同步的SWF. 从指定的帧上开始流. 停止和播放流. 检查是否磁道在播放. 检查是否播放器准备好. 检查SWF转载的百分比.验证SWF是否完全装载好.检查播放器的版本号.设置最小的播放器版本号. 清除错误信息等等.好吧,开始我们的教程吧. 隐藏嵌入的SWF FlashSound的JavaScript API往网页插入一个FlashSound对象,随

C#中使用DirectX实现视频播放

很多人第一次接触到DirectX大都是通过游戏,至于安装.升级DirectX的原因 无非是满足游戏运行的需要.Direct X其实是微软公司推出的一个为Windows平台 的多媒体API函数库,它提供标准接口来与显卡和声卡.输入设备等进行交互.如 果没有这组标准API函数库,那你就需要为每一种显卡.声卡的每个组合和每种类 型的键盘.鼠标和游戏杆编写不同的代码.这不又回到了以前的Dos时代.为了解 决这个问题,微软公司推出了DirectX.DirectX从具体的硬件中抽象出来,并且 将一组通用指令

实例-java中能不能添加声音

问题描述 java中能不能添加声音 各位,你好我想问一下java中能不能添加声音,我在网上看到能,但是我自己试过不行有谁可以给我一个实例啊?谢谢 解决方案 http://bbs.csdn.net/topics/340257858 解决方案二: java提供了对音频的支持的,可以在Applet中播放音频的.这里有个完整的实例参考:http://blog.csdn.net/sky_warmer/article/details/19324643 解决方案三: 在jdk7.0中的示例Applet中有播放