Multimedia w aplikacji WPF (Audio + Video)

1. Cel lekcji

Celem lekcji jest:

  • poznanie obsługi multimediów w aplikacji WPF,
  • nauczenie się odtwarzania plików audio i wideo,
  • zapoznanie się z kontrolką MediaElement,
  • praca na plikach lokalnych (offline – jak na egzaminie).

Po lekcji uczeń:

  • potrafi dodać pliki multimedialne do projektu,
  • umie sterować odtwarzaniem audio i video,
  • rozumie różnicę między logiką aplikacji a interfejsem.

2. Tworzenie projektu

  1. Otwórz Visual Studio
  2. Nowy projekt
  3. Wybierz: WPF App (.NET)
  4. Nazwa projektu:
    AVWpfApp
  5. Zatwierdź

3. Dodanie plików multimedialnych do projektu

Na egzaminie nie ma Internetu, więc pliki muszą być w projekcie.

3.1. Dodajemy pliki

  • Kliknij prawym na projekt → Dodaj → Istniejący element
  • Dodaj:
    • audio1.mp3
    • audio2.mp3
    • video1.mp4
    • video2.mp4

Najlepiej wrzucić je do folderu:

Media/
 ├─ Audio/
 └─ Video/

3.2. Właściwości plików (WAŻNE!)

Dla każdego pliku ustaw:

  • Build Action → Content
  • Copy to Output Directory → Copy always

  • Dzięki temu pliki znajdą się w folderze aplikacji po uruchomieniu.

4. Koncepcja aplikacji

Interfejs podzielony na dwie części:

Lewa stronaPrawa strona
AUDIOVIDEO
Lista utworówLista filmów
Przyciski Play / StopPrzyciski Play / Stop

Jedna aplikacja, dwa MediaElementy.


5. Interfejs – MainWindow.xaml

Plik: MainWindow.xaml

<Window x:Class="AVWpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="AVWpfApp - Audio i Video"
        Height="500" Width="800">

    <Grid Margin="10">

        <!-- Podział okna na dwie kolumny -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <!-- ================== AUDIO ================== -->
        <StackPanel Grid.Column="0" Margin="10">

            <TextBlock Text="AUDIO"
                       FontSize="18"
                       FontWeight="Bold"
                       Margin="0,0,0,10"/>

            <!-- Lista plików audio -->
            <ListBox x:Name="lstAudio"
                     Height="120"/>

            <!-- Przyciski sterowania audio -->
            <Button Content="Odtwórz audio"
                    Margin="0,10,0,0"
                    Click="btnPlayAudio_Click"/>

            <Button Content="Stop audio"
                    Margin="0,5,0,0"
                    Click="btnStopAudio_Click"/>

            <!-- Odtwarzacz audio -->
            <MediaElement x:Name="audioPlayer"
                          LoadedBehavior="Manual"/>
        </StackPanel>

        <!-- ================== VIDEO ================== -->
        <StackPanel Grid.Column="1" Margin="10">

            <TextBlock Text="VIDEO"
                       FontSize="18"
                       FontWeight="Bold"
                       Margin="0,0,0,10"/>

            <!-- Lista plików video -->
            <ListBox x:Name="lstVideo"
                     Height="120"/>

            <!-- Przyciski sterowania video -->
            <Button Content="Odtwórz video"
                    Margin="0,10,0,0"
                    Click="btnPlayVideo_Click"/>

            <Button Content="Stop video"
                    Margin="0,5,0,0"
                    Click="btnStopVideo_Click"/>

            <!-- Odtwarzacz video -->
            <MediaElement x:Name="videoPlayer"
                          Height="200"
                          LoadedBehavior="Manual"/>
        </StackPanel>

    </Grid>
</Window>

6. Logika aplikacji – MainWindow.xaml.cs

 Plik: MainWindow.xaml.cs

using System;
using System.IO;
using System.Windows;

namespace AVWpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // Po uruchomieniu aplikacji ładujemy listy plików
            ZaladujAudio();
            ZaladujVideo();
        }

        // ================= AUDIO =================

        // Wczytanie plików audio do listy
        private void ZaladujAudio()
        {
            lstAudio.Items.Add("audio1.mp3");
            lstAudio.Items.Add("audio2.mp3");
        }

        // Odtwarzanie wybranego pliku audio
        private void btnPlayAudio_Click(object sender, RoutedEventArgs e)
        {
            if (lstAudio.SelectedItem == null)
            {
                MessageBox.Show("Wybierz plik audio.");
                return;
            }

            string sciezka =
                Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
                "Media\\Audio",
                lstAudio.SelectedItem.ToString());

            audioPlayer.Source = new Uri(sciezka);
            audioPlayer.Play();
        }

        // Zatrzymanie audio
        private void btnStopAudio_Click(object sender, RoutedEventArgs e)
        {
            audioPlayer.Stop();
        }

        // ================= VIDEO =================

        // Wczytanie plików video do listy
        private void ZaladujVideo()
        {
            lstVideo.Items.Add("video1.mp4");
            lstVideo.Items.Add("video2.mp4");
        }

        // Odtwarzanie wybranego pliku video
        private void btnPlayVideo_Click(object sender, RoutedEventArgs e)
        {
            if (lstVideo.SelectedItem == null)
            {
                MessageBox.Show("Wybierz plik video.");
                return;
            }

            string sciezka =
                Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
                "Media\\Video",
                lstVideo.SelectedItem.ToString());

            videoPlayer.Source = new Uri(sciezka);
            videoPlayer.Play();
        }

        // Zatrzymanie video
        private void btnStopVideo_Click(object sender, RoutedEventArgs e)
        {
            videoPlayer.Stop();
        }
    }
}

7. Wyjaśnienie kluczowych elementów (EGZAMIN)

MediaElement

  • kontrolka WPF do obsługi audio i video
  • nie wymaga NuGet
  • działa offline
<MediaElement LoadedBehavior="Manual"/>

Manual – sterowanie z poziomu kodu (Play()Stop())


Path.Combine + BaseDirectory

AppDomain.CurrentDomain.BaseDirectory
  • zwraca folder, w którym działa aplikacja
  • egzaminacyjne, poprawne rozwiązanie
  • działa niezależnie od komputera

Play / Stop

audioPlayer.Play();
audioPlayer.Stop();

To są najważniejsze metody MediaElement.


8. Co potrafi aplikacja AVWpfApp

✔ odtwarza pliki audio
✔ odtwarza pliki video
✔ działa bez Internetu
✔ używa wbudowanych kontrolek WPF
✔ ma czytelny interfejs
✔ spełnia wymagania INF.04


9. Jak to można rozwinąć (opcjonalnie)

  • pauza (Pause())
  • regulacja głośności
  • pasek postępu
  • zmiana źródła w trakcie odtwarzania