Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Problem mit TMediaPlayer (https://www.delphipraxis.net/216394-problem-mit-tmediaplayer.html)

Amateurprofi 20. Dez 2024 21:55

Problem mit TMediaPlayer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe ein Problem mit dem MediaPlayer.
Windows 7 - Delphi XE 2.
Ich habe ein Programm geschrieben, mit dem ich meine .mp3 abspiele.
Klappt auch in der Regel, aber bei einigen Dateien popt nach
Delphi-Quellcode:
Player.FileName:=Dsn;
Player.Open;
Player.Play;
ein Fenster (siehe Anhang) auf und die betreffende Datei wird nicht wiedergegeben.
Nachdem ich ca. 12000 .mp3's manuell überprüft habe, möchte ich die restlichen ca. 70000 .mp3's automatisch prüfen lassen.
Problem: Ich habe keine Vorstellung, wie ich erkennen kann, ob die .mp3 'ne Macke hat.
Mein Versuch, nach Player.Open oder auch nach Player.Play mit
Delphi-Quellcode:
Result:=not Assigned(Player.Display) or not Player.Display.Visible;
schlägt fehl.
Hat jemand eine Idee, wie ich prüfen kann, ob die .mp3 abgespielt wird, oder nicht.

jaenicke 20. Dez 2024 23:34

AW: Problem mit TMediaPlayer
 
Du könntest nach einer kurzen Wartezeit State auf mpPlaying prüfen oder auf Position > 0.

Bist du sicher, dass die MP3 Datei das Problem ist? Der TMediaPlayer hat durchaus einige Probleme, z.B. mit manchen Dateien. Sinnvoller wäre z.B. die Verwendung der Bass DLL.

Christian Seehase 21. Dez 2024 09:52

AW: Problem mit TMediaPlayer
 
Moin Klaus,

das Problem hatte ich mit TMediaPlayer auch schon.
Als Abhilfe hatte ich mir dann die VLC-Player-API übersetzt.
Damit konnte ich dann die vom MP verschmähten Dateien abspielen.
Wenn ich mich recht entsinne, waren immer Dateien vom MP nicht
abspielbar, die bestimmte Metadaten enthielten, z.B., Cover.

Gausi 21. Dez 2024 11:20

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von jaenicke (Beitrag 1544510)
Bist du sicher, dass die MP3 Datei das Problem ist?

Sicher kann man da nicht sein, aber das ist sehr gut möglich. Bei Windows 7 und mp3 sollte man generell vorsichtig sein. Da waren z.B. mp3-Dateien mit dem ID3-Tag in Version 2.4 ein Problem. Diese Version wurde aber auch damals schon z.B. von iTunes genutzt. Den hat Windows nicht verstanden und beim Bearbeiten der Metadaten dann zusätzlich einen in Version 2.3 davor gepackt, sodass die vorher enthaltenen Metadaten auch für korrekt arbeitende Player und Tagger erstmal weg waren. Und wenn der 2.4er-Tag zu groß war (z.B. wegen Cover-Art), dann hat die Abspiel-Engine möglicherweise die Suche nach dem ersten MPEG-Header zu früh abgebrochen und die Datei als ungültig empfunden.

Oder kurz: die mp3s sind (wahrscheinlich) in Ordnung, die Macke liegt bei Windows. ;-)

Andere Verfahren (wie die genannte bass.dll) benötigen zwar etwas mehr Einarbeitung, sind aber definitiv sinnvoller als die TMediaPlayer-Komponente.

jaenicke 21. Dez 2024 14:59

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von Gausi (Beitrag 1544515)
Oder kurz: die mp3s sind (wahrscheinlich) in Ordnung, die Macke liegt bei Windows. ;-)

Das wollte ich damit sagen. Das ist wohl falsch rübergekommen.

Gausi 21. Dez 2024 15:38

AW: Problem mit TMediaPlayer
 
Du kannst ja mal die bereits als "fehlerhaft" erkannten Files checken, wie es da mit den ID3Tags aussieht. Wenn meine Vermutung richtig ist, sollte mit diesem Code als Versionsstring "2.4.0" ausgeben werden, und die Größe jeweils einen bestimmten Schwellenwert überschreiten. Der Test schlägt allerdings fehl, wenn Windows die Datei schon verpfuscht hat. Dann guck die Datei mal in einem Hex-Editor an und schau, ob der String "ID3" mehr als nur einmal vorkommt (und es dahinter so aussieht als stünden da Infos wie Titel oder Interpret). Falls ja, ist die Datei kaputt. Reparieren geht über "ID3Tag löschen" mit einem anständigen Tagger. Dann wird (vermutlich) der Windows-Murks vorne gelöscht, und der Original-Tag sollte wieder vorne stehen.

Delphi-Quellcode:
uses Mp3Files; // aus meiner AWB, https://github.com/DanielGausi/AudioWerkzeugeBibliothek

procedure TForm1.ShowInfo(aFile: String);
var
  mp3File: TMp3File;
begin
  mp3File := TMp3File.Create;
  try
    mp3File.ReadFromFile(aFile);
    memo1.Lines.Add(mp3File.ID3v2Tag.VersionString);
    memo1.Lines.Add(mp3File.ID3v2TagSize.ToString);
  finally
    mp3File.free;
  end;
end;
Falls das so ist, kannst du damit ggf. ein kleines Testprogramm schreiben, das dir die nicht abspielbaren Files auflistet. Die Tags von 2.4 nach 2.3 zu konvertieren ist zwar prinzipiell möglich (bis auf ggf. ein paar Ausnahme-Felder). Ob es dafür Tools gibt, weiß ich nicht. Evtl. kann Mp3Tag das.

Amateurprofi 7. Jan 2025 11:00

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von jaenicke (Beitrag 1544510)
Du könntest nach einer kurzen Wartezeit State auf mpPlaying prüfen oder auf Position > 0.

Bist du sicher, dass die MP3 Datei das Problem ist? Der TMediaPlayer hat durchaus einige Probleme, z.B. mit manchen Dateien. Sinnvoller wäre z.B. die Verwendung der Bass DLL.

Sorry für die späte Reaktion - war mit anderen Sachen sehrst beschäftigt.
Danke für die Tipps.
Zu "Position > 0"
In der Regel funktioniert das, aber gelegentlich leider nicht.
Hatte einen Fall, da wurde kurz angespielt und dann abgebrochen.
Zu "bass.dll"
Wusste gar nicht, dass man damit auch Dateien abspielen kann.
Wie auch immer:
Ich habe einige Hemmungen, in meinem Programm grundlegende Dinge zu ändern, weil: verbessere ich links etwas, mache ich rechts etwas kaputt.
Die Alternative wäre, das Ganze komplett neu zu schreiben, aber das ist mir, zumindest zur Zeit, zu aufwendig.
Zu "dass die MP3 Datei das Problem ist?"
Nein, denn mit dem Windows-Mediaplayer werden diese Dateien korrekt abgespielt.
Wenn ich eine "fehlerhafte" .mp3 mit WavePad
1) Als .wav speichere
2) Die .wav in .mp3 konvertiere
wird die auch bei mir korrekt abgespielt.
Gelegentlich musste ich das mehrfach machen (3 Mal war bisher das Maximum).

Gausi 7. Jan 2025 11:24

AW: Problem mit TMediaPlayer
 
Schick mir mal bitte so eine problematische mp3 per Mail (mail ät gausi.de), oder einen Download-Link per PN oder so. Das interessiert mich jetzt doch ein wenig mehr.
Besonders das "Gelegentlich musste ich das mehrfach machen". Das macht ja so gar keinen Sinn ...

Amateurprofi 7. Jan 2025 11:26

