TOC

This article has been localized into Portuguese by the community.

Áudio e Vídeo:

Reproduzindo áudio

O WPF vem com excelente suporte integrado de áudio e vídeo, como você verá nos próximos capítulos deste tutorial. Neste artigo específico, discutiremos a capacidade de reproduzir áudio proveniente de arquivos de áudio reais, por exemplo, no formato MP3, mas primeiro, vamos dar uma olhada em algumas abordagens mais simples.

Sons do sistema e o SoundPlayer

O WPF tem uma classe chamada SoundPlayer , que reproduzirá conteúdo de áudio baseado no formato WAV para você. WAV não é um formato muito usado atualmente, principalmente porque é descompactado e, portanto, ocupa muito espaço.

Então, embora a classe SoundPlayer seja simples de usar, não é muito útil. Em vez disso, vamos nos concentrar nas classes MediaPlayer e MediaElement , que permitem a reprodução de arquivos MP3, mas primeiro, vamos dar uma olhada na maneira mais simples de reproduzir som em seu aplicativo WPF - a classe SystemSounds.

A classe SystemSounds oferece vários sons diferentes, o que corresponde ao som definido para este evento pelo usuário no Windows, como Exclamation e Question. Você pode pegar carona nesses sons e configurações e reproduzi-los com uma única linha de código:

SystemSounds.Beep.Play();

Aqui está um exemplo completo, onde usamos todos os sons atualmente disponíveis:

<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();
		}
	}
}

Existem, é claro, várias limitações ao uso dessa abordagem. Primeiro de tudo, você só tem acesso a esses cinco sons e, em segundo lugar, o usuário pode tê-los desativado no Windows, caso em que o som esperado será substituído pelo silêncio. Por outro lado, se você quiser usar esses sons da mesma maneira que o Windows, isso torna extremamente fácil produzir um som para avisos, perguntas etc. Nesse caso, é bom que seu aplicativo respeite o usuário escolha do silêncio.

A classe MediaPlayer

A classe MediaPlayer usa a tecnologia Windows Media Player para reproduzir áudio e vídeo em vários formatos modernos, por exemplo, MP3 e MPEG. Neste artigo, vamos usá-lo para reproduzir apenas áudio e, em seguida, focar no vídeo no próximo artigo.

Reproduzir um arquivo MP3 com a classe MediaPlayer é muito simples, como veremos no próximo exemplo:

<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();
			}
		}
	}
}

Neste exemplo, temos apenas um único botão, que mostrará um OpenFileDialog e permitirá que você selecione um arquivo MP3. Feito isso, ele usará a instância do MediaPlayer já criada para abrir e reproduzir esse arquivo. Observe que o objeto MediaPlayer é criado fora do manipulador de eventos. Isso garante que o objeto não seja coletado prematuramente como lixo, pois fica fora do escopo assim que o manipulador de eventos é concluído, o que resultaria na interrupção da reprodução.

Por favor note também que nenhuma manipulação de exceção é feita para este exemplo, como de costume para manter o exemplo o mais compacto possível, mas neste caso também porque os métodos Open () e Play () realmente não lançam nenhuma exceção. Em vez disso, você pode usar os eventos MediaOpened e MediaFailed para agir quando as coisas dão certo ou errado.

Controlando o MediaPlayer

Em nosso primeiro exemplo do MediaPlayer, apenas abrimos e automaticamente começamos a reproduzir um arquivo, sem dar ao usuário a chance de controlar o processo de reprodução, mas obviamente, o controle do MediaPlayer oferece controle total da reprodução. Aqui está um exemplo mostrando as funções mais importantes:

<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();
		}
	}
}

Neste exemplo, expandimos um pouco o nosso player, para que ele agora contenha os botões Reproduzir, Pausar e Parar, assim como um rótulo para mostrar o status atual da reprodução. O arquivo MP3 a ser reproduzido é carregado da mesma maneira, mas o fazemos assim que o aplicativo é iniciado, para manter o exemplo simples.

Logo após o carregamento do MP3, iniciamos um temporizador, que funciona a cada segundo. Usamos esse evento para atualizar o rótulo de status, que mostrará o progresso atual e todo o comprimento do arquivo carregado.

Cada um dos três botões simplesmente chama um método correspondente no objeto MediaPlayer - Reproduzir, Pausar e Parar.

Resumo

Existem várias outras opções que você pode deixar o seu usuário controlar, mas eu quero salvar isso para quando falamos sobre os aspectos de vídeo da classe MediaPlayer - nesse ponto, eu vou fazer um exemplo mais completo de um media player capaz de reproduzir arquivos de áudio e vídeo, com mais opções.


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!