XNA 3.0 MediaPlayer做個簡單的音樂MP3播放器!

摘要:XNA 3.0 MediaPlayer做個簡單的音樂MP3播放器!

之前有跟大家介紹過XNA3.0的一些新功能

像是新增的SoundEffect的API,以及將遊戲Depoly到ZUNE上面等。

今天要跟大家說的是MediaPlayer這個API

之前有跟大家介紹過XNA3.0的一些新功能

像是新增的SoundEffect的API,以及將遊戲Depoly到ZUNE上面等。

今天要跟大家說的是MediaPlayer這個API

首先做法都是依樣,我可以將我的MP3音樂增加到Content的虛擬目錄中,如下圖

上面在Content的虛擬目錄夾當中,我加入了一首test_music的mp3歌曲。

在這邊跟soundeffect不同的地方是,在屬性的地方,這邊使用的processor是Song processor。

在程式碼的部份我們需要加入Song這個物件,等等用來儲存Content處理過後分析得到的音樂資訊。

EX: Song music;

在LoadContent的部分打入以下指令,就可以完成簡單的音樂播放。

music = Content.Load<Song>("test_music");

MediaPlayer.Play(music);

編譯過後就可以聽到歌曲。

PS1 : 如果你在編譯過後沒有聽到音樂,請先檢查是否有將喇叭打開或是調成靜音,如果都確認過後還是沒有聲音,請從新執行。

PS2 : 如果你在Windows Game的專案無法直接使用MediaPlayer的類別,請先新增一個XBOX360 or Zune的遊戲專案,之後再將專案轉換成Windows專案即可(部分使用者可能會發生無法在Windows Game使用MediaPlayer類別,請依照上述方法去做)。

接下來有一些可以提的就是,SoundEffect跟MediaPlayer的使用時機。

自從3.0一出以後,我後來發現這樣XACT好像變的有點無用武之地...

XACT提供很好的音效處理的部分,可是對於一般的遊戲而言,可能使用XACT的部分就是播放背景音樂或是一些簡單的音效。

很少用XACT使用像是增加音效的播放平率那些控制等。

同時XACT又有很大的缺點就是匯入的音樂一定要是WAV檔案...

同時,壓縮方式又是PCM,幾乎是無損的壓縮方式,這樣音樂容量跟原本是差不多的。

雖然XACT3.0有提供比較好的壓縮方式,就是提供WMA壓縮,可是XNA3.0的部分,XACT仍然是2.0的版本。

這次新增這兩個強而有力的API我想使用XACT的使用者或許會變少吧@@"

 

使用SoundEffect的時機,就是在播放音效的部分...

有用過這個API的使用者應該知道,這個類別提供兩個主要的方法Play和Dispose。

Play的部份就是播放,但是沒有暫停的功能,雖然Play有三個Overloading可是仔細觀察的話可以看到都是運用在音效上面比較實際。

相較於MediaPlayer的部分,他提供Play、Stop、Resume、Pause這些功能,結合MediaState就可以製作出簡單的播放器了。

所以...   XACT = SoundEffect + MediaPlayer

這是給我的感覺XD

PS 本次Song Processor所編意出來的檔案是wma檔並非原本的XNB,壓縮率為192KBPS

以下是完整的程式碼的部分,這邊不提供歌曲,有興趣的使用者可以隨便找WAV、MP3、WMA的音樂格式來玩看看。

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using Microsoft.Xna.Framework;
05 using Microsoft.Xna.Framework.Audio;
06 using Microsoft.Xna.Framework.Content;
07 using Microsoft.Xna.Framework.GamerServices;
08 using Microsoft.Xna.Framework.Graphics;
09 using Microsoft.Xna.Framework.Input;
10 using Microsoft.Xna.Framework.Media;
11 using Microsoft.Xna.Framework.Net;
12 using Microsoft.Xna.Framework.Storage;

13
14 namespace WindowsGame3
15 {
16     public class Game1 : Microsoft.Xna.Framework.Game
17     {
18         GraphicsDeviceManager graphics;
19         SpriteBatch spriteBatch;
20
21         Song music;
22
23         KeyboardState old, current;
24
25         public Game1()
26         {
27             graphics = new GraphicsDeviceManager(this);
28             Content.RootDirectory = "Content";
29         }

30         protected override void Initialize()
31         {
32             old = current = Keyboard.GetState();
33           
34             base.Initialize();
35         }

36         protected override void LoadContent()
37         {
38             spriteBatch = new SpriteBatch(GraphicsDevice);
39
40             music = Content.Load<Song>("test_music");
41             MediaPlayer.Play(music);
42         }

43         protected override void UnloadContent()
44         {
45         }

46         protected override void Update(GameTime gameTime)
47         {
48             if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
49                 this.Exit();
50
51             old = current;
52             current = Keyboard.GetState();
53
54             if (current.IsKeyDown(Keys.P)&&old.IsKeyUp(Keys.P))
55             {
56                 if (MediaPlayer.State == MediaState.Playing)
57                     MediaPlayer.Pause();
58                 else if (MediaPlayer.State == MediaState.Paused)
59                     MediaPlayer.Resume();
60                 else
61                     MediaPlayer.Play(music);
62             }

63
64             if (current.IsKeyDown(Keys.S)&&old.IsKeyUp(Keys.S))
65             {
66                 if (MediaPlayer.State == MediaState.Playing)
67                 {
68                     MediaPlayer.Stop();
69                 }

70             }

71
72             base.Update(gameTime);
73         }

74         protected override void Draw(GameTime gameTime)
75         {
76             GraphicsDevice.Clear(Color.CornflowerBlue);
77
78             base.Draw(gameTime);
79         }

80     }

81 }