AW: Problem mit TMediaPlayer
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Gausi (Beitrag 1544521)
Du kannst ja mal die bereits als "fehlerhaft" erkannten Files checken, wie es da mit den ID3Tags aussieht. Wenn meine Vermutung richtig ist, sollte mit diesem Code als Versionsstring "2.4.0" ausgeben werden, und die Größe jeweils einen bestimmten Schwellenwert überschreiten. Der Test schlägt allerdings fehl, wenn Windows die Datei schon verpfuscht hat. Dann guck die Datei mal in einem Hex-Editor an und schau, ob der String "ID3" mehr als nur einmal vorkommt (und es dahinter so aussieht als stünden da Infos wie Titel oder Interpret). Falls ja, ist die Datei kaputt. Reparieren geht über "ID3Tag löschen" mit einem anständigen Tagger. Dann wird (vermutlich) der Windows-Murks vorne gelöscht, und der Original-Tag sollte wieder vorne stehen.

Delphi-Quellcode:
uses Mp3Files; // aus meiner AWB, https://github.com/DanielGausi/AudioWerkzeugeBibliothek

procedure TForm1.ShowInfo(aFile: String);
var
  mp3File: TMp3File;
begin
  mp3File := TMp3File.Create;
  try
    mp3File.ReadFromFile(aFile);
    memo1.Lines.Add(mp3File.ID3v2Tag.VersionString);
    memo1.Lines.Add(mp3File.ID3v2TagSize.ToString);
  finally
    mp3File.free;
  end;
end;
Falls das so ist, kannst du damit ggf. ein kleines Testprogramm schreiben, das dir die nicht abspielbaren Files auflistet. Die Tags von 2.4 nach 2.3 zu konvertieren ist zwar prinzipiell möglich (bis auf ggf. ein paar Ausnahme-Felder). Ob es dafür Tools gibt, weiß ich nicht. Evtl. kann Mp3Tag das.

Danke Gausi,
Bei mir sowohl "fehlerhafte" Datei, wie auch "abspielbare" Datei Version 1, Layer 3

Amateurprofi 7. Jan 2025 11:52

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von Gausi (Beitrag 1544888)
Schick mir mal bitte so eine problematische mp3 per Mail (mail ät gausi.de), oder einen Download-Link per PN oder so. Das interessiert mich jetzt doch ein wenig mehr.
Besonders das "Gelegentlich musste ich das mehrfach machen". Das macht ja so gar keinen Sinn ...

Danke für Dein Interesse an meinem Problem.
Habe dir eine "Fehlerhafte" .mp3 per Mail geschickt.
Vielleicht hab ich mich falsch ausgedrückt.
1) Ich konvertiere die "fehlerhafte" .mp3 zu .wav.
2) Ich konvertiere die .wav zu .mp3.
Wenn die .mp3 dann wieder Probleme macht, wiederhole ich das, aber nicht mit der "Original" .mp3 sondern mit der von .wav zu .mp3 konvertierten Datei.
Ich "repariere" also nicht mehrfach die selbe .mp3.
Das würde ja wirklich keinen Sinn machen.

Gausi 7. Jan 2025 12:44

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von Amateurprofi (Beitrag 1544889)
Bei mir sowohl "fehlerhafte" Datei, wie auch "abspielbare" Datei Version 1, Layer 3

mp3 ist kurz für "MPEG-1, Layer 3". Das hat mit der Version des ID3-Tag nichts zu tun. ;-)

Die Datei, die du mir geschickt hast, hat zumindest nicht das Problem, das ich vermutet hatte. Das einzige was mir da auffällt, ist ein enthaltener "INFO" Header (der recht selten ist), und darauf folgend relative viele Fake-MPEG-Frames mit Lame-Daten drin.
Kann sein, dass die mit dem INFO-Header zusammenhängen, und der TMediaplayer-Decoder dabei ins Schleudern kommt. Denn die dürften keine sinnvoll dekodierbare Audiodaten enthalten, sondern weitere Metadaten (z.B. Sprungstellen-Array oder sowas). Dazu weiß ich aber zu wenig über die Interna des Lame-Encoders, und was das für Daten sind (im Wesentlichen sehr viele $55 Bytes).

Das mehrfache wiederholen hatte ich schon so richtig verstanden - aber das macht ja auch keinen Sinn. Das würde ja eigentlich bedeuten, dass der "Fehler" im Audiosignal selbst zu suchen wäre, der dann nach einigen Generationen und entsprechenden Verlusten weg wäre.

