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
Danke euch.
Die Beta Version von fmod bietet nun auch Suport für C#, gefällt mir sehr gut.
Gruß Xiller
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.
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
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
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.
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...
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.
ja sicher maxE ich wollte Dir die Arbeit nicht wegnehmen...
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Mein Beispiel ist doch komplette C# Klasse! Oder bin ich zu blöd?
Grüße Christoph
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
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
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
Hi MartinE, hast du dir mal den Startbeitrag durchgelesen? 😉
Konnte mir das nicht verkneifen,
schönes WE.
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.
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...
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.
@ 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
@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.
Original von Kasperdelasopa
@ProgrammierhansIn 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...
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
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
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
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...
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 🙂
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!
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
Kann ich mit den Mitteln hier auch Internet Radio Streams von einem SHOUTcast Server aufzeichnen?
Wohl möglich auch mit ID3 Tag speicherung?
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.
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?
Nimm doch das Singleton Pattern
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hm ok, aber wie bekomm ich dann mit das die Wiedergabe zu ende ist?
@Snail Du wolltest doch noch die Antwort posten 😃
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
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();
}
}
}