C# WPF_音频
播放WAV音频
在.NET中播放音频文件最简单的方式是使用 System.Media.SoundPlayer .
•只支持 WAV 音频文件•不支持同时播放多个声音•不能控制音频播放(音量和平衡等细节)
SoundPlayer
var player = new SoundPlayer();
player.SoundLocation = "test.wav";
player.Load(); // player.LoadAsync()
player.Play(); // player.PlaySync()暂停
SoundPlayerAction
SoundPlayerAction是对 SoundPlayer 进行了封装,始终是异步地播放声音。
<Button>
<Button.Content>Play Sound</Button.Content>
<Button.Style>
<Style>
<Style.Triggers>
<EventTrigger RountedEvent="Button.Click">
<EventTrigger.Actions>
<SoundPlayerAction Source="test.wav"/>
系统声音
如果想用简单的声音信号指示某个操作已经结束,或使用报警声音,可以使用 System.Media.SystemSounds 类。此类构建在 MessageBeep 这个 Win32 API函数的基础上,因此只能访问几个系统声音
•Asterisk•Beep•Exclamation•Hand•Question
SystemSounds.Beep.Play();
MediaPlayer类
当前除了最简单的声音,使用压缩的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类
MediaElement类是WPF元素,封装了 MediaPlayer类的全部功能。MediaElement元素可被直接放置到用户界面中,这在播放视频时会有用。
<!--Manula, Play, Pause-->
<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标记而不是代码来控制音频,可使用触发器和故事板完成该工作。
<!--没有使用Source指定源,而是使用MediaTimeline.Source属性-->
<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控制播放音频或视频文件的时间-->
<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();