Bin da jetzt etwas ratlos ...

Christian Seehase 7. Jan 2025 17:28

AW: Problem mit TMediaPlayer
 
Moin Klaus,

eventuell könntest Du auch ffmpeg verwenden.
ffmpeg zum Konvertieren und ffprobe zum Prüfen.
Dieses Programm ist zwar meist für Video-Dateien bekannt,
kann aber auch Audio-Dateien.
Ich werde mal versuchen die passenden Parameter rauszusuchen.

jaenicke 7. Jan 2025 20:09

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von Amateurprofi (Beitrag 1544883)
Zu "bass.dll"
Wusste gar nicht, dass man damit auch Dateien abspielen kann.
Wie auch immer:
Ich habe einige Hemmungen, in meinem Programm grundlegende Dinge zu ändern, weil: verbessere ich links etwas, mache ich rechts etwas kaputt.

Solange du ohne Visualisierung usw. nur abspielen möchtest, ist das mit der bass.dll ohne große Mühe machbar.

Etwas mehr Aufwand wird es, wenn du die aktuelle Position beim Abspielen anzeigen möchtest, eine Visualisierung wie gesagt, usw., so dass das nicht mal eben so geht.

Amateurprofi 7. Jan 2025 21:55

AW: Problem mit TMediaPlayer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jaenicke (Beitrag 1544916)
Zitat:

Zitat von Amateurprofi (Beitrag 1544883)
Zu "bass.dll"
Wusste gar nicht, dass man damit auch Dateien abspielen kann.
Wie auch immer:
Ich habe einige Hemmungen, in meinem Programm grundlegende Dinge zu ändern, weil: verbessere ich links etwas, mache ich rechts etwas kaputt.

Solange du ohne Visualisierung usw. nur abspielen möchtest, ist das mit der bass.dll ohne große Mühe machbar.

Etwas mehr Aufwand wird es, wenn du die aktuelle Position beim Abspielen anzeigen möchtest, eine Visualisierung wie gesagt, usw., so dass das nicht mal eben so geht.

Danke jaenicke,
Einer der Bestandteile meines Programms ist die Anzeige der aktuellen Position beim Abspielen (Anhang).
Die Daten hierfür ermittle ich mit der bass.dll und die jeweils aktuelle Position mit dem TMediaPlayer.
Das klappte auch gut, jedenfalls bis ich eine Sammlung von ca. 40k Titeln dazu bekam, bei denen einige Probleme bereiten.
Naja, es scheint nicht ganz einfach zu sein die maschinell zu ermitteln, werde ich also händisch machen.

Amateurprofi 7. Jan 2025 22:30

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von Christian Seehase (Beitrag 1544910)
Moin Klaus,

eventuell könntest Du auch ffmpeg verwenden.
ffmpeg zum Konvertieren und ffprobe zum Prüfen.
Dieses Programm ist zwar meist für Video-Dateien bekannt,
kann aber auch Audio-Dateien.
Ich werde mal versuchen die passenden Parameter rauszusuchen.

Danke, Cristian,
wie ich schrieb, arbeite ich mit WavePad und bin damit auch zufrieden.
Das "Reparieren" einer Datei kostet mich nur einen Klick, der Rest läuft automatisch.
Delphi-Quellcode:
const Fmt='"%S" -saveas "%S" -saveas "%S" -exit';
var WavDsn,S,WP:String;
begin
   ...
   WP:=MPlayer.WavePadPath;
   WavDsn:=ChangeFileExt(Dsn,'.wav'); // Dsn ist der Pfad zur .mp3
   S:=Format(Fmt,[Dsn,WavDsn,Dsn]);
   ShellExecuteW(0,'open',PWideChar(WP),PWideChar(S),Nil,SW_SHOWNORMAL);
end;

Gausi 8. Jan 2025 05:42

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von Amateurprofi (Beitrag 1544919)
Einer der Bestandteile meines Programms ist die Anzeige der aktuellen Position beim Abspielen (Anhang).
Die Daten hierfür ermittle ich mit der bass.dll und die jeweils aktuelle Position mit dem TMediaPlayer.

Wenn du ohnehin schon die bass.dll nutzt, um die Waveform zu erzeugen, dann macht der TMediaPlayer zum Abspielen ja gar keinen Sinn mehr. Das würde ich fast damit vergleichen wollen, dass du dir einen teuren Sportwagen für die schönen bequemen Sitze kaufst, und zum fahren dann trotzdem ein paar Pferde davor spannst.

Eine Fortschritts-Anzeige ist auch mit der bass.dll kein Problem, es geht nur nicht "automatisch" wie bei der visuellen TMediaPlayer-Komponente. Ich habe damals mal ein Tutorial Memp - Mein einfacher mp3-Player dazu geschrieben, kannst da ja mal reinschauen. Fortschrittsanzeige sind auch nur ein paar Zeilen Code.

Die bass.dll kann die Datei, die du mir geschickt hast, übrigens abspielen, zumindest macht mein Player das. Insgesamt ist die zwar sehr leise, aber sie wird abgespielt. ;-)

Amateurprofi 8. Jan 2025 14:22

AW: Problem mit TMediaPlayer
 
Zitat:

Zitat von Gausi (Beitrag 1544922)
Zitat:

Zitat von Amateurprofi (Beitrag 1544919)
Einer der Bestandteile meines Programms ist die Anzeige der aktuellen Position beim Abspielen (Anhang).
Die Daten hierfür ermittle ich mit der bass.dll und die jeweils aktuelle Position mit dem TMediaPlayer.

Wenn du ohnehin schon die bass.dll nutzt, um die Waveform zu erzeugen, dann macht der TMediaPlayer zum Abspielen ja gar keinen Sinn mehr. Das würde ich fast damit vergleichen wollen, dass du dir einen teuren Sportwagen für die schönen bequemen Sitze kaufst, und zum fahren dann trotzdem ein paar Pferde davor spannst.

Eine Fortschritts-Anzeige ist auch mit der bass.dll kein Problem, es geht nur nicht "automatisch" wie bei der visuellen TMediaPlayer-Komponente. Ich habe damals mal ein Tutorial Memp - Mein einfacher mp3-Player dazu geschrieben, kannst da ja mal reinschauen. Fortschrittsanzeige sind auch nur ein paar Zeilen Code.

Die bass.dll kann die Datei, die du mir geschickt hast, übrigens abspielen, zumindest macht mein Player das. Insgesamt ist die zwar sehr leise, aber sie wird abgespielt. ;-)

Danke, Gausi.
Schöner Vergleich Sportwagen und Pferde.
Deine Argumentation ist also, wenn ich schon irgendwo die Funktion MinIntValue verwende, weil ich den kleinsten von vielen Werten haben möchte, dann sollte ich in Fällen in denen ich das Minimum aus nur 2 Zahlen haben möchte, auch MinIntValue verwenden? (Sorry, auf die Schnelle fällt mir kein besserer Vergleich ein.)
Ich benutze den TMediaPlayer um .mp3's abzuspielen, und für einen ganz bestimmten Zweck die Bass.dll.
Mein Programm habe ich 2011 geschrieben, damals ohne die WaveForm, und damals wusste ich noch nichts von der Bass.dll.
Jetzt alles umzuschreiben, nur weil es gelegentlich hakt, erscheint mir zu aufwendig - aber wer weiß, wie ich demnächst darüber denke.
Warscheinlich werde ich mich dann irgendwann dazu hinreißen lassen, weil wenn mir ein Gedanke im Kopf herumspukt, werde ich den nicht wieder los.
Zu Memp: Ich kenne Nemp (mit N), mag sein ich habe teilweise daraus abgeschrieben.
Ich hab übrigens noch ein Problem mit dem TMediaPlayer, aber nach dem Grundsatz 1 Thread - 1 Frage werde ich dazu bei Gelegenheit einen weiteren Thread beginnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz