TOC

This article has been localized into Vietnamese by the community.

Audio & Video:

Phát âm thanh

WPF đươc tích hợp tính năng hỗ trợ âm thanh và phim ảnh tuyệt vời, bạn sẽ được thấy trong một vài chương tiếp theo của giáo trình này. Đặc biệt trong bài viết này, chúng tôi sẽ thảo luận về khả năng chơi âm thanh, từ các tập tin âm thanh thực tế, như là định dạng MP3, nhưng trước tiên, chúng ta hãy nghiên cứu một vài phương thức đơn giản hơn.

System sounds và SoundPlayer

WPF có một lớp đối tượng gọi là SoundPlayer, được dùng để trình diễn nội dụng âm thanh dựa trên định dạng WAV. WAV thì không được sủ dụng rộng rãi ngày nay, lý do chính là tập tin WAV không được nén nên sẽ chiếm rất nhiều không gian lưu trữ.

Vì vậy, trong khi lớp SoundPlayer dễ sử dụng, nó không hữu ích lắm. Thay vào đó, chúng tôi sẽ tập trung vào các lớp MediaPlayerMediaElement, cho phép phát lại các tệp MP3, nhưng trước tiên, chúng ta hãy xem cách đơn giản nhất để phát âm thanh trong ứng dụng WPF của bạn - lớp SystemSound.

Lớp SystemSound cung cấp một số âm thanh khác nhau, tương ứng với âm thanh được xác định cho sự kiện này bởi người dùng trong Windows, như Exclamation và Question. Bạn có thể cõng những âm thanh và cài đặt này và phát chúng với một dòng code:

SystemSounds.Beep.Play();

Đây là một ví dụ hoàn chỉnh, nơi chúng tôi sử dụng tất cả các âm thanh hiện có:

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

Tất nhiên có một số hạn chế để sử dụng phương pháp này. Trước hết, bạn chỉ có quyền truy cập vào năm âm thanh này và thứ hai, người dùng có thể đã tắt chúng trong Windows, trong trường hợp đó, âm thanh dự kiến ​​sẽ được thay thế bằng im lặng. Mặt khác, nếu bạn chỉ muốn sử dụng những âm thanh này giống như Windows, thì việc tạo ra âm thanh để cảnh báo, câu hỏi rất dễ dàng. Trong trường hợp đó, ứng dụng của bạn sẽ tôn trọng người dùng lựa chọn im lặng.

MediaPlayer class

Lớp MediaPlayer sử dụng công nghệ Windows Media Player để phát cả âm thanh và video ở một số định dạng hiện đại, ví dụ: MP3 và MPEG. Trong bài viết này, chúng tôi sẽ sử dụng nó để chỉ phát âm thanh và sau đó tập trung vào video trong bài viết tiếp theo.

Phát tệp MP3 với lớp MediaPlayer rất đơn giản, như chúng ta sẽ thấy trong ví dụ tiếp theo này:

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

Trong ví dụ này, chúng tôi chỉ có một nút duy nhất, nó sẽ hiển thị OpenFileDialog và cho phép bạn chọn một tệp MP3. Khi đã xong, nó sẽ sử dụng phiên bản MediaPlayer đã được tạo để mở và phát tệp này. Lưu ý rằng đối tượng MediaPlayer được tạo bên ngoài trình xử lý sự kiện. Điều này đảm bảo rằng đối tượng không phải là rác được thu thập sớm vì nó nằm ngoài phạm vi một khi xử lý sự kiện được thực hiện, điều này sẽ dẫn đến việc dừng phát lại.

Cũng xin lưu ý rằng không có xử lý ngoại lệ nào được thực hiện cho ví dụ này, như thường lệ để giữ ví dụ nhỏ gọn nhất có thể, nhưng trong trường hợp này cũng vì các phương thức Open() và Play() thực sự không đưa ra bất kỳ ngoại lệ nào. Thay vào đó, bạn có thể sử dụng các sự kiện MediaOpened và MediaFails để hành động khi mọi thứ trở nên đúng hoặc sai.

Kiểm soát MediaPlayer

Trong ví dụ MediaPlayer đầu tiên của chúng tôi, chúng tôi chỉ mở và tự động bắt đầu phát tệp, mà không cho người dùng cơ hội kiểm soát quá trình phát lại, nhưng rõ ràng, điều khiển MediaPlayer cung cấp cho bạn toàn quyền kiểm soát phát lại. Dưới đây là một ví dụ cho bạn thấy các chức năng quan trọng nhất:

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

Trong ví dụ này, chúng tôi đã mở rộng trình phát của mình một chút, để giờ đây nó có nút Play, Pause and Stop, cũng như nhãn để hiển thị trạng thái phát lại hiện tại. Tệp MP3 được phát được tải theo cùng một cách, nhưng chúng tôi thực hiện ngay khi ứng dụng khởi động, để giữ cho ví dụ đơn giản.

Ngay sau khi MP3 được tải, chúng tôi bắt đầu hẹn giờ, tích tắc mỗi giây. Chúng tôi sử dụng sự kiện này để cập nhật nhãn trạng thái, sẽ hiển thị tiến trình hiện tại cũng như toàn bộ chiều dài của tệp được tải.

Ba nút mỗi nút chỉ đơn giản gọi một phương thức tương ứng trên đối tượng MediaPlayer - Play, Pause và Stop.

Tổng kết

Có một số tùy chọn khác mà bạn có thể cho phép người dùng của mình kiểm soát, nhưng tôi muốn lưu nó khi chúng ta đã nói về các khía cạnh video của lớp MediaPlayer - tại thời điểm đó, tôi sẽ làm một ví dụ đầy đủ hơn về trình phát phương tiện có khả năng chơi cả tệp âm thanh và video, với nhiều tùy chọn hơn.


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!