[C#] Cum să redai un fișier audio WAV incorporat într-o resursă?

Metoda prezentată în acest articol este funcțională și în proiecte WinForms dar și în cele WPF.

// la începutul fișierului de cod-din-spate
// trebuie pus acest rând dacă nu există deja:
using System.Media;

Putem folosi metoda Load sau LoadAsync pentru a încărca fișierul wav înainte de redarea lui și intercepta evenimentul LoadCompleted pentru a acționa după încărcarea fișierului audio (din testele mele, acest eveniment este apelat doar când se oferă un Stream, nu un nume de fișier, și nu este apelat când încărcarea dă eroare), dar metodele Play, PlaySync și PlayLooping fac asta automat înainte de redare.

Dorim ca fișierul audio să fie preluat din dosarul executabilului

Adăugăm fișierul WAV la proiect prin meniul Project > Add Existing Item... apoi îl selectăm în Solution Explorer și în panoul Properties atribuim proprietății cu numele Copy to Output Directory valoarea Copy if newer.

// în metoda handler la clic pe un buton se pun următoarele rânduri
SoundPlayer p = new SoundPlayer("nume_fisier.wav");
p.PlayLooping(); // repetă la infinit sunetul; alternativ: p.Play() care nu redă repetat sau p.PlaySync() care blochează firul de execuție până la finalizarea redării

În cazul încărcării asincrone prin LoadAsync (care ajută la fișiere mari, dar am adăugat un fișier WAV de aprox 700MB la proiect și s-a blocat, la repornire nu era fișierul în proiect), poate fi folositor să declarăm variabila p (de tip SoundPlayer) la nivelul clasei (de ex. Form1).

Sau dorim fișierul audio incorporat în fișierul executabil

Adăugăm fișierul WAV la proiect prin meniul Project > Add Existing Item... apoi îl selectăm în Solution Explorer și în panoul Properties atribuim proprietății cu numele Build Action (ro. Acțiunea la construire) valoarea Embedded Resource (ro. Resursă incorporată). Proprietatea cu numele Copy to Output Directory nu mai are relevanță în acest exemplu.

Dacă setăm Copy to Output Directory la valoarea Do not copy, la următoarea compilare (construcție sau en. build), fișierul audio nu va mai fi în directorul bin/Debug (unde se află executabilul generat de obicei), dar datorită proprietății Build Action va fi conținut de executabil.

În exemplul acesta numele fișierului audio este chimes.wav, fișier preluat din link-ul de mai jos. În fereastra de proprietăți ale proiectului (clic-dreapta pe proiect în panoul Solution Explorer, apoi în meniul apărut se selectează Properties) se caută în secțiunea Application setarea „Default namespace” (spațiul de nume implicit al proiectului). În cazul exemplului, aceasta are valoarea „cs_soundplayer_test”.

System.Reflection.Assembly a =
    System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream s =

    a.GetManifestResourceStream("cs_soundplayer_test.chimes.wav");
SoundPlayer p = new SoundPlayer(s); // nu c-torul încarcă fluxul WAV în memorie ci apelul de mai jos:
p.PlayLooping();

Capturi de ecran








Secvențele de cod din acest articol au fost testate pe Windows 10 cu .NET Framework 4.6.1.

Inspirație [EN]:
Sunetele implicite din Windows 7 pot fi descărcate de aici: https://winsounds.com/windows-7-default-sounds/.

Documentație oficială [EN]: https://msdn.microsoft.com/en-us/library/system.media.soundplayer(v=vs.110).aspx.

Niciun comentariu:

Trimiteți un comentariu