This article has been localized into Russian by the community.
Воспроизведение аудио
WPF поставляется с превосходной встроенной поддержкой аудио и видео, как вы увидите в следующей паре глав этого руководства. В этой статье мы обсудим возможность воспроизведения звука, исходящего из аудиофайлов, например в формате MP3. Но сначала давайте рассмотрим пару более простых подходов.
Системные звуки и класс SoundPlayer
WPF имеет класс под названием SoundPlayer, который будет воспроизводить для вас аудиоконтент на основе формата WAV. WAV не очень широко используется сегодня, главным образом потому, что он несжатый и, следовательно, занимает много места.
Поэтому, хотя класс SoundPlayer прост в использовании, это не очень полезно. Вместо этого мы будем фокусироваться на классах MediaPlayer и MediaElement, что позволяют воспроизводить файлы формата MP3, но сначала давайте посмотрим на самый простой способ воспроизведения звука в вашем приложении WPF - класс SystemSounds.
Класс SystemSounds предлагает несколько разных звуков, которые соответствуют звуку, определенному для этого события пользователем в Windows, например, Восклицание и Вопросу. Вы можете использовать эти звуки и настройки и воспроизводить их с помощью одной строки кода:
SystemSounds.Beep.Play();
Ниже - полный пример, в котором мы используем все доступные на данный момент звуки:
<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();
}
}
}
Конечно, есть несколько ограничений в использовании этого подхода. Прежде всего, вы получаете доступ только к этим пяти звукам, и, во-вторых, пользователь может отключить их в Windows, и в этом случае ожидаемый звук будет заменен тишиной. С другой стороны, если вы только хотите использовать эти звуки, так же, как это делает Windows, это позволит вам очень просто производить звук для предупреждений, вопросов и т. д. В этом случае это хороший выбор для обработки действий пользователя по умолчанию.
Класс MediaPlayer
Класс MediaPlayer использует технологию Windows Media Player для воспроизведения как аудио так и видео в нескольких современных форматах, например MP3 и MPEG. В этой статье, мы будем использовать его для воспроизведения только аудио, а в следующей статье сосредоточимся на видео.
Воспроизведение MP3-файла классом MediaPlayer очень просто, как мы увидим в следующем примере:
<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();
}
}
}
}
В этом примере мы создаем простую кнопку, которая будет открывать диалоговое окно, где можно будет выбрать MP3 файл. Когда файл выбран, он будет использоваться в уже созданном MediaPlayer объекте для его открытия и воспроизведения. Обратите внимание, что MediaPlayer объект создается вне обработчика событий. Это позволяет нам быть уверенными, что объект не будет преждевременно собран сборщиком мусора, так как находится вне области видимости. Когда обработчик событий завершает работу, это приводит к остановке воспроизведения.
Также обратите внимание, что для этого примера не выполняется обработка исключений, как обычно, чтобы сделать пример максимально компактным, но и также потому, что методы Open() и Play() фактически не создают исключений. Вместо этого можно использовать события MediaOpened и MediaFailed, чтобы определить, когда идет все правильно или неправильно.
Управление MediaPlayer
В нашем первом примере MediaPlayer мы просто открыли и автоматически начали воспроизведение файла, не давая пользователю возможности контролировать процесс воспроизведения, но, разумеется, элемент управления MediaPlayer предлагает вам полный контроль над воспроизведением. Вот пример, показывающий наиболее важные функции:
<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();
}
}
}
В этом примере мы немного расширили проигрыватель, теперь он содержит кнопку воспроизведения, паузы и остановки, а также метку для отображения текущего состояния воспроизведения. Файл mp3 загружается точно так же, но мы делаем это, как только приложение запускается, чтобы упростить пример.
Сразу после загрузки MP3 мы запускаем таймер, который тикает каждую секунду. Мы используем это событие для обновления метки состояния, который будет показывать текущий прогресс, а также всю длину загруженного файла.
Каждая из трех кнопок просто вызывает соответствующий метод объекта MediaPlayer-Play, Pause и Stop.
Заключение
Есть еще несколько вариантов, которые вы можете позволить своему пользователю контролировать, но я хочу оставить их на потом, когда мы будем говорить о видео-аспектах класса MediaPlayer и тогда я сделаю более полный пример медиаплеера, способного воспроизводить как аудио, так и видео файлы, с большим количеством опций.