C# WPF_音频

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();