C#播放背景音樂的五種方法
Speech
speech
是一個朗讀器,我們寫一個文字text
或者string
,speech
可以朗讀發音,支援非同步操作使用方便,推薦使用。
使用.NET類庫和系統API:
using System.Speech.Synthesis;
SpeechSynthesizer synth = new SpeechSynthesizer();
synth.SpeakAsync(msg);
com元件speech-Microsoft speech object Library
要載入COM元件:Microsoft speech object Library
using SpeechLib;
SpeechSynthesizer synth = new SpeechSynthesizer();
synth.SpeakAsync(msg);
使用委託代理:
delegate void MyDelegate(string content);
string content="";
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
//點選開始按鈕
private void btnRead_Click(object sender, RoutedEventArgs e)
{
content = textBoxContent.Text;
MyDelegate myDelegate = new MyDelegate(speakParagh);
//非同步呼叫委託
myDelegate.BeginInvoke(content,new AsyncCallback(Completed), null);
//在啟動非同步執行緒後,主執行緒可以繼續工作而不需要等待
}
private void speakParagh(string text)
{
synthesizer.Speak(text);
}
//朗讀結束後釋放資源
private void Completed(IAsyncResult result)
{
synthesizer.SpeakAsyncCancelAll();
}
利用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();
我們安裝了DirectX SDK(有9個DLL檔案)
這裡我們只用到MicroSoft.DirectX.dll和 Microsoft.Directx.DirectSound.dll
引入DirectX 的DLL檔案的名字空間:
using Microsoft.DirectX;
usingMicrosoft.DirectX.DirectSound;
建立裝置
Device dv=newDevice();
設定CooperativeLevel。因為windows是多工的系統,裝置不是獨佔的
SecondaryBufferbuf=new SecondaryBuffer(@"snd.wav",dv);
開闢緩衝區SecondaryBufferbuf=new SecondaryBuffer(@”snd.wav”,dv);
接下來就可以播放啦。第一個引數表示優先級別,0是最低的。第2個引數是播放方式,這裡是迴圈播放。
buf.Play(0,BufferPlayFlags.Looping);
使用API函式進行播放SoundPlayer
windows
作業系統中的winmm.dll
檔案中封裝了聲音處理的函式。在C#
中我們可以通過平臺呼叫的方式使用這裡邊的API函式來播放聲音。
下邊的類中使用了PlaySound
、sndPlaySound
、mciSendString
3個API函式來播放聲音。
其中mciSendString還可以播放mp3格式的聲音。
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
的位率格式,但這樣聲音效果就很差了。
System.Media.SoundPlayersndPlayer = newSystem.Media.SoundPlayer(Application.StartupPath[email protected]"/pm3.wav");
sndPlayer.PlayLooping();
其他使用方法
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, 0, IntPtr.Zero);
mciSendString("play MyWav", null, 0, IntPtr.Zero);
}
public static void sndPlay(string strFileName)
{
sndPlaySound(strFileName, (long)SoundFlags.SND_SYNC);
}
}
}
利用Windows Media Player
新建一個C#
的Windows Form
工程(Windows
應用程式),並且定義兩個選單按鈕(menuItem1
,menuItem2
)。
選擇選單中的“工具”中的“自定義工具箱(新增/移除工具箱項)”,在自定義工具箱的視窗中,點選展開“COM 元件”項,選中“WindowMedia Player”選項。確定後在“工具箱”中便會出現“Windows Media Player”這一項,然後再將其拖至Form上,調整大小,系統在“引用”中自動加入了對此dll的引用,AxMediaPlayer就是我們使用的 Namespace與class。
在屬性欄中設定好此控制元件的一些屬性,為了方便,這裡我把AutoStart設定成為true(其實預設是true),只要FileName被設定(打開了檔案),則檔案將會自動播放。完整程式碼如下:
private voidmenuItem1_Click(object sender, System.EventArgs e)
{
OpenFileDialogofDialog = new OpenFileDialog();
ofDialog.AddExtension= true;
ofDialog.CheckFileExists= true;
ofDialog.CheckPathExists= true;
//the nextsentence must be in single line
ofDialog.Filter= "VCD檔案(*.dat)|*.dat|Audio檔案(*.avi)|*.avi
|WAV檔案(*.wav)|*.wav|MP3檔案(*.mp3)|*.mp3|所有檔案 (*.*)|*.*";
ofDialog.DefaultExt= "*.mp3";
if(ofDialog.ShowDialog()== DialogResult.OK)
{
// 2003一下版本 方法this.axMediaPlayer1.FileName = ofDialog.FileName;
this.axMediaPlayer1.URL=ofDialog.FileName;//2005用法
}
}
這裡使用的是微軟的播放器,大家也可以試試Winamp的控制元件,如果你只需要播放聲音而不需要顯示,你只要把AxMediaPlayer的Visible屬性設定為false就可以了。
相關推薦
C#播放背景音樂的五種方法
Speech speech是一個朗讀器,我們寫一個文字text或者string,speech可以朗讀發音,支援非同步操作使用方便,推薦使用。 使用.NET類庫和系統API: using System.Speech.Synthesis;
C++記憶體分配的五種方法 與 c++記憶體問題
在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。 堆,就是那些由new分配的記憶體塊,他們的釋放編譯
C#播放聲音【六種方法】
C#中聲音的播放主要有六種方法: 1.播放系統事件聲音 2.使用SoundPlayer 3.使用API函式播放 4.使用axWindowsMediaPlayer的COM元件來播放 5.Microsoft speech object Library 6.使用directX
c#後臺執行js的五種方法
StringBuilder sb = new StringBuilder(); sb.Append("<script>"); sb.Append("ClientScriptRegisterStartupScript()"); sb.
C++小點之範型演算法自定義比較函式的五種方法
零:使用STL自帶的函式(less與greater) vector<int> v{45,2,5,8454,34,68421,5,84,1,5}; sort(v.begin() ,v.end(),less<int>(
父級塌陷清除浮動的五種方法
沒有 高度 overflow left 結束 方法 子元素 添加 block 在文檔流中,若父元素未設置高度,那麽父元素的高度默認是被子元素撐開的,即子元素多高,父元素就有多高。但是當子元素設置浮動之後,子元素就會完全脫離文檔流,父元素還在文檔流中,此時父元素的高度就沒有子
詳解PHP實現定時任務的五種方法
清理 toolbar 路徑 頁面 文檔 errors conf star 包含 定時運行任務對於一個網站來說,是一個比較重要的任務,比如定時發布文檔,定時清理垃圾信息等,現在的網站大多數都是采用PHP動態語言開發的,而對於PHP的實現決定了它沒有Java和.Net這種A
想讓容器更快?這五種方法您必須知道!
之一 需要 處理 配額 應該 最大的 單詞 lin 有助於 容器的賣點之一是容器化應用程序的部署速度通常比虛擬機快,且性能更佳。 雖然容器的默認速度比其他基礎設施快,這並不意味著沒有辦法讓它們更快。本文將演示如何通過優化Docker容器鏡像構建時間、性能和資源消耗,來讓容器
JS中數組去重的五種方法
func 大量 環比 -- war 重新 pan 選擇 nbsp 數組去重方法 方法一:運用splice()方法和雙層for循環(有點類似選擇排序) function norepeat(arr){
OpenVZ架構VPS安裝BBR的五種方法(UML-LKL-LKL_Rinetd)
用戶 所見 unit 系統 nor hub rinetd 0.0.0.0 http OpenVZ架構雲主機部署BBR的五種方式(UML/LKL/LKL_Rinetd) 簡介 日前OpenVZ部署BBR可謂火氣酷熱。可樂一向沒寫教程,今日就把伏筆VPS所見到的做成集中寫成文章
天天 Java、C/C++,可這五種編程語言你知道嗎?
計算機 scrip rip 生存 腳本 價值 本質 號稱 c++ "適者生存,優勝劣汰”,編程語言同樣適用。 世界上有超過 1500 種編程語言,雖然本質上都是對於最底層 0 與 1 的抽象和封裝,但是卻沒有哪一種編程語言可以解決所有的問題。當有新的問題領域出現時
頑石系列:CSS實現垂直居中的五種方法
如果 -c align 大於 lock shu 彈性 ext explorer 頑石系列:CSS實現垂直居中的五種方法 在開發過程中,我們可能沿用或者試探性地去使用某種方法實現元素居中,但是對各種居中方法的以及使用場景很不清晰。參考的內容鏈接大概如下: 行內元素:htt
JavaScript 數字前補“0”的五種方法
JavaScript中的數字是沒有前置0的,因此需要我們自己進行操作來新增前置0,而且還得轉換成字串。 <html> <body> <script> //迭代方式實現 function padding1(num, length) {
在 Java 中初始化 List 的五種方法
在 Java 中初始化 List 的五種方法 1.構造 List 後使用 List.add 初始化 2.使用 {{}} 雙括號語法 3.使用 Arrays.asList 4. 使用 Stream (JDK8) 5. 使用 Lists (JDK9)
Flash迴圈播放背景音樂+停止+播放外部載入檔案
1、 迴圈播放背景音樂+播放外部載入檔案 import flash.media.SoundChannel; import flash.media.Sound; import flash.net.URLLoader; import flash.events.Event; //背景音樂 var s
關於清除浮動的五種方法
清除浮動的本質:為了解決父級元素印子級浮動引起內部高度為0的問題。 方式1:額外標籤法(w3c推薦的方法): 在最後一個浮動標籤後,新新增一個標籤 優點:通俗易懂,書寫方便。 缺點:不推薦使用,新增許多無意義的標籤,結構化較差。 .clear{ clear:b
Java 字串拼接 五種方法的效能比較分析 “+”、contact、join、append
一、五種方法分析: 1. 加號 “+” 2. String contact() 方法 3. StringUtils.join() 方法 4. StringBuffer append() 方法 5. StringBuilder append() 方法 二、優劣勢分析 開
天天 Java、C/C++,可這五種程式語言你知道嗎?
"適者生存,優勝劣汰”,程式語言同樣適用。 世界上有超過 1500 種程式語言,雖然本質上都是對於最底層 0 與 1 的抽象和封裝,但是卻沒有哪一種程式語言可以解決所有的問題。當有新的問題領域出現時,就需要創造新的程式語言來適配它。這也就導致了不同的計算機語言擁有不同的“個性”——除去 Python、Jav
防止SQL注入的五種方法 防止SQL注入的五種方法
防止SQL注入的五種方法 一、SQL注入簡介 SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師程式設計時的疏忽,通過SQL語句,實現無帳號登入,甚至篡改資料庫。 二、SQL注
斐波那契數列介紹及Python中五種方法斐波那契數列
Q:斐波那契數列為什麼那麼重要,所有關於數學的書幾乎都會提到? A:因為斐波那契數列在數學和生活以及自然界中都非常有用。 1. 斐波那契數列 概念引入 斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家列昂納多·斐波那契(Leonar