在.NET中播放音频文件最简单的方式是使用 System.Media.SoundPlayer.
var player = new SoundPlayer();
player.SoundLocation = "test.wav";
try
{
player.Load(); // player.LoadAsync()
player.Play(); // player.PlaySync()暂停
}
SoundPlayerAction是对 SoundPlayer 进行了封装,始终是异步地播放声音。
<Button>
<Button.Content>Play SoundButton.Content>
<Button.Style>
<Style>
<Style.Triggers>
<EventTrigger RountedEvent="Button.Click">
<EventTrigger.Actions>
<SoundPlayerAction Source="test.wav"/>
...
如果想用简单的声音信号指示某个操作已经结束,或使用报警声音,可以使用 System.Media.SystemSounds类。此类构建在 MessageBeep 这个 Win32 API函数的基础上,因此只能访问几个系统声音
SystemSounds.Beep.Play();
当前除了最简单的声音,使用压缩的MP3音频更加普遍,此时就需要用到 MediaPlayer 类。
private MediaPlayer player = new MediaPlayer();
private void cmdPlayWithMediaPlayer_Click(object sender, RoutedEventArgs e)
{
// 不会抛出异常
player.Open(new Uri("test.mp3", UriKind.Relative));
player.Play();
}
MediaElement类是WPF元素,封装了 MediaPlayer类的全部功能。MediaElement元素可被直接放置到用户界面中,这在播放视频时会有用。
<MediaElement Source="test.mp3" LoadedBehavior="Manual" Name="media"
MediaFailed="media_MediaFailed"/>
private void cmdPlay_Click(object sender, RoutedEventArgs e)
{
// Position属性来移动音频播放的位置
media.Position = TimeSpan.Zero;
// 如果此时 LoadedBehavior 的值不是 Manual,将收到异常
media.Play();
}
相比于 MediaPlayer ,使用MediaElement还可以使用XAML标记而不是代码来控制音频,可使用触发器和故事板完成该工作。
<MediaElement x:Name="media"/>
<Button>
<Button.Content>Click me to hear a sound.Button.Content>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<MediaTimeline Source="soundA.wav" Storyboard.TrargetName="media"/>
Storyboard>
...
当使用MediaElement元素作为MeidaTimeline对象的目标时,就不必再关心将LoadedBehavior和UnloadedBehavior属性设置为什么值。此时由WPF动画时钟驱动音频或视频。
可使用故事板控制 MediaElement元素的播放,暂停,重新开始以及停止播放。
<Window.Resources>
<Storyboard x:Key="MediaStoryboardResource">
<MediaTimeline Storyboard.TargetName="media" Source="test.mp3"/>
Storyboard>
Widnow.Resources>
<StackPanel Orientation="Horizontal">
<StackPanel.Triggers>
<EventTrigger RoutedEvent="ButtonBase.Click" SourceName="cmdPlay">
<EventTrigger.Actions>
<BeginStoryboard Name="MediaStoryboard"
Storyboard="{StaticResouce MedaiStoryboardResource}"/>
EventTrigger.Actions>
EventTrigger>
<EventTrigger RoutedEvent="ButtonBase.Click" SourceName="cmdStop">
<EventTrigger.Actions>
<StopStoryboard BeginStoryboardName="MediaStoryboard"/>
EventTrigger.Actions>
EventTrigger>
<EventTrigger RoutedEvent="ButtonBase.Click" SourceName="cmdPause">
<EventTrigger.Actions>
<PauseStoryboard BeginStoryboardName="MediaStoryboard"/>
EventTrigger.Actions>
EventTrigger>
StackPanel.Triggers>
<MediaElement Name="media"/>
<Button Name="cmdPlay" Content="Play"/>
<Button Name="cmdStop" Content="Stop"/>
<Button Name="cmdPause" Content="Pause"/>
StackPanel>
语音合成和语音识别两个功能通过 System.Speech.dll 程序集中的类提供支持,需要手动为项目添加该引用。
PromptBuilder prompt = new PromptBuilder();
prompt.AppendText("How ");
prompt.AppendText("are ", PromptEmphasis.Strong);// 强调
prompt.AppendText("you");
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
synthesizer.Speak(prompt);
语音识别将用户朗读的音频转换为文本,是Windows操作系统内置的功能。
SpeechRecognizer recognizer = new SpeechRecognizer();
recognizer.SpeechRecognized += recognizer_SpeechReconized;
private void recognizer_SpeechReconized(object sender, SpeechRecognizedEventArgs e)
{
MessageBox.Show("You said:" + e.Result.Text);
}