Laden...

Mp3 Stream abspielen

Erstellt von xiller vor 18 Jahren Letzter Beitrag vor 13 Jahren 60.690 Views
X
xiller Themenstarter:in
4 Beiträge seit 2005
vor 18 Jahren
Mp3 Stream abspielen

Hallo ihr,
gibt es eine Sound Engine für C# um Mp3 Streams abzuspielen?
Bereits getestet habe ich fmod, allerdings müsste ich mir da einen Wrapper selbst schreiben. Auf DirectX und den WMP würde ich gerne verzichten... 😉
Danke für eure Antworten,

Gruß Börni

S
8.746 Beiträge seit 2005
vor 18 Jahren
N
33 Beiträge seit 2004
vor 18 Jahren

Sieh dir mal das hier an

nBASS

Das basiert auf die bass.dll von un4seen.com

X
xiller Themenstarter:in
4 Beiträge seit 2005
vor 18 Jahren

Danke euch.

Die Beta Version von fmod bietet nun auch Suport für C#, gefällt mir sehr gut.

Gruß Xiller

M
456 Beiträge seit 2004
vor 18 Jahren

Warum kompliziert, wenn es einfach geht:
Windows kann das auch mit Bordmitteln:

http://www.vbarchiv.net/archiv/tipp_499.html
http://www.gamedev.net/reference/articles/article2053.asp

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Q
992 Beiträge seit 2005
vor 18 Jahren

Hier, ich glaub besser geht das nicht:

http://www.mentalis.org/soft/class.qpx?id=1

Ist auch umsonst(LGPL wenn ich mich nicht irre)!

Grüße Christoph

P
939 Beiträge seit 2003
vor 18 Jahren

hi maxE,

das sind schön einfache Beispiele, nur leider nur für VB und C++. Wäre ein gutes Thema für einen Artikel hier im Board. Wie man einfach Sound abspielen kann, sowas kann man immer brauchen.

Wenn du Lust dazu hast, da was zu schreiben, wende dich an Alexander, der trägt dich als Autor ein.

Gruss
Pulpapex

M
456 Beiträge seit 2004
vor 18 Jahren

Hmm, könnte ich eigentlich machen 😉
In Kürze werd ich da mal nen Artikel schreiben.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

4.221 Beiträge seit 2005
vor 18 Jahren

Ist gar nicht schwierig 😁


using System;
using System.Text;
using System.Runtime.InteropServices;

namespace MP3
{
	public class MP3Player
	{
		private string _Alias;

		public MP3Player(string pAlias)
		{
			this._Alias=pAlias;
		}

		public bool Play(string pFileName)
		{
			bool ret=false;
			StringBuilder retApi=new StringBuilder(new string(' ',256));
			if(GetShortPathName(pFileName,retApi,retApi.Length)>0)
			{
				//MCI öffnen
				int intMciResult=mciSendString(string.Format("open {0} type MPEGVideo alias {1}",retApi.ToString(),this._Alias),string.Empty ,0,IntPtr.Zero);

				int intPlayResult=-1;
				if (intMciResult==0)
				{
					//MP3 Play
					intPlayResult=mciSendString(string.Format("play {0} from 0",this._Alias),string.Empty ,0,IntPtr.Zero);
				}

				ret=intPlayResult==0;
			}
			return ret;
		}

		public bool Stop()
		{
			bool ret=false;
			if(mciSendString(string.Format("stop {0}",this._Alias),string.Empty ,0,IntPtr.Zero)==0)
			{
				ret=mciSendString(string.Format("close {0}",this._Alias),string.Empty ,0,IntPtr.Zero)==0;
			}
			return ret;
		}
		[DllImport("winmm.dll")]
		private static extern int mciSendString (string lpCommand,string lpReturn, int nReturnLength,IntPtr callBack);

		[DllImport("kernel32")]
		private static extern int GetShortPathName(string lpLongPath, StringBuilder lpShortPath, int Buffer);
	}
}


So sieht der ClientCode aus...


MP3.MP3Player _M=new MP3.MP3Player("myPlayer");
		private void btnPlay_Click(object sender, System.EventArgs e)
		{
			this._M.Play(@"C:\..\xy.mp3");
		}

		private void btnStop_Click(object sender, System.EventArgs e)
		{
			this._M.Stop();
		}


😁

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
456 Beiträge seit 2004
vor 18 Jahren

Ich schreib den Artikel trotzdem, da solche Fragen ja immer wieder auftauchen.
Die Wrapper Klasse werd ich noch um einige zusätzliche Features erweitern. CD-Audio, Video, usw. ...

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

4.221 Beiträge seit 2005
vor 18 Jahren

ja sicher maxE ich wollte Dir die Arbeit nicht wegnehmen...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Q
992 Beiträge seit 2005
vor 18 Jahren

Mein Beispiel ist doch komplette C# Klasse! Oder bin ich zu blöd?

Grüße Christoph

P
939 Beiträge seit 2003
vor 18 Jahren

Ja, aber da braucht man eine spezielle Bibliothek dafür. Die muss mit der Anwendung mitgeliefert werden.

Wenn man nur ein kleines Programm schreiben möchte, das Mp3s abspielen können soll, ist es doch schön, wenn man mit Boardmitteln auskommen kann, auch wenn die Funktionen sehr rudimentär sind. Besonders, wenn es so einfach ist.

Für komplexere Geschichten ist eine fertige Bibliothek besser geeignet, keine Frage.

Gruss
Pulpapex

J
187 Beiträge seit 2005
vor 18 Jahren

Hallo,

Momentan verwende ich die Klasse von Programmierhans, in einem Projekt, in dem das Abspielen einer MP3-Datei völlig ausreicht.
Meine Frage ist jetzt, ob es die Möglichkeit gibt, die Klasse zu erweitern, um festzustellen, ob eine MP3-Datei fertig abgespielt ist, d.h. das Ende festzustellen.

MfG
Jens

M
49 Beiträge seit 2005
vor 18 Jahren
Managed DirectX für Audioplayback

Hallo.

Sehr einfach zu verwenden für die Wiedergabe von Audio- und Video-Material ist Managed DirectX, die Erweiterung für DirectX seit DirectX 8. Wer die DirectX Redistributional schon mal installiert hat (wer hat das eigentlich nicht), dem ist vielleicht am Ende das kleine Fenster mit "Managed blabla" aufgefallen.

Um damit zu entwickeln lädt man sich am besten das DirectX SDK (aktuelle Version Feburar 05 Update) herunter. Danach kann man in seine Projekte die "DirectX.AudioVideoPlayback.dll" einbinden. Danach ist die Sache einfach.


using Microsoft.DirectX.AudioVideoPlayback;

...

string filename = "Song.mp3";
Audio audioPlayback = new Audio(filename);
audioPlayback.Play();

...

Die Klasse Audio bietet noch viele weitere Eigenschaften und Methoden an das Playback zu steuern, z.B. Position, Lautstärke, u.s.w.
Im Hintergrund verwendet DirectX Codecs, die auf dem Rechner installiert sind. Daher wird das Playback auch für andere Formate wie WAV, WMA, u.s.w. funktionieren.

Video-Playback ist übrigens ähnlich einfach. Dies regelt (wie sollte es anders sein) natürlich die Klasse "Video". Viel Spaß beim Probieren.

-Martin Ehrlich


Martin Ehrlich

P
939 Beiträge seit 2003
vor 18 Jahren

Hi MartinE, hast du dir mal den Startbeitrag durchgelesen? 😉

Konnte mir das nicht verkneifen,
schönes WE.

M
456 Beiträge seit 2004
vor 18 Jahren

Geduldet euch nur 😉
Ich setze den Artikel heute Abend online.
Er wird auch erklären, wie man die aktuelle Abspielposition ermittelt.
Ein kleiner simpler Medien-Player, mit dem man Videos, MP3s, WMAs und CDs abspielen kann, werd ich mit zum Artikel packen.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

4.221 Beiträge seit 2005
vor 18 Jahren

Wenn man den send um ein notify erweitert


mciSendString(string.Format("play {0} from 0 notify",this._Alias),string.Empty ,0,this.Handle);

dann kann man im Fenster ode Control welches this.Handle repräsentiert eine Benachrichtigung abfangen wenn der play fertig ist.


protected override void WndProc(ref Message m)
{
	base.WndProc (ref m);
	if (m.Msg==MM_MCINOTIFY)
	{
		//ich hatte hier ein Problem, dass er hier immer 2 mal reingelaufen ist 
		//mit einem ganz kurzen Thread.Sleep trat es nimmer auf
		Thread.Sleep(1);
		//schliessen
		mciSendString(string.Format("close {0}",this._Alias),string.Empty ,0,this.Handle);
		//Play Complete
	}
}	
}

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
456 Beiträge seit 2004
vor 18 Jahren

So der Artikel ist online.
Ich hoffe das Beispielprogramm demonstriert die Verwendung von MCI ganz gut.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Z
457 Beiträge seit 2007
vor 16 Jahren

@ Programmierhans

ich habe gerade dein beispiel ausprobiert nur gibt mir mciSendString immer den Fehler 263 zurück.

in der msdn finde ich auch nichts was mir weiterhilft.

zur info. ich will nur ein mp3 audio stück abspielen.

mfg
Zebes

Z
457 Beiträge seit 2007
vor 16 Jahren

kann es sein das mci unter windows 64 nicht geht?

K
118 Beiträge seit 2006
vor 16 Jahren

@Programmierhans

In welche Klasse ich den diese Methode reinschreiben, damit ich es abfangen kann wenn das Lied zu ende ist?

Ich habe noch nicht so viel Übung in den Dingen.

Z
457 Beiträge seit 2007
vor 16 Jahren

hat denn keiner erfahrung mit dem system gemacht?

4.221 Beiträge seit 2005
vor 16 Jahren

Original von Kasperdelasopa
@Programmierhans

In welche Klasse ich den diese Methode reinschreiben, damit ich es abfangen kann wenn das Lied zu ende ist?

Im Form oder UserControl in welchem Du das MP3 startest.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Z
457 Beiträge seit 2007
vor 16 Jahren

Weis keiner was zu der Fehler nummer? ich habe mitlerweile mehrere beispiele aus dem internet ausprobiert. leider haben alle nicht funktioniert. gibt es noch eine alternative zu mci? am besten etwas das voraussichtlich auf jedem rechner laufen wird.

mfg
Zebes

Z
457 Beiträge seit 2007
vor 16 Jahren

ok ich glaube ich weiß was der fehler war. im thread [Tutorial] Audio- und Videowiedergabe mit MCI steht die antwort. und zwar muss die applikation als [STAThread] eingestellt sein.

ich habe das jetzt nur hier auf der arbeit getestet und werde das zu hause nochmal überprüfen da ich hier den fehler 266 bekommen habe und zuhause 265.

mfg
Zebes

Z
457 Beiträge seit 2007
vor 16 Jahren

ok das wars wohl doch noch nciht so ganz.

ich habe das nun zuhause nochmal auf meinem 62 bit windows ausprobiert aber da bekomme ich nun die fehlermeldung "The specified device is not open or is not recognized by MCI."

allerdings ist der code der selbe wie auf dem 32 bit system.

gibt es noch andere voraussetzungen die für MCI erfüllt sein müssen?

mfg
Zebes

4.221 Beiträge seit 2005
vor 16 Jahren

Original von Zebes
ok das wars wohl doch noch nciht so ganz.

ich habe das nun zuhause nochmal auf meinem 62 bit windows ausprobiert aber da bekomme ich nun die fehlermeldung "The specified device is not open or is not recognized by MCI."

Ev. ist Dein Windows defekt... scheint so als hättest Du 2 bits verloren 🙂

PS: Ja ich gebe es zu mein Post ist nicht wirklich todernst gemeint 🙂

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

32 Beiträge seit 2007
vor 16 Jahren

Ich habe zu der Klasse vom Programmierhans mal eine kleine Frage:

vorab: sie funktioniert tadellos, sprich ich kann damit problemlos MP3s abspielen.

Aber: ich habe Störgeräusche dabei, als eine Art "Ploppen" bei manchen Tiefen. Habe ich bei der selben Datei abgespielt mit WinAMP oder dem MediaPlayer nicht.

Jemand eine Ahnung, woran es liegen könnte?

Edit: Hat sich erledigt, ich Löse es nun ohne dieses Knacken per DirectX 🙂

N
52 Beiträge seit 2008
vor 16 Jahren

Das Beispiel von Programmierhans funktioniert perfekt.
Danke dir!

Dies bezieht sich aber auf MP3-Dateien.
Ich wollte noch einen Radio Stream auf ein OnClick Button setzen. Hat sich schwer gestaltet^^. Wie macht man das am besten?

Ich habe dies nun nicht wirklich schon gemacht. Habe eine Batchdatei erstellt, die den stream startet und auf das OnClick des Buttons startet der Batch!

Unschön aber machbar.

Habt ihr ne bessere Idee?

Gruss Narnaja
Projekt GloDaS

--> You need technical support? PM to me!

268 Beiträge seit 2008
vor 15 Jahren

Hallo.

Sehr einfach zu verwenden für die Wiedergabe von Audio- und Video-Material ist Managed DirectX, die Erweiterung für DirectX seit DirectX 8. Wer die DirectX Redistributional schon mal installiert hat (wer hat das eigentlich nicht), dem ist vielleicht am Ende das kleine Fenster mit "Managed blabla" aufgefallen.

Um damit zu entwickeln lädt man sich am besten das DirectX SDK (aktuelle Version Feburar 05 Update) herunter. Danach kann man in seine Projekte die "DirectX.AudioVideoPlayback.dll" einbinden. Danach ist die Sache einfach.

  
using Microsoft.DirectX.AudioVideoPlayback;  
  
...  
  
string filename = "Song.mp3";  
Audio audioPlayback = new Audio(filename);  
audioPlayback.Play();  
  
...  
  

Die Klasse Audio bietet noch viele weitere Eigenschaften und Methoden an das Playback zu steuern, z.B. Position, Lautstärke, u.s.w.
Im Hintergrund verwendet DirectX Codecs, die auf dem Rechner installiert sind. Daher wird das Playback auch für andere Formate wie WAV, WMA, u.s.w. funktionieren.

Video-Playback ist übrigens ähnlich einfach. Dies regelt (wie sollte es anders sein) natürlich die Klasse "Video". Viel Spaß beim Probieren.

-Martin Ehrlich

huhu , wenn ich das so mache wie du sagst bekomme ich folgende Fehlermeldung:

Die DLL "C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll" unternimmt einen Versuch, innerhalb der Sperre für den OS-Loader eine verwaltete Ausführung durchzuführen. Versuchen Sie nicht, verwalteten Code innerhalb einer DllMain- oder Bildinitialisierungsfunktion auszuführen, da dies ein Hängen der Anwendung zur Folge haben kann.

code:

private void button2_Click(object sender, EventArgs e)
        {
           
            OpenFileDialog open = new OpenFileDialog();
            if (open.ShowDialog() == DialogResult.OK)
            {

                //Hier das öffnen und ausführen:

                string filename =open.FileName;
                Audio audioPlayback = new Audio(filename);
                audioPlayback.Play();
            }
        }

ACHTUNG: Hab den fehler selbst gefunden , einfach auchnoch Microsoft.DirectX einbinden !

Mfg Scarecraft

Name: Scarecraft
Language:C#
learning since:winter 2007
IDE: Visual Studio 2005/08 Professional Editon
Skill:Medium
qualifications: MCP - Microsoft Certified Professional
Homepage : FX RPG Maker

L
553 Beiträge seit 2007
vor 15 Jahren

Kann ich mit den Mitteln hier auch Internet Radio Streams von einem SHOUTcast Server aufzeichnen?
Wohl möglich auch mit ID3 Tag speicherung?

R
150 Beiträge seit 2006
vor 15 Jahren

Wenn man den send um ein notify erweitert

  
mciSendString(string.Format("play {0} from 0 notify",this._Alias),string.Empty ,0,this.Handle);  
  

dann kann man im Fenster ode Control welches this.Handle repräsentiert eine Benachrichtigung abfangen wenn der play fertig ist.

  
protected override void WndProc(ref Message m)  
{  
  base.WndProc (ref m);  
  if (m.Msg==MM_MCINOTIFY)  
  {  
  	//ich hatte hier ein Problem, dass er hier immer 2 mal reingelaufen ist   
  	//mit einem ganz kurzen Thread.Sleep trat es nimmer auf  
  	Thread.Sleep(1);  
  	//schliessen  
  	mciSendString(string.Format("close {0}",this._Alias),string.Empty ,0,this.Handle);  
  	//Play Complete  
  }  
}	  
}  
  

Gibt es eine Möglichkeit, festzustellen, wann eine Datei fertig abgespielt wurde, wenn man das ganze Soundmanagement mit MCI in einer statischen Klasse macht? Weil da habe ich ja kein Handle. Kann man vielleicht eines künstlich erzeugen?
Das Problem ist, dass der MCI keinen neuen Sound abspielt, bis man den alten gestoppt hat (auch wenn der schon ganz abgespielt wurde).

EDIT:
Ich habe eine Lösung gefunden: Ich setze einfach ein stop (über mciSendString) vor dem Abspielen (play), dann kann der gleiche Sound öfter abgespielt werden.
Aber ich wäre trotzdem für eine Antwort dankbar. Das obige könnte ich vielleicht an anderer Stelle noch gut gebrauchen.

S
5 Beiträge seit 2010
vor 13 Jahren

Ist zwar schon etwas her aber noch keine Antwort dazu.
Und zwar zur letzten Frage von Red_Wraith welche mich auch sehr interessiert.

Gibt es eine Möglichkeit, festzustellen, wann eine Datei fertig abgespielt wurde, wenn man das ganze Soundmanagement mit MCI in einer statischen Klasse macht?

4.221 Beiträge seit 2005
vor 13 Jahren

Nimm doch das Singleton Pattern

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
5 Beiträge seit 2010
vor 13 Jahren

Hm ok, aber wie bekomm ich dann mit das die Wiedergabe zu ende ist?

4.221 Beiträge seit 2005
vor 13 Jahren

@Snail Du wolltest doch noch die Antwort posten 😃

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
5 Beiträge seit 2010
vor 13 Jahren

So hab ich es jetzt gemacht.

using System; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
using System.Threading; 
using System.Diagnostics; 
using Extension;

namespace MCI 
{ 
        public class MCI : Control, IDisposable 
        { 
                [DllImport("winmm.dll")] 
                private static extern int mciSendString(string cmd, StringBuilder ret, int retLen, IntPtr hwnd);

                private string File; 
                private static volatile MCI instance=null; 
                
                private MCI() {}

                public static MCI Instance 
                { 
                        get { 
                                if(instance==null) { instance=new MCI(); } 
                                return instance; 
                        } 
                }

                public event EventHandler<EventArgs> PlayFinishEvent; 
                protected virtual void onPlayFinish(EventArgs e) 
                { 
                        PlayFinishEvent.Raise(this, e); 
                } 
                
                private int MM_MCINOTIFY = 0x3B9; 
                protected override void WndProc(ref Message m) 
                { 
                        base.WndProc (ref m); 
                        if (m.Msg==MM_MCINOTIFY) 
                        { 
                                Thread.Sleep(1); 
                                Debug.WriteLine("WndProc: Wiedergabe zuende"); 
                                onPlayFinish(new EventArgs()); 
                        } 
                } 
                
                
                
                public void Open(string file, string type) 
                { 
                        this.File = file; 
                        mciSendString("open \"" +File +"\" type " +type +" alias \"" +File +"\"", null, 0, IntPtr.Zero);

                }

                public void Play() 
                { 
                        mciSendString("play \"" +File +"\" notify", null, 0, this.Handle); 
                } 
                
                public void PlayRepeat() 
                { 
                        mciSendString("play \"" +File +"\" repeat", null, 0, IntPtr.Zero);  //Wiedergabe mit Repeat 
                } 
                
                public void Stop() 
                { 
                        mciSendString("stop \"" +File +"\"", null, 0, IntPtr.Zero); 
                        mciSendString("seek \"" +File +"\" to start", null, 0, IntPtr.Zero); //Position an Anfang setzen

                }

                public void Close() 
                { 
                        mciSendString("close \"" +File +"\"", null, 0, IntPtr.Zero); 
                }

                public new void Dispose() 
                { 
                        Stop(); 
                        Close(); 
                        base.Dispose(); 
                } 
        } 
}