C# a WPF tvorba MP3 přehrávače
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

C# a WPF tvorba MP3 přehrávačeC# a WPF tvorba MP3 přehrávače

 

C# a WPF tvorba MP3 přehrávače

Google       Google       29. 6. 2008       27 811×

Ukázka tvorby jednoduchého MP3 přehrávače.

Reklama
Reklama

Co bude potřeba

K tomu, abychom náš MP3 přehrávač mohli vůbec začít programovat, budeme potřebovat nějaké IDE vývojové prostředí, já volím VS 2008, ale výběr nechám jen a jen na vás. Náš MP3 přehrávač budeme psát pomocí platformy .NET 3.5, kterou byste měli mít nainstalovanou. O přehrávání zvuku se nám postará knihovna DirectX (stáhnout). K návrhu programu ve WPF použijeme Microsoft Expression Blend 2.5.

Máme-li vše připravené, pojďme na to.

Vývoj jednoduchého MP3 přehrávače

V tomto článku se nebudu zabývat tvorbou aplikace pomocí Microsoft Expression Blend 2.5, ale samotným naprogramováním funkcí MP3 přehrávače tak, aby přehrával hudební soubory. Spusťte Blend a vytvořte si aplikaci, která bude podobná té mojí.

Zde je XAML kód našeho okna:

<Window
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	x:Class="WpfApplication4.Window1"
	x:Name="Window"
	Title="Window1"
	Width="640" Height="480" Foreground="#FFFFFFFF">
	<Window.Background>
		<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
			<GradientStop Color="#FF000000" Offset="0"/>
			<GradientStop Color="#FF004685" Offset="1"/>
		</LinearGradientBrush>
	</Window.Background>

	<Grid x:Name="LayoutRoot">
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="*"/>
		</Grid.ColumnDefinitions>
		<Button Margin="8,8,0,0" Content="Otevřít" Width="87" Height="39" VerticalAlignment="Top" HorizontalAlignment="Left" FontSize="18" RenderTransformOrigin="0.5,0.5" Click="Button_Click">
			<Button.RenderTransform>
				<TransformGroup>
					<ScaleTransform ScaleX="1" ScaleY="1"/>
					<SkewTransform AngleX="0" AngleY="1"/>
					<RotateTransform Angle="0"/>
					<TranslateTransform X="0" Y="0"/>
				</TransformGroup>
			</Button.RenderTransform>
			<Button.Background>
				<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
					<GradientStop Color="#FF00197B" Offset="0"/>
					<GradientStop Color="#FFEBEBEB" Offset="0.5"/>
					<GradientStop Color="#FFDDDDDD" Offset="0.5"/>
					<GradientStop Color="#FF001C87" Offset="1"/>
				</LinearGradientBrush>
			</Button.Background>
		</Button>
		<Button Margin="231.912,139,276.088,221" Content="Přehrát" FontSize="22" Click="Button_Click_1">
			<Button.Background>
				<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
					<GradientStop Color="#FFFFFFFF" Offset="0"/>
					<GradientStop Color="#FF000000" Offset="0"/>
					<GradientStop Color="#FF069C13" Offset="1"/>
				</LinearGradientBrush>
			</Button.Background>
		</Button>
		<Button Margin="71,162,0,221" Content="Stop" Width="123.912" HorizontalAlignment="Left" FontSize="22" Click="Button_Click_3">
			<Button.Background>
				<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
					<GradientStop Color="#FFF3F3F3" Offset="0"/>
					<GradientStop Color="#FFEBEBEB" Offset="0"/>
					<GradientStop Color="#FF000000" Offset="0.013"/>
					<GradientStop Color="#FFFF0606" Offset="1"/>
				</LinearGradientBrush>
			</Button.Background>
		</Button>
		<Button Margin="0,162,106,221" Content="Pozastavit" Width="124.088" HorizontalAlignment="Right" FontSize="22" Click="Button_Click_2">
			<Button.Background>
				<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
					<GradientStop Color="#FFF3F3F3" Offset="0"/>
					<GradientStop Color="#FF000000" Offset="0"/>
					<GradientStop Color="#FF000000" Offset="0"/>
					<GradientStop Color="#FFB9F500" Offset="1"/>
				</LinearGradientBrush>
			</Button.Background>
		</Button>
    </Grid>
</Window>

Máme-li okno navrhnuté, tak projekt v Blendu uložíme a Blend zavřeme. Nyní přichází na řadu Visual Studio, ve kterém otevřeme náš projekt, který byl vytvořen a uložen pomocí Blendu. Jako první musíme přidat do ReferencesSolution Explorer knihovny, které budeme potřebovat. A ty jsou:

  • Microsoft.DirectX.AudioVideoPlayback
  • System.Windows.Forms

Knihovny přidáme následujícím způsobem:

  1. Klikneme pravým tlačítkem myši na References a zvolíme Add References..
  2. V seznamu zvolíme knihovnu, kterou potřebujeme a klikneme na OK.

  3. Tento postup opakujeme dokaď nepřidáme všechny knihovny

Abychom při přehrávání skladby měli přehled o tom, jaká část ze skladby je přehrána, umístíme nyní v designérovi Visual Studia do naší aplikace jeden ProgressBar, který pojmenujeme ukazatel.

Podíváme-li se nyní do okna, ve kterém Visual Studio zobrazuje náš XAML kód, zjistíme, že se rozšířil o jeden řádek:

<ProgressBar Height="19" Margin="71,97,106,0" Name="progressBar1" VerticalAlignment="Top" Value="0" />

Tak a nyní se dostáváme k té zajímavější části. Tou je samotné psaní aplikace. Klikněte tedy pravým tlačítkem na okno naší aplikace a zvolte View Code. Na začátku kódu byste měli mít následující:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Forms;  //pokud není nutno dopsat
using Microsoft.DirectX.AudioVideoPlayback; //pokud není nutno dopsat

Pokud tam poslední dvě knihovny chybí, dopište je tam ručně. Tak a můžeme vesele programovat. V těle naší třídy pod metodu v mém případě Form1 vytvořte novou metodu, kterou nastavíme jako private a pojmenujeme ji otevri. Tato metoda se nám postará o zobrazení OpenFileDialog, nastavení možných souborů k výběru, uložení cesty k souboru do proměnné. Kód metody je následující:

        private Audio mojeHudba;
        private string NameSound;

private void otevri()
        {
            OpenFileDialog od = new OpenFileDialog();
            od.Filter = "Hudební soubory" + " (*.wma; *.mp3)|*.wma; *.mp3|Všechny soubory|*.*";
            od.ShowDialog();
            NameSound = od.FileName;
        }

Nyní přejdeme opět do designéra VS 2008, dvakrát poklepeme na tlačítko Otevřít. V programu se nám vytvoří další metoda nazevTlacit_Click. Tato metoda bude odkazovat na metodu otevri.

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            otevri();
        }

Úplně stejným způsobem vytvoříme metody prehraj, pozastav, zastav, které používají metody z knihovny DirectX. Akce tlačítek Přehrát, Pozastavit, Zastavit vytvoříme též úplně tím stejným způsobem. U metody prehraj metodou Audio.FormFile vytáhneme náš zvuk a uložíme do proměnné, se kterou budou pracovat metody prehraj, pozastav a zastav. Kód bude vypadat následovně:

        private void prehraj()
        {
            mojeHudba = Audio.FromFile(NameSound);
            mojeHudba.Play();
        }

        private void pozastav()
        {
            mojeHudba.Pause();
        }

        private void zastav()
        {
            mojeHudba.Stop();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            prehraj();
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            pozastav();
        }

        private void Button_Click_3(object sender, RoutedEventArgs e)


        {
            zastav();
        }

