• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[C#] Musikplayer programmiert, aber es fehlen noch Features

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
Ich habe mir einen kleinen Player programmiert. Er soll folgende Features haben:

- Die MP3-Dateien aus einem vordefinierten Verzeichnis in einer Listbox auflisten
- MP3 die ausgewählt wird nach Doppelklick oder Klick auf den "Play"-Button abspielen
- Fortschritt anzeigen
- Das Lied, das gerade läuft anzeigen ("Now Playing:")
- Lautstärkeregler

- Als Control verwende ich den Windows Media Player, aber ich habe eigene Buttons gemacht und das Media Player Control auf Transparent geschaltet
- Als Fortschrittsanzeige verwende ich einfach eine Progressbar
- Als Lautstärkeregler muss ein vertikaler Scrollbalken herhalten

Folgendes habe ich schon geschafft:
- Design so wie ich es haben will
- Auflisten der Dateien im gewünschten Verzeichnis
- Abspielen der ausgewählten MP3-Datei
- Lied stoppen

Was ich will:
- In der Listbox sollen nur die MP3s erscheinen. Bislang wird der komplette Pfad angezeigt
- Die ID3-Information soll angezeigt werden. Der Dateiname sieht unschön aus

- Fortschrittsbalken funktioniert nicht
- Lautstärkeregler funktioniert nicht

Ich bitte um eure Unterstützung. Das ganze muss nicht professionell sein. Simple Funktionen, damit es einfach funktioniert reichen vollkommen aus.

Diesen Code habe ich bislang (Ja, ich weis. Viel ist das nicht):
[src=csharp] private void Player_Load(object sender, EventArgs e)
{
listBox1.Items.AddRange(Directory.GetFiles(@"C:\mp3", "*.mp3"));
}

private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
axWindowsMediaPlayer1.URL = listBox1.SelectedItem.ToString();
axWindowsMediaPlayer1.Ctlcontrols.play();
txtNowPlaying.Text = "Now playing: " + listBox1.SelectedItem;
}

private void cmdStop_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}[/src]
 
Zuletzt bearbeitet:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Besser wäre es, Du würdest konkrete Fragen formulieren.
Dann wird Dir auch selber klarer, wo es Dir mangelt.

Also, z.B.:
"Wie kann ich bei GetFiles einen bestimmten Dateityp filtern?"*
"Wie kann ich mp3 tags auslesen?"**

Man muß Daten auch nicht mit einem Einzeiler in ein Control laden. Vielleicht erst mal das Lesen und dann die Bindung.
Dazwischen könnte man dann die Möglichkeit abhandeln, daß eine Datei keine Tags hat und dann alternativ z.B. den Dateinahmen nehmen.

* z.B listBox1.Items.AddRange(Directory.GetFiles(@"C:\mp3","*.mp3"));
** sicher besser mit einer Fremdkomponente
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #3
OK, das mit dem "listBox1.Items.AddRange(Directory.GetFiles(@"C:\mp3","*.mp3"));" habe ich noch alleine rausgefunden, aber ich kann die Fragen auch gerne ausformulieren:

1) Wie kann ich die ID3-Tags (Artist + Title genügen) auslesen und in der Listbox anzeigen lassen?
2) Wie kann ich den Fortschritt in der Progressbar anzeigen lassen?
3) Wie bastel ich mir einen Lautstärkeregler mit dem "vScrollBbar"-Element

Ich glaube mit diesen Dingen hätte ich erstmal eine passable Version 1.0 meines Players. Für eine Folgeversion habe ich auch Ideen, aber erstmal sollen es diese grundlegenden Dinge sein.

Die Frage, wie man sich NUR die Dateien (Ohne kompletten Pfad) anzeigen lassen kann habe ich bewusst weggelassen, weil ich das Gefühl habe ich könnte es noch selbst herausfinden. Bei den anderen Dingen habe ich aber nicht einmal einen Ansatz)

Edit:

So habe ich es nun hinbekommen. Problem ist nun aber, dass die Lieder nicht mehr abgespielt werden, weil die Dateien nicht mehr gefunden werden.
[src=csharp] private void Player_Load(object sender, EventArgs e)
{
string[] files = Directory.GetFiles(@"C:\mp3", "*.mp3");
foreach (string file in files)
listBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
}

private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (File.Exists(listBox1.SelectedItem.ToString()))
{
axWindowsMediaPlayer1.URL = listBox1.SelectedItem.ToString();

axWindowsMediaPlayer1.Ctlcontrols.play();
txtNowPlaying.Text = "Now playing: " + listBox1.SelectedItem;
}
else
{
MessageBox.Show("Datei nicht vorhanden");
}
}[/src]
 
Zuletzt bearbeitet:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Du solltest die Infos zu den Dateien in irgend einen Konstrukt zusammenfassen und dann z.B. als Liste an die Box binden. Jedes Element hat dann mehrer Eigenschaften. Den Pfad, den Dateinamen, den mp3 Tag...
Du gibst die Liste als Datasource an und wählst dann ValueMember und DataMember. Also, welche Eigenschaft in der Liste sichtbar sein soll und welche die Daten, also hier den Pfad, enthält.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.563
Ich weiß nicht genau wie es in C Sharp geht, aber folgende Tips würde ich dir geben:

Gibt es in C# nicht die Möglichkeit von einem Pfad den Dateinamen ausgeben zu lassen? Zum Beispiel in Funktionen die Pfade verarbeiten? Sowas wie "getBaseFileName"/"getPathString"(oder etwas äquivalentes?), danach würde ich suchen.

Zum Beispiel sowas hier:
https://msdn.microsoft.com/de-de/library/system.io.path.getfilename(v=vs.110).aspx

Für die Dateinamen könntest du eine Map oder ein mehrdimensionales Array nehmen, welche folgende Werte enthält:
1) Position in der Liste
2) URL (Dateipfad + Dateiname) (für die Identifikation)
3) Pfad
4) Dateiname
5) Laufzeit der Mp3 (hier mußt du vielleicht die Tags auslesen)

Wie du bestimmen kannst wie viel % abgespielt werden, ganz einfach in dem du die Stunden/Minuten/Sekunden in Sekunden umwandelst und dann versuchst zu sagen, 10 von 120 Sekunden abgespielt sind X Prozent. Das würde ich aber daran abgleichen, welchen Status dir der Mediaplayer zurückgibt - also ob du den Wert bekommst an welcher Sekunde du dich befindest.


Um deine Frage zu Mp3 Metadaten/Tags zu stellen - downloade dir einen Hex-Editor, zum Beispiel "HexEdit" und untersuche damit die Mp3s.
Das machst du dann mit Mp3s wo du genau weißt das diese Mp3 Metadaten/Tags enthalten.

Eine generelle Struktur ist hier zu finden:
https://upload.wikimedia.org/wikipedia/commons/0/01/Mp3filestructure.svg

Dort steht auch noch nicht wirklich etwas von den Metadaten / Tags... da gibt es auch mehrere Formate, aber vielleicht sind diese relativ generell aufgebaut... ich würde aber erst einmal eine bzw. dann später drei/vier unterschiedliche Mp3s untersuchen und in deine Anwendung zum einlesen "hineinziehen" (du hast ja schon das Interface dafür).

Dann den Mp3 Metadaten auslesen lassen, mittels einen Parsers - und die Ausgabe in einem Konsolenfenster ausgeben lassen.

Mal ein Beispiel:
[src=text]00000000: 4944 3303 0000 0000 1260 5441 4c42 0000 ID3......`TALB..
00000010: 0043 0000 01ff fe4d 006f 006e 0064 006f .C.....M.o.n.d.o
00000020: 0020 0053 0065 0078 0020 0048 0065 0061 . .S.e.x. .H.e.a
00000030: 0064 0020 0028 0044 0065 006c 0075 0078 .d. .(.D.e.l.u.x
00000040: 0065 0020 0045 0064 0069 0074 0069 006f .e. .E.d.i.t.i.o
00000050: 006e 0029 0000 0054 5243 4b00 0000 0600 .n.)...TRCK.....
00000060: 0000 312f 3138 0054 504f 5300 0000 0300 ..1/18.TPOS.....
00000070: 0000 3100 5443 4f4e 0000 0025 0000 01ff ..1.TCON...%....
00000080: fe49 006e 0064 0075 0073 0074 0072 0069 .I.n.d.u.s.t.r.i
00000090: 0061 006c 0020 004d 0065 0074 0061 006c .a.l. .M.e.t.a.l
000000a0: 0000 0054 4954 3200 0000 6900 0001 fffe ...TIT2...i.....
000000b0: 5400 6800 7500 6e00 6400 6500 7200 2000 T.h.u.n.d.e.r. .
000000c0: 4b00 6900 7300 7300 2000 2700 3600 3500 K.i.s.s. .'.6.5.
000000d0: 2000 2800 4a00 4400 6500 7600 6900 6c00 .(.J.D.e.v.i.l.
000000e0: 2000 4e00 7500 6d00 6200 6500 7200 2000 .N.u.m.b.e.r. .
000000f0: 4f00 6600 2000 5400 6800 6500 2000 4200 O.f. .T.h.e. .B.
00000100: 6500 6100 7300 7400 2000 5200 6500 6d00 e.a.s.t. .R.e.m.
00000110: 6900 7800 2900 5450 4531 0000 0035 0000 i.x.).TPE1...5..
00000120: 01ff fe52 006f 0062 0020 005a 006f 006d ...R.o.b. .Z.o.m
00000130: 0062 0069 0065 0020 0026 0020 0057 0068 .b.i.e. .&. .W.h
00000140: 0069 0074 0065 0020 005a 006f 006d 0062 .i.t.e. .Z.o.m.b
00000150: 0069 0065 0054 5945 5200 0000 0b00 0001 .i.e.TYER.......
00000160: fffe 3200 3000 3100 3200 0000 0000 0000 ..2.0.1.2.......
00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................
[/src]

Ist ein solcher Mp3 Metadata Block, ganz am Anfang der Datei. Hier könnte natürlich noch viel drin stehen, aber das mußt du filtern/parsen.

Nur so ein paar Tips/Hinweise :)
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #6
Also ich habe jetzt viel probiert und wenig erreicht.
Ich habe vor "private void Player_Load(object sender, EventArgs e)"
ein
[src=csharp]string selectedTrack;[/src]
gepackt. Aber egal wie ich es anstelle ich bekomme den Pfad der ausgewählten Datei am Ende nicht ausgelesen
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.563
Vielleicht hast du das schon im Griff das er jetzt wieder die Dateien findet, aber:
[src=csharp]
listBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
[/src]

liefert doch den gesamten Dateipfad ohne die Endung ".mp3" - und beim abspielene mit:

[src=csharp]
// + ".mp3" - angeben wegen des obigen Befehls, sonst wird der Pfad (also die Datei mit Erweiterung) nicht gefunden
if (File.Exists(listBox1.SelectedItem.ToString() + ".mp3"))
{
axWindowsMediaPlayer1.URL = listBox1.SelectedItem.ToString() + ".mp3";[/src]


Wie du den Dateinamen bekommst, ich würde mal schätzen so:
[src=csharp]Path.GetFileName(listBox1.SelectedItem.ToString());[/src]

oder auch hier:
[src=csharp]foreach (string file in files) {
listBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
string fullPath = file // => "C:\mp3\Meine.mp3
string selectedTrackMp3 = Path.GetFileName(file); // Nun ist selectedTrack der Dateiname mit Endung => Meine.mp3
string selectedTrack = Path.GetFileNameWithoutExtension(file); // => 'Meine'
string trackFolder = Path.GetDirectoryName(file); // => 'C:\mp3'
}[/src]

Schau dir mal die Beispiele hier dazu an:
https://msdn.microsoft.com/de-de/library/system.io.path.getdirectoryname(v=vs.110).aspx
https://msdn.microsoft.com/de-de/library/system.io.path.getfilename(v=vs.110).aspx
https://msdn.microsoft.com/de-de/library/system.io.path.getfullpath(v=vs.110).aspx
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Das ist nicht der Pfad, das ist der reine Dateiname.

Du muß einmal den Pfad und einmal den Namen speichern.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #9
Wenn ich mir den Pfad ausgeben lassen will bekomme ich beim Programmstart direkt einen Ausnahmefehler

[src=csharp]selectedTrack = Path.GetFileName(listBox1.SelectedItem.ToString());[/src]
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.563
@Cyperfriend:

Vermutlich ist das "SelectedItem" noch nicht selektiert bzw. leer, deshalb kommt ein Fehler? Würde ich vermuten.
Kommt aber auch darauf an was du in deiner Listbox1 schon gespeichert hast, bzw. ob Daten vorliegen und so weiter.

Ansonsten, versuch doch mal testweise die Ausgaben durch zugehen die du in deiner Einleseroutine bekommst, damit du ein Gefühl bekommst was die Funktionen machen. :)
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #12
Was bedeutet "selektiert"? (Definiert habe ich es ja oben. Reicht das nicht?)
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #14
Achso, jetzt weis ich was ihr meintet. Klar, habe das beim Programmstart eingefüht und da ist noch nichts ausgewählt. Ich habe das jetzt in die Routine
[src=csharp]listBox1_MouseDoubleClick[/src] eingefügt und bekomme dann mit
[src=csharp]selectedTrack = Path.GetFileName(listBox1.SelectedItem.ToString());
label1.Text = selectedTrack;
[/src]
nur wieder den Dateinamen ohne Dateiendung. Bin also genau so weit wie vorher auch :(
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.563
Was willst du denn angezeigt haben?

Ach Mensch, ich steh aufm Schlauch....

Der Befehl "GetFileName" kann natürlich auch nur das Auslesen was in der Listbox steht.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.563
@KaPiTN:

War ja auch nur ein Spaß :)

@Cyperfriend:

Was steht denn in deiner Listbox? - Ein Eintrag, wie sieht der aus? - Steht da der Pfad/Dateiname mit Dateierweiterung drin?
Ansonsten kann die Funktion dir für "selectedTrack" auch nur das ausgeben, was du in der Listbox gespeichert hast.

Du mußt die Daten wie kompletten Pfad und Co anders speichern, so das du daraus mit den Befehlen alles herausziehen kannst, was du darstellen lassen willst, wenn die Info nicht im Feld steht, ist sie auch nicht da. Das wird dir nicht abgenommen das anderswo zu finden/herauszulesen. So fern du nicht den kompletten Pfad dort einträgst.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Du kappst beim Füllen der Listbox die Endung ab und wunderst Dich dann, daß sie später nicht mehr da ist?
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #19
In der Listbox steht nur noch der Dateiname ohne Dateityp (also ohne das .mp3)
Das Ganze sieht so aus:
[src=csharp]private void Player_Load(object sender, EventArgs e)
{
string[] files = Directory.GetFiles(@"C:\mp3", "*.mp3");
foreach (string file in files)
listBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
}[/src]

Du kappst beim Füllen der Listbox die Endung ab und wunderst Dich dann, daß sie später nicht mehr da ist?
Das habe ich schon korrigiert:
[src=csharp]selectedTrack = Path.GetFileName(listBox1.SelectedItem.ToString()) + ".mp3";[/src]

Grundsätzlich wäre die Frage, ob ich das alles überhaupt so machen muss. Später möchte ich die Listbox ja mit den ID3-Informationen füllen, aber als ersten Schritt sehe ich es eigentlich ganz sinnvoll an (und wenn ich sehe was für Umstände das schon wieder bereitet werde ich schon wieder mutlos)
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Ich hatte schon geschrieben, daß die Liste mehrere Dimensionen haben kann.
 
Oben