Dziś temat multimediów. WPF jako nastawiony na interface użytkownika ma dużo do powiedzenia w tej kwestii. Zacznijmy zatem po kolei przyglądać się co mamy do dyspozycji.
SoundPlayer
To najprostsza klasa, którą mamy do dyspozycji jeśli chcemy odtworzyć dźwięki.
SoundPlayer player = new SoundPlayer(“plik.wav”);
player.Play();
Ze względu na swoją prostotę ma też swoje ograniczenia.
-
odtwarza tylko pliki .wav
-
nie ma wsparcia dla wielu dźwięków odtwarzanych jednocześnie
-
nie ma możliwości zmiany głośności
SystemSounds
Jeśli chcemy odegrać proste dźwięki systemowe, możemy skorzystać z tej klasy. definiuje ona kilka podstawowych dźwięków, każdy z których udostępnia metodę Play.
SystemSounds.Asterisk.Play();
SoundPlayerAction
Aby umożliwić deklaratywne odtwarzanie dźwięków powstała ta klasa. Dzięki niej możemy bezpośrednio w XAMLu zdefiniować jaki dźwięk ma zostać odgrany, gdy jakieś zdarzenie zajdzie. Zdefiniujmy odtwarzanie pliku, gdy przycisk zostanie naciśnięty:
<Button Content=”play”>
<Button.Triggers>
<EventTrigger RoutedEvent=”Button.Click”>
<EventTrigger.Actions>
<SoundPlayerAction Source=”click.wav” />
EventTrigger.Actions>
EventTrigger>
Button.Triggers>
Button>
MediaPlayer
To klasa dużo bardziej rozbudowana niż wspomniany wcześniej SoundPlayer. Nie tylko wspiera więcej formatów niż poprzednik (audio i wideo) to dodatkowo posiada funkcje umożliwiające sterowanie odtwarzanym zasobem jak i odpowiednią jego konfigurację – np. przewijanie, regulacja głośności, pobranie długości klipu itp. Jak tego użyć. Wyłącznie z kodu:
MediaPlayer player = new MediaPlayer();
player.Open(new Uri(“roar.wma”, UriKind.Relative));
player.Play();
Tak jak wspomniałem, MediaPlayer ma dosyć duże możliwości, ale jest używalna tylko z kodu. Aby wykorzystać pełną moc XAML’a musimy skorzystać z następnych klas.
MediaElement oraz MediaTimeline
MediaElement to XAMLowy odpowiednik klasy MediaPlayer. Umożliwia nam te sam właściwości a przy okazji jest dostępny jako element języka XAML.
<StackPanel>
<MediaElement Source=”roar.wma” />
StackPanel>
MediaTimeline natomiast, jest tym dla klasy MediaElement czym SoundPlayerAction jest dla SoundPlayer. Możemy zatem użyć jej w eventach i animacjach.
<MediaElement x:Name=”audio” />
<Button Content=”Hover”>
<Button.Triggers>
<EventTrigger RoutedEvent=”Button.MouseEnter”>
<BeginStoryboard x:Name=”playStoryboard”>
<Storyboard>
<MediaTimeline Source=”roar.wma” Storyboard.TargetName=”audio” />
Storyboard>
BeginStoryboard>
EventTrigger>
<EventTrigger RoutedEvent=”Button.Click”>
<StopStoryboard BeginStoryboardName=”playStoryboard” />
EventTrigger>
Button.Triggers>
Button>
Wideo
Do wideo używamy ostatnio omawianej klasy MediaElement jednak w przypadku wideo, mamy do dyspozycji kilka dodatkowych właściwości, które warto omówić.
Możemy dla przykładu przyciąć wideo oraz wyświetlać je z półprzeźroczystością.
<Button Content=”I’m below the video” />
<MediaElement x:Name=”video” Source=”walker.wmv” Opacity=”0.7″ >
<MediaElement.Clip>
<EllipseGeometry Center=”80,80″ RadiusX=”180″ RadiusY=”180″ />
MediaElement.Clip>
MediaElement>
Możemy też reagować na błędy związane z danymi za pomocą eventu MediaFailed.
Speech
WPF daje nam też możliwość zamiany tekstu w mowę oraz operację odwrotną czyli rozpoznawanie mowy i zamianę jej na formę tekstową. Aby skorzystać z tej funkcjonalności należy dodać do projektu System.Speech.dll.
Aby zmusić naszą aplikcję do wypowiedzenia pierwszych słów, należy skorzystać z klasy SpeechSynthesizer.
SpeechSynthesizer speech = new SpeechSynthesizer();
speech.Speak(“I’m talking”);
Można także robić to asynchronicznie za pomocą funkcji SpeakAsync. Oczywiście oprócz tego mamy jeszcze dużo więcej możliwości jak chociażby wybór głosu.
speech.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Teen);
Oczywiście odpowidnie głosy musimy ściągnąć – są one dostępne w Speech SDK.
Oczywiście mamy dużo większe możliwości konfiguracyjne. Za pomocą klasy PromptBuilder. Umożliwia ona zbudowanie całej wypowiedzi wraz z odpowiednią intonacją: przerwami, przyśpieszaniem wypowiedzi lub jej zwalnianiem.
PromptBuilder builder = new PromptBuilder(CultureInfo.CurrentUICulture);
builder.AppendTextWithHint(“WPF”, SayAs.SpellOut);
builder.AppendText(“jest”);
builder.AppendBreak(PromptBreak.Small);
builder.AppendText(“ekstra”, PromptEmphasis.Strong);
SpeechSynthesizer speech = new SpeechSynthesizer();
speech.Speak(builder);
To tylko mały pokaz możliwości tej klasy.
Rozpoznawanie mowy
WPF udostępnia także rozpoznawanie głosu:
SpeechRecognizer recognizer = new SpeechRecognizer();
recognizer.SpeechRecognized += recognizer_SpeechRecognized;
Oczywiście i w tym przypadku możemy więcej kontrolować za pomocą gramatyki. Jednak jest to dosyć zaawansowana sprawa i nie sądzę, aby jej znajomość była bardzo wymagana na egzaminie – MSDN on GrammerBuilder
Na dziś tyle. Następnym razem będzie o zasobach w WPF.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl