[C#] MP3 afspelen

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Ik ben al een tijdje op zoek naar een makkelijke manier om MP3's af te spelen en ben tot een aantal niet- en halfwerkende oplossingen gekomen. Wat ik uiteindelijk wil is dat ik iets zo simpel als dit kan doen:
C#:
1
Mp3.Play(filename);

Meer niet. Ik heb geen pauze/stop nodig, geen feedback, niks. Gewoon mp3tje afspelen en weglopen, bij wijze van spreken.

Ik heb er zelf eigenlijk al veel te veel energie in gestoken, dus om te voorkomen dat jullie al mijn niet-werkende oplossingen gaan aanbieden, een overzichtje van wat niet werkte:
  1. Via MCI werkte niet omdat dat standaard crasht. Zet ik de target platform op x86, krijg ik steevast errorcodes terug.
  2. QuartzTypeLib gevonden, maar dat werkte maar ten dele. Niemand kan precies vertellen wat het is, wie de dll heeft, wat de licentie is, of waar het vandaan komt, maar ook Quartz vertoonde problemen. In eerste instantie gaf hij het DirectShow filter (ffdshow in mijn geval) niet vrij, wat resulteerde in 349283 icoontjes in de system tray, later bleef de library steevast crashen.
  3. Mp3Sharp geprobeerd. Die werkt nog het minst slecht, maar ik vind em wel belachelijk ingewikkeld. Je hebt eerst 4 classes nodig en dan nog een 3 streams om een mp3tje afgespeeld te krijgen. En omdat het via DirectSound loopt, schokt het (?). Ohja, en het geeft vreemde exception die kennelijk genegeerd kunnen worden. En het werkt ook alléén met target=x86.
  4. Commerciele library geprobeerd (ben de naam vergeten), maar het "free for non-commercial" idee betekent een nag-screen. Exit dus.
  5. MediaElement uit WPF geprobeerd te integreren, maar die crasht of geeft geen geluid. Laat maar dus, want dat is eigenlijk wel een hele slechte oplossing (want het gaat om een normale WinForms app, en geen WPF).
Het lijkt er dus op dat Mp3Sharp met z'n Mp3Stream de beste optie is, maar ik wil het geluid eigenlijk naar waveout stream, net zoals winamp dat doet. Geen afhankelijkheid van (Managed) DirectSound dus. Geen idee hoe, ik weet niet eens waar ik moet beginnen, want de audio-support in .NET lijkt belachelijk slecht te zijn.

Nootje: ik wil sowieso geen afhankelijkheid van allerlei vage componenten die stuk kunnen gaan, zoals WMP of ActiveMovie, of dat soort crap.

Weet iemand een oplossing voor mijn probleem? Denk bij die oplossing eraan dat het weleens zou kunnen dat ik geen filename aan de "player" wil geven, maar een stream ;)

日本!🎌


  • dominic
  • Registratie: Juli 2000
  • Laatst online: 02-11 11:36

dominic

will code for food

Ik zou zeggen: Probeer het toch via DirectSound, is verreweg de beste manier in .Net..

Download my music on SoundCloud


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Kijk eens naar de AudioVideoPlayback API van managed directx 9. Het staat er om bekend niet de meest geweldige API te zijn maar een simpele mp3 afspelen is wel zo gedaan.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
En moet dat managed DirectX dan ook bij de eindgebruiker geinstalleerd worden?

En natuurlijk: kan het in 64-bits? Want mijn eerste pogingen (in x64) resulteerden in een "is not a valid win32 application" exception...

[ Voor 47% gewijzigd door _Thanatos_ op 24-05-2008 16:23 ]

日本!🎌


Verwijderd

http://www.riemers.net/en.../Csharp/Series2/tut17.php

managed .net support zit in de enige echte directx enduser runtime, draait dus op iedere windows (na xp) machine

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Heel mooi, heel makkelijk, totdat:
FatalExecutionEngineError
The runtime has encountered a fatal error. The address of the error was at 0x7f5ce56b, on thread 0xe20. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
Gevolgd door:
BadImageFormatException
is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
Als ik het target platform op x86 zet, krijg ik bij het disposen van het Audio object:
AccessViolationException
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Wat nu :? :?

日本!🎌


  • TUX2K
  • Registratie: September 2001
  • Laatst online: 12-11 16:23
http://www.fmod.org/ al geprobeert?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Beetje overkill. Bovendien wil ik gewoon 1 call naar een .NET iets, en niet gaan rommelen met een x64 en een x86 versie. Gewoon DirectShow de boel laten afhandelen, maar dan wel op een manier die niet crasht.

Mijn code trouwens:
C#:
1
2
3
4
5
6
Audio mp3 = new Audio(path);
mp3.Ending += (sender, args) => {
    mp3.Stop();
    mp3.Dispose();
};
mp3.Play();

Die Dispose moet erin (en crasht de boel dus) omdat anders de decoder (ffdshow) niet vrijgegeven wordt en een icoontje in m'n system tray achterlaat. Zo simpel is trouwens precies wat ik wil. Nu nog werkend :P

[ Voor 47% gewijzigd door _Thanatos_ op 24-05-2008 18:48 ]

日本!🎌

Pagina: 1