Nyní máme hotov základ našeho přehrávače. Jako další ošetříme několik věcí. Jistě jste si všimli, že když nevyberu soubor pomocí Otevřít a kliknu na Přehrát, program spadne. Když přehrávám skladbu a kliknu ještě na Přehrát, tak se skladba spustí ještě jednou a hraje v pozadí té první. Tento problém vyřešíme takto:

  1. V aplikaci vytvoříme dvě proměnné typu boolean, kterou nazveme hraje a otevren.
    private Boolean hraje;
    private Boolean otevren;
  2. Do metody prehraj přidáme podmínku if, která zabrání vzniku chyby:
     private void prehraj()
            {
                if(otevren ==true)
                {
                     if (mojeHudba == null) 
                    {
                        mojeHudba = Audio.FromFile(NameSound); ;
                    }
                    mojeHudba.Play();
                    hraje = true;
                }
    Tím jsme zabránili spuštění hudby ještě jednou.
  3. Aby kód v předchozím bodě fungoval, musíme upravit metodu otevri přidáním řádku, který bude nastavovat proměnnou otevren na true, a tím pádem dovolí akci tlačítka Přehrát volat metodu prehraj:
    private void otevri()
            {
                OpenFileDialog od = new OpenFileDialog();
                od.Filter = "Hudební soubory" + " (*.wma; *.mp3)|*.wma; *.mp3|Všechny soubory|*.*";
                od.ShowDialog();
                NameSound = od.FileName;
                otevren = true; // tento řádek nám říká, že soubor je načten
            }
  4. Aby program nepadal při stisku tlačítka Stop a Pozastavit, upravíme metody zastav a pozastav následovně:
    private void pozastav()
            {
                try
                {
                    mojeHudba.Pause();
                    hraje = false;
                }catch
                {
                    //chybu ignoruji
                }
            }
    
            private void zastav()
            {
                try
                {
                    mojeHudba.Stop();
                }
                catch
                {
                    //chybu ignoruji
                }
    
            }
  5. Poslední věcí, kterou musíme ošetřit, je, že když má uživatel přehrávanou skladbu a klikne na Otevřít, tak aby se původní skladba vypnula a začala se přehrávat nová. To provedeme přidáním podmínky do akce tlačítka Přehrát:
    private void Button_Click(object sender, RoutedEventArgs e)
            {
                if(hraje == true)
                {
                    zastav();
                    otevri();
                    prehraj();
                }else
                {
                    otevri();
                }
            }
  6. Ošetření chyb je hotové.

Poslední věcí, která nám dnes zbývá, je oživení našeho ProgressBaru. V naši třídě si definujeme další proměnou typu Timer a jménem casovac:

Timer casovac;

Nyní naši metodu prehraj rozšíříme o pár řádků, které se nám budou starat o zobrazení přehrání skladby na ProgressBar:

private void prehraj()
        {
            if(otevren ==true)
            {
                if (mojeHudba == null)
                {
                    mojeHudba = Audio.FromFile(NameSound); ;
                }
                mojeHudba.Play();
                hraje = true;
                ukazatel.Maximum = (int)mojeHudba.Duration; //nový řádek
                casovac = new Timer(); //nový řádek
                casovac.Enabled = true; //nový řádek
               casovac.Interval = 100; //nový řádek
                casovac.Tick += new EventHandler(casovac_tick); //nový řádek


            }
        }

K tomu, aby nám následující kód pracoval, musíme mít metodu, která se jmenuje casovac_tick, ta nám nastavuje postupně hodnotu načtení ProgressBaru a po přehrání celé skladby ji vypne. Její kód je následující:

 private void casovac_tick(object sender, EventArgs e)
        {
            if (hraje == true)
            {
                ukazatel.Value = (int)mojeHudba.CurrentPosition;
                if (((mojeHudba.CurrentPosition / mojeHudba.Duration) * 100) == 100)
                {
                    zastav();
                }
            }
        }

Poslední, co spácháme, je nastavení, aby se zastavilo i načítání ProgressBaru, když uživatel stiskne Zastavit. Metoda zastav vypadá následovně:

private void zastav()
        {
            try
            {
                this.ukazatel.Value = this.ukazatel.Minimum;  // nový řádek kódu
                hraje = false;
                mojeHudba.Stop();
            }
            catch
            {
                //chybu ignoruji
            }

        }

Závěr s poděkováním

Náš MP3 přehrávač je hotov a ani to nebolelo. Nyní můžete pro váš výtvor vytvořit instalátor a vesele propagovat mezi svými známými, spolužáky, kolegy a jinými. Tento článek je určen už pokročilejším programátorům C#, kteří vědí, o čem je řeč. Článek je již takto obsáhlý, a proto vynechávám vlákna aplikace. A závěrem děkuji Chrastymu za jeho odbornou konzultaci, bez které by tento článek nevznikl.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
Student ČVUT FJFI katedry softwarového inženýrství v ekonomii. Mezi jeho zájmy patří programování a sport. Autor má zkušenosti s PHP 5, MySQL, XHTML a CSS. Zajímá se o platformu .NET, jazyk C#, ASP.NET a WPF.
Web    

Nové články

Obrázek ke článku Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

Reklama
Reklama
Obrázek ke článku ICT PRO školení zaměřené nejenom na ICT

ICT PRO školení zaměřené nejenom na ICT

Dovolte, abychom se představili. Jsme zaměstnanci společnosti ICT Pro, profesionálové v oblasti poskytování komplexních ICT služeb. Neboli služeb spojených s informačními a komunikačními technologiemi, které dnes - ve 21. století - tvoří  nedílnou součást běžného provozu všech moderních firem.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý