This article has been localized into Polish by the community.
Odtwarzanie Audio
Ja się przekonasz w najbliższych rozdziałach WPF posiada wspaniały wbudowany odtwarzacz dźwięku. W tym rozdziale omówimy zdolność do odgrywania dźwięku pochodzącego z plików dźwiękowych np. w formacie MP3. Na początek zapoznamy się z paroma prostymi metodami.
Klasa SystemSounds i odtwarzacz dźwięku SoundPlayer
WPF ma się klasę o nazwie SoundPlayer , która będzie odgrywać dźwięk w formacie WAV. Format WAV nie jest obecnie szeroko stosowany. Głównie dlatego że jest nieskompresowany i zajmuje dużo miejsca na dysku.
Tak więc, chociaż klasa "SoundPlayer" jest prosta w użyciu, nie jest ona zbyt przydatna. Zamiast tego skupimy się na klasach "MediaPlayer" i "MediaElement", które umożliwiają odtwarzanie plików MP3, ale najpierw przyjrzyjmy się najprostszemu sposobowi odtwarzania dźwięku w aplikacji WPF - klasie "SystemSounds".
Klasa System Sounds oferuje kilka różnych dźwięków, które skorelowane są dźwiękami zdefiniowanymi dla tego zdarzenia przez użytkownika w systemie Windows, jak sygnał domyślny, ostrzeżenie, zamknięcie programu, powiadomienie o nowej, itd. Dźwięki te można odtwarzać je za pomocą jednego wiersza o kodzie :
SystemSounds.Beep.Play();
Oto kompletny przykład, gdzie możemy wykorzystywać wszystkie z obecnie dostępnych dźwięków :
<Window x:Class="WpfTutorialSamples.Audio_and_Video.SystemSoundsSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SystemSoundsSample" Height="200" Width="150">
<StackPanel Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="btnAsterisk" Click="btnAsterisk_Click">Asterisk</Button>
<Button Name="btnBeep" Margin="0,5" Click="btnBeep_Click">Beep</Button>
<Button Name="btnExclamation" Click="btnExclamation_Click">Exclamation</Button>
<Button Name="btnHand" Margin="0,5" Click="btnHand_Click">Hand</Button>
<Button Name="btnQuestion" Click="btnQuestion_Click">Question</Button>
</StackPanel>
</Window>
using System;
using System.Media;
using System.Windows;
namespace WpfTutorialSamples.Audio_and_Video
{
public partial class SystemSoundsSample : Window
{
public SystemSoundsSample()
{
InitializeComponent();
}
private void btnAsterisk_Click(object sender, RoutedEventArgs e)
{
SystemSounds.Asterisk.Play();
}
private void btnBeep_Click(object sender, RoutedEventArgs e)
{
SystemSounds.Beep.Play();
}
private void btnExclamation_Click(object sender, RoutedEventArgs e)
{
SystemSounds.Exclamation.Play();
}
private void btnHand_Click(object sender, RoutedEventArgs e)
{
SystemSounds.Hand.Play();
}
private void btnQuestion_Click(object sender, RoutedEventArgs e)
{
SystemSounds.Question.Play();
}
}
}
Jest kilka ograniczeń w użyciu tej metody. Po pierwsze, możesz uzyskać dostęp tylko do tych pięciu dźwięków. Po drugie, użytkownik może mieć wyłączone te dźwięki w systemie Windows. W tym to przypadku nie usłyszymy żadnego dźwięku. Z drugiej strony, jeśli tylko chcesz skorzystać z nich sam sposób jak w systemie Windows, to jest to niezwykle łatwe do zaimplementowania. W tym przypadku, jest dobrą rzeczą, że twoja aplikacja będzie respektować ustawienia użytkownika w systemie Windows.
Klasa MediaPlayer
Klasy MediaPlayer można używać do odtwarzania zarówno plików audio jak i wideo zapisanych w kilku nowoczesnych formatów np . mp3 i mpeg. W tym rozdziale skupimy się na odtwarzaniu dźwięku, aby w następnych rozdziałach skupić się na odtwarzaniu filmów
Jak zobaczymy w poniższym przykładzie odtwarzanie pliku MP3 za pomocą klasy MediaPlayer jest bardzo proste.
<Window x:Class="WpfTutorialSamples.Audio_and_Video.MediaPlayerAudioSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MediaPlayerAudioSample" Height="100" Width="200">
<Grid VerticalAlignment="Center" HorizontalAlignment="Center">
<Button Name="btnOpenAudioFile" Click="btnOpenAudioFile_Click">Open Audio file</Button>
</Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Media;
using Microsoft.Win32;
namespace WpfTutorialSamples.Audio_and_Video
{
public partial class MediaPlayerAudioSample : Window
{
private MediaPlayer mediaPlayer = new MediaPlayer();
public MediaPlayerAudioSample()
{
InitializeComponent();
}
private void btnOpenAudioFile_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "MP3 files (*.mp3)|*.mp3|All files (*.*)|*.*";
if(openFileDialog.ShowDialog() == true)
{
mediaPlayer.Open(new Uri(openFileDialog.FileName));
mediaPlayer.Play();
}
}
}
}
W tym przykładzie, możemy wybrać tylko jeden przycisk, który otworzy okno dialogowe OpenFileDialog i pozwoli Ci wybrać to plik mp3. Gdy to zrobisz, to będziesz mógł korzystać instancji MediaPlayer i odtwarzać ten plik. Zauważ, że obiekt MediaPlayer jest tworzony na zewnątrz z obsługi zdarzeń. To sprawia, że obiekt jest nie przedwcześnie zamykany przez odśmiecającego pamięć ponieważ wykracza poza zakres obsługi zdarzeń gdy to jest zrobione.
Należy również zauważyć, że w tym przykładzie nie jest zrobiona żadna obsługa wyjątków, jak zwykle , aby utrzymać na przykład tak zwarty jak to tylko możliwe. Ale w tym przypadku również metody Open () i Play () rzeczywiście nie generują żadnych wyjątków. Zamiast tego, można używać zdarzeń MediaOpened i MediaFailed do wykonania działań, gdy coś pójdzie źle .
Kontrolowanie Odtwarzacza
W naszym pierwszym przykładzie Odtwarzacz był po prostu otwarty i automatycznie rozpoczął odtwarzanie pliku, bez dając użytkownikowi szans do kontrolowania procesu odtwarznia, ale oczywiście MediaPlayer oferuje Ci pełną kontrolę odtwarzania. Oto przykład pokazujący Ci najbardziej istotne funkcje :
<Window x:Class="WpfTutorialSamples.Audio_and_Video.MediaPlayerAudioControlSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MediaPlayerAudioControlSample" Height="120" Width="300">
<StackPanel Margin="10">
<Label Name="lblStatus" Content="Not playing..." HorizontalContentAlignment="Center" Margin="5" />
<WrapPanel HorizontalAlignment="Center">
<Button Name="btnPlay" Click="btnPlay_Click">Play</Button>
<Button Name="btnPause" Margin="5,0" Click="btnPause_Click">Pause</Button>
<Button Name="btnStop" Click="btnStop_Click">Stop</Button>
</WrapPanel>
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
using Microsoft.Win32;
namespace WpfTutorialSamples.Audio_and_Video
{
public partial class MediaPlayerAudioControlSample : Window
{
private MediaPlayer mediaPlayer = new MediaPlayer();
public MediaPlayerAudioControlSample()
{
InitializeComponent();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "MP3 files (*.mp3)|*.mp3|All files (*.*)|*.*";
if(openFileDialog.ShowDialog() == true)
mediaPlayer.Open(new Uri(openFileDialog.FileName));
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
if(mediaPlayer.Source != null)
lblStatus.Content = String.Format("{0} / {1}", mediaPlayer.Position.ToString(@"mm\:ss"), mediaPlayer.NaturalDuration.TimeSpan.ToString(@"mm\:ss"));
else
lblStatus.Content = "No file selected...";
}
private void btnPlay_Click(object sender, RoutedEventArgs e)
{
mediaPlayer.Play();
}
private void btnPause_Click(object sender, RoutedEventArgs e)
{
mediaPlayer.Pause();
}
private void btnStop_Click(object sender, RoutedEventArgs e)
{
mediaPlayer.Stop();
}
}
}
W tym przykładzie, mamy bardziej rozszerzony przykład zawierający przyciski się Play, Pause i Stop, jak również jako wskaźniki pokazujące aktualny stan odtwarzania. Plik MP3 jest załadowany ten sam sposób , ale możemy kontrolować odtwarzanie jak tylko aplikacja się uruchomi, oto przykład prosty przykład.
Tuż po wczytaniu pliku mp3 uruchamiamy stoper, który wywołuje działanie co sekundę . Możemy użyć tego zdarzenia, aby zaktualizować stan etykiet pokazujących aktualny postęp oraz całą długość wczytanego pliku.
Trzy przyciski, każdy odpowiada za wywołanie odpowiedniej metody na obiekcie MediaPlayer, Play, P ause i Stop (graj,pauza, zatrzymaj).
Podsumowanie
Jest wiele więcej możliwości, które możnaby wykorzystać do kontroli klasy MediaPlayer, ale chcę je zachować na czas kiedy będę pokazywał bardziej kompletny przykład odtwarzacza multimedialnego zdolnego do grania zarówno audio i wideo z większą liczbą opcji .