Класс MediaPlayer
59WPF --- Элементы управления WPF --- Класс MediaPlayer
Классы SoundPlayer, SoundPlayerAction и SystemSounds легко использовать, но все они относительно маломощные. В современном мире вместо исходного формата WAV намного более распространен сжатый формат звука МРЗ для всех целей, за исключением простейших звуков. Для воспроизведения МРЗ-аудио или MPEG-видео предназначены классы MediaPlayer и MediaElement. Оба они зависят от ключевых элементов технологии, предоставленной проигрывателем Windows Media.
Класс MediaPlayer (находящийся в специфичном для WPF пространстве имен System.Windows.Media) — это WPF-эквивалент класса SoundPlayer. Хотя ясно, что он не настолько легковесен, все же он работает примерно так же. Объект MediaPlayer создается, с помощью метода Open() загружается аудиофайл, а вызовом метода Рlау() запускается асинхронное воспроизведение. (Опция синхронного воспроизведения не предусмотрена.) Рассмотрим пример:
private MediaPlayer player = new MediaPlayer();
private void Button_Click(object sender, RoutedEventArgs e)
{
player.Open(new Uri("music.mp3", UriKind.Relative));
player.Play();
}
Существует несколько важных деталей, на которые следует обратить внимание в этом примере:
MediaPlayer создается вне обработчика событий, поэтому он существует на протяжении жизненного цикла окна. Причина в том, что метод MediaPlayer.Close() вызывается тогда, когда объект MediaPlayer удаляется из памяти. Если создать объект MediaPlayer в обработчике событий, то он будет удален из памяти почти немедленно и, вероятно, вскоре после этого будет удален сборщиком мусора, и тогда будет вызван метод Close() и воспроизведение прервется.
Обязательно должен быть создан обработчик события Window.Unloaded, в котором вызывается метод Close() для остановки любого воспроизводящегося в данный момент звука при закрытии окна.
Местоположение файла указывается в виде URI. К сожалению, это не синтаксис упакованных URI, так что встроить аудиофайл и воспроизвести его с использованием класса MediaPlayer не получится. Это ограничение объясняется тем, что класс MediaPlayer построен на функциональности, которая не является встроенной в WPF, а предоставлена отдельным, неуправляемым компонентом проигрывателя Windows Media.
Код обработки исключений отсутствует. Это возмутительно, но методы Open() и Play() не генерируют исключения (в некоторой степени тому виной процессы асинхронной загрузки и воспроизведения). Взамен предлагается самостоятельно обрабатывать события MediaOpened и MediaFailed, чтобы определить, было ли запущено воспроизведение аудио.
MediaPlayer достаточно прост, хотя обладает большими возможностями, чем SoundPlayer. Он предоставляет небольшой набор полезных методов, свойство и событий. Их полный перечень приведен ниже:
Balance | Устанавливает баланс между левым и правым каналом как число от -1 (только левый канал) до 1 (только правый канал) |
Volume | Устанавливает громкость в виде числе от 0 (полная тишина) до 1 (полная громкость). Значение по умолчанию равно 0.5 |
SpeedRatio | Устанавливает повышенную скорость при воспроизведении звука (или видео). Значение по умолчанию равно 1, что означает нормальную скорость, в то время как 2 — двойную скорость, 10 — скорость, вдесятеро выше нормальной, 0.5 — половину нормальной скорости и т.д. Можно использовать любое положительное значение типа double |
HasAudio и HasVideo | Указывает на то, содержит ли текущий загруженный медиафайл, соответственно, аудио- и видеосоставляющие. Для воспроизведения видео должен использоваться класс MediaElement, описанный в следующей статье |
NaturalDuration, NaturalVideoHeight и NaturalVideoWidth | Указывают на то, идет ли воспроизведение на нормальной скорости, а также задают размер видео-окна. (Ниже будет показано, что допускается растягивать и сжимать видео для заполнения окон разного размера.) |
Position | Объект TimeSpan, указывающий текущее местоположение в медиафайле. Это свойство можно устанавливать для пропуска части файла и продолжения воспроизведения с указанного места |
DownloadProgress и BufferingProgress | Показывает процент загружаемого файла (удобно в тех случаях, когда источником является URL, указывающий на местоположение в Интернете или на другом компьютере). Процент представлен в виде числа от 0 до 1 |
Clock | Получает или устанавливает часы MediaClock, ассоциированные с проигрывателем. MediaClock используется только тогда, когда аудио синхронизируется с временной шкалой (примерно так же, как это делалось при синхронизации анимации с временной шкалой). При использовании методов MediaPlayer для выполнения воспроизведения вручную это свойство равно null |
Open() | Загружает новый медиафайл |
Play() | Начинает воспроизведение. Не имеет никакого эффекта, если файл уже воспроизводится |
Pause() | Временно приостанавливает воспроизведение, не меняя его позиции. Если вызвать Play() снова, то воспроизведение начнется с текущей позиции. Если воспроизведение не происходит, не дает никакого эффекта |
Stop() | Останавливает воспроизведение и сбрасывает позицию на начало файла. Если снова вызвать Play(), то воспроизведение начнется с начала файла. Не имеет эффекта, если воспроизведение уже остановлено |
Используя эти члены класса, можно построить базовый полнофункциональный медиапроигрыватель. Однако программисты WPF обычно применяют другой, относительно более простой элемент, который рассматривается в следующей статье — MediaElement.