Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Класс MediaPlayer

59

Классы 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. Он предоставляет небольшой набор полезных методов, свойство и событий. Их полный перечень приведен ниже:

Члены класса MediaPlayer
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.

Пройди тесты