摘要: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的音樂格式來玩看看。
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 WindowsGame315
{16
public class Game1 : Microsoft.Xna.Framework.Game17
{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
else61
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
}
using