網上已經有很多朋友介紹過如何在C#中利用DirectSound來播放聲音。今天自己試了下,發現真得很簡單,對于初學者來說最簡單不過了。隻需要短短幾句代碼。其中關鍵的隻要4句左右代碼就OK了。
效果圖如下 :
平台:VS.NET 2005 ,DirectX SDK(June 2008)
需要引用的外部DLL:Microsoft.DirectX.dll 和 Microsoft.DirectX.DirectSound.dll。
需要引用的命名空間:using Microsoft.DirectX.DirectSound。
要實作播放效果的大緻步驟:1 建立播放裝置對象;2 建立緩沖區對象;3 設定緩沖區協作級别;4.播放緩沖區。
因為比較簡單,是以大家直接看代碼吧。其中"Play"按鈕主要的就四句話,實作播放效果,但它的緩沖區資訊是預設的。"GlobalPlay"按鈕通過 設定緩沖區資訊來對緩沖區做調整,讓播放可以在失去焦點的時候繼續播放。除了播放功能外,還可以控制音量和聲道。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
//引用的命名空間
using Microsoft.DirectX.DirectSound;
namespace MyVoice
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
}
private SecondaryBuffer secBuffer;//緩沖區對象
private Device secDev;//裝置對象
private void button1_Click(object sender, EventArgs e)
openFileDialog1.Filter = "(*.*)|*.*|(.wav)|*.wav";
DialogResult dlgResult = openFileDialog1.ShowDialog();
if (dlgResult == DialogResult.OK)
{
textBox1.Text = openFileDialog1.FileName;
}
private void button2_Click(object sender, EventArgs e)
if (textBox1.Text.Length > 0)
secDev = new Device();
secDev.SetCooperativeLevel(this, CooperativeLevel.Normal);//設定裝置協作級别
secBuffer = new SecondaryBuffer(textBox1.Text, secDev);//建立輔助緩沖區
secBuffer.Play(0, BufferPlayFlags.Looping);//設定緩沖區為循環播放
private void button3_Click(object sender, EventArgs e)
if (textBox1.Text.Length>0)
BufferDescription buffDes = new BufferDescription();
buffDes.GlobalFocus = true;//設定緩沖區全局擷取焦點
buffDes.ControlVolume = true;//指明緩沖區可以控制聲音
buffDes.ControlPan = true;//指明緩沖區可以控制聲道平衡
secBuffer = new SecondaryBuffer(textBox1.Text, buffDes, secDev);//建立輔助緩沖區
private void button4_Click(object sender, EventArgs e)
if (secBuffer != null)
secBuffer.Stop();
private void trackBar1_Scroll(object sender, EventArgs e)
secBuffer.Volume = -trackBar1.Value * 400;//音量為0表示最大的音量,是以設定時必須為負。
private void trackBar2_Scroll(object sender, EventArgs e)
if (trackBar2.Value == 0)
{
secBuffer.Pan = Convert.ToInt32(Pan.Left);//左聲道
}
else if (trackBar2.Value == 2)
secBuffer.Pan = Convert.ToInt32(Pan.Right);//右聲道
else
secBuffer.Pan = Convert.ToInt32(Pan.Center);
}
}
轉自 http://www.cnblogs.com/stg609/archive/2008/10/27/1320375.html