1. 程式人生 > >C#播放背景音樂的五種方法

C#播放背景音樂的五種方法

Speech

speech是一個朗讀器,我們寫一個文字text或者stringspeech可以朗讀發音,支援非同步操作使用方便,推薦使用。

使用.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函式來播放聲音。

下邊的類中使用了PlaySoundsndPlaySoundmciSendString 3個API函式來播放聲音。

其中mciSendString還可以播放mp3格式的聲音。
SoundPlayer類的使用很簡單

SoundPlayer player = new SoundPlayer();
player.SoundLocation = "音樂檔名";
player.Load();
player.Play();

其中Play方法是非同步方法,會在另一個執行緒中播放。如果我們有時候需要等聲音播放完畢之後再進行下一步操作。

即聲音播放需要阻塞當前執行緒。就可以使用PlaySync()方法。

SoundPlayer類的缺點:只能播放wav檔案;在winxp下播放檔案比較大或位率比較高的情況,PlaySync同步播放會有播放不完全的問題。

這個問題的產生是由於winmm.dll的版本問題引起的。在xpwinmm.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