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 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();
recognizer.SpeechRecognized += recognizer_SpeechReconized;

private void recognizer_SpeechReconized(object sender, SpeechRecognizedEventArgs e)
{
    MessageBox.Show("You said:" + e.Result.Text);
}
我的公众号 HelloProgram

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值