TOC

This article is currently in the process of being translated into Russian (~81% done).

Аудио и Видео:

Playing audio

WPF поставляется с превосходной встроенной поддержкой аудио и видео, как вы увидите в следующей паре глав этого руководства. В этой статье мы обсудим возможность воспроизведения звука, исходящего из аудиофайлов, например в формате MP3. Но сначала давайте рассмотрим пару более простых подходов.

System sounds and the 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();
			}
		}
	}
}

In this example, we just have a single button, which will show an OpenFileDialog and let you select an MP3 file. Once that is done, it will use the already created MediaPlayer instance to open and play this file. Notice that the MediaPlayer object is created outside of the event handler. This makes sure that the object is not prematurely garbage collected because it goes out of scope once the event handler is done, which would result in the playback stopping.

Также обратите внимание, что для этого примера не выполняется обработка исключений, как обычно, чтобы сделать пример максимально компактным, но и также потому, что методы Open() и Play() фактически не создают исключений. Вместо этого можно использовать события MediaOpened и MediaFailed, чтобы определить, когда идет все правильно или неправильно.

Controlling the 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.

Summary

Есть еще несколько вариантов, которые вы можете позволить своему пользователю контролировать, но я хочу сохранить их, когда мы будем говорить о видео-аспектах класса MediaPlayer и тогда я сделаю более полный пример медиаплеера, способного воспроизводить как аудио, так и видео файлы, с большим количеством опций.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!