WPF_20_音频

播放WAV音频

在.NET中播放音频文件最简单的方式是使用 System.Media.SoundPlayer.

  • 只支持 WAV 音频文件
  • 不支持同时播放多个声音
  • 不能控制音频播放(音量和平衡等细节)

SoundPlayer

var player = new SoundPlayer();
player.SoundLocation = "test.wav";
try
{
    player.Load(); // player.LoadAsync()
    player.Play(); // player.PlaySync()暂停
}

SoundPlayerAction

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函数的基础上,因此只能访问几个系统声音

  • 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元素可被直接放置到用户界面中,这在播放视频时会有用。


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

我的公众号 HelloProgram

WPF_20_音频_第1张图片

你可能感兴趣的:(WPF,wpf,音视频,microsoft)