Autor Beitrag
Glostami
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1

Win7
Turbo Delphi 2006
BeitragVerfasst: Fr 15.10.10 23:07 
Hallo!

Meine Frage:
Für mein Programm muss ich den Inhalt einer mp3 Datei in einen String umwandeln.
Meine Idee war es, die Datei in ein TMemo zu laden und dann einfach die Zeichenumbrüche zu entfernen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var quelle : text;
begin
{...}
Memo_mp3.Lines.LoadFromFile(OpenDialog1.FileName);
quelle := StringReplace(Memo_mp3.Text,SLineBreak,'',[rfReplaceAll]);
end;


Wenn ich das dann ausführe, wir nur folgendes geladen: ID3 (also nut die ersten 4 Zeichen)

Wenn ich das mp3-File aber per Copy&Paste (z. B. über den Editor) einfüge klappt alles wunderbar. :?

Ich hab das ganze schon mit einem RichEdit versucht, dort wurde es auch nicht follsändig geladen. Außerdem kann dieses nur 65536 Zeichen verkraften, für ein mp3-File also zu wenig.

Danke im Vorraus für Antworten
Glostami
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 15.10.10 23:25 
Wenn du da etwas ersetzt, brauchst du dich nicht wundern, wenn es hinterher nicht mehr das selbe ist. Die Zeichen 13 und 10 können in einer MP3 Datei durchaus oft vorkommen. ;-)

In einen String Laden geht sehr einfach (auch wenn ich nicht verstehe wozu^^):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  FileContents: TFileStream;
  MyString: AnsiString;
begin
  FileContents := TFileStream.Create(..., fmOpenRead or fmShareDenyNone);
  try
    SetLength(MyString, FileContents.Size);
    FileContents.ReadBuffer(PChar(MyString)^, FileContents.Size);
  finally
    FileContents.Free();
  end;

  // Jetzt hast du den Inhalt der Datei in MyString...
// EDIT: Korrektur wegen UnicodeStrings


Zuletzt bearbeitet von jaenicke am Sa 16.10.10 09:18, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Glostami
Glostami Threadstarter
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1

Win7
Turbo Delphi 2006
BeitragVerfasst: Fr 15.10.10 23:46 
Wow...
Sehr effektive Methode... Klappt wunderbar!
Danke.

Wenn ich aber diesen Text dann in einem TMemory oder in einem Edit ausgeben will, kommt trotzdem nur ID3...
Ansonsten klappt alles :zustimm:
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 15.10.10 23:47 
user profile iconGlostami hat folgendes geschrieben Zum zitierten Posting springen:
Für mein Programm muss ich den Inhalt einer mp3 Datei in einen String umwandeln.
Sorry, aber das ist einfach nur Murks. Wenn Du die ID-Tags einer Mp3-Datei auslesen, verändern und schreiben willst, geht das anders. Beispiele findest Du dazu im Internet genug. Zum Beispiel hier: www.delphipraxis.net...er-mp3-auslesen.html
Glostami Threadstarter
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1

Win7
Turbo Delphi 2006
BeitragVerfasst: Fr 15.10.10 23:49 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGlostami hat folgendes geschrieben Zum zitierten Posting springen:
Für mein Programm muss ich den Inhalt einer mp3 Datei in einen String umwandeln.
Sorry, aber das ist einfach nur Murks. Wenn Du die ID-Tags einer Mp3-Datei auslesen, verändern und schreiben willst, geht das anders. ...


Stimmt, aber die will ich ja nicht verändern.
Trotzdem Danke
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 15.10.10 23:57 
user profile iconGlostami hat folgendes geschrieben Zum zitierten Posting springen:
Stimmt, aber die will ich ja nicht verändern.
Auch wenn man das nur auslesen will, packt man die Datei nicht in einen String. Schau in das genannte Beispiel.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 16.10.10 00:08 
user profile iconGlostami hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich aber diesen Text dann in einem TMemory oder in einem Edit ausgeben will, kommt trotzdem nur ID3...
Das ist eben der Inhalt der Datei, was erwartest du denn? :gruebel:

Und sobald ein Nullzeichen dabei ist, ist Schluss mit Anzeige, weil das als Endzeichen eines Strings benutzt wird.

Was willst du denn angezeigt haben?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 16.10.10 03:10 
Was soll das für einen Sinn machen eine nicht Textdatei als Text ausgeben zu wollen? Dass da nur Müll ankommt, ist doch logisch. Was hast du denn erwartet? Den Text? Die Noten? ;) Und wenn du es unbedingt als Text anzeigen willst, dann codiere es vorher so, dass keine Steuerzeichen mehr enthalten sind. Base64 wäre da eine Möglichkeit.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 16.10.10 09:15 
Wenn du den Code oben nimmst, machst du implizit eine Annahme über das Format und Codierung des Strings. In älteren Delphi-Versionen ist 1 Byte = 1 Char, aber die Codierung kann unterschiedlich sein (je nach Zeichensatzeinstellung). Bei neueren Versionen ist 1 Char nicht mehr 1 Byte und der Code oben funktioniert nicht mehr.
Ausserdem zeigt PChar() bei einem leeren String nicht auf nil, was zwar beim Code oben nicht tragisch ist, weil nichts geschrieben wird; aber Pointer() wäre meiner Meinung nach korrekter; bzw. den Code würde ich bei einer leeren Datei gar nicht so durchlaufen lassen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 16.10.10 09:19 
Stimmt, ich habe vergessen AnsiString zu nehmen. Ein UnicodeString macht hier ja keinen Sinn, deshalb bringt es nichts, das via SizeOf(Char) zu berechnen und in einen zu legen.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 16.10.10 09:19 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Du die ID-Tags einer Mp3-Datei auslesen, verändern und schreiben willst, geht das anders. Beispiele findest Du dazu im Internet genug. Zum Beispiel hier: www.delphipraxis.net...er-mp3-auslesen.html
Ist zwar hier etwas OT, aber das muss dann doch raus: Lesen geht mit der verlinkten Unit, aber verändern und schreiben sollte man die ID3v2Tags damit nicht. Dabei können nämlich eine ganze Reihe von Informationen verloren gehen, und das ist Murks ;-). Besser sind da die ganz unten in dem Topic verlinkte ID3Lib von Muetze1, oder meine Mp3FileUtils.

Mich würde aber auch mal der Sinn des Unterfangens hier interssieren. :D

_________________
We are, we were and will not be.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 16.10.10 09:26 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Stimmt, ich habe vergessen AnsiString zu nehmen. Ein UnicodeString macht hier ja keinen Sinn, deshalb bringt es nichts, das via SizeOf(Char) zu berechnen und in einen zu legen.

Obwohl die Bedeutung eines AnsiStrings wieder abhängig von der Codepage ist. Da könntest du die Daten auch gleich in ein Array of Float laden ;) Es ist daher so oder so nicht sinnvoll. Ab Delphi2009 könntest du korrekterweise RawByteString nehmen.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Sa 16.10.10 11:39 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Besser sind da die ganz unten in dem Topic verlinkte ID3Lib von Muetze1, oder meine [url=www.delphi-forum.de/...]Mp3FileUtils[/url].
Ich habe einfach den ersten Google-Link als Beispiel genommen. Und da wird schon ersichtlich, wie man an die Informationen dran kommt. Ob man beim Schreiben Infos verliert, sollte schon einem auffallen, wenn man sich mit der Materie ernsthaft beschäftigt. Die Copy-und-Paste-Programmierer dürften da allerdings auf verlorenem Posten stehen. ;-)
Zitat:
Mich würde aber auch mal der Sinn des Unterfangens hier interssieren. :D
Ganz einfach: Es gibt KEINEN Sinn, eine binäre Datei in einen String einzulesen. Das kommt dabei raus, wenn man die Grundlagen nicht beherrscht und mit Begriffen wie Header, Records, Dateizugriffen, Dateiaufbau usw. nichts anzufangen weiß.
Teekeks
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 211
Erhaltene Danke: 23



BeitragVerfasst: Sa 16.10.10 14:45 
Nur so: WO hat der TE denn behauptet die ID3-Tags zu verändern zu wollen?

Er hat einmal ID3 geschrieben, was daran liegt dass das alles war was er bei seiner Methode raus gefunden hat.

Interessieren würde es mich aber auch was er damit erreichen möchte...
Glostami Threadstarter
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1

Win7
Turbo Delphi 2006
BeitragVerfasst: So 17.10.10 19:52 
Der Sinn des ganzen sollte folgender sein:

Für mein Programm "FileToBMP - Converter" benötoge ich hat nun mal den Inhalt einer Datei. Wenn ich das ganze in einenn String lade, kann ich mit length(s) die größe der Daten heraufinden. Daraus kann ich halt berechnen wie viele Pixel das Bild haben soll. Da Pixel aber ganzzahlig sind, benötige ich manchmal nicht alles von der Datei, ein Paar Zeichen können wegelassen werden, was mit einer Schleife wunderbar funktioniert. Schließlich kann ich noch zur besseren Formatierung der Datei die Absätze bearbeiten, sodass eine Zeile genau soviele Zeichen hat, wie das Bild Pixel. Wenn ich das alles in einem String hab, kann ich die ja schön einfach einfügen.

Trotzdem Danke für die Hilfe.


Ach so, um kommentaren vorzubeugen: Ich weiß, das ich noch einen Header schreiben muss...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 17.10.10 19:55 
Ein String als Datencontainer ist keine gute Idee...

Den Dateiinhalt kannst du z.B. als Stream auslesen mit TFileStream (wie oben schon gezeigt). Und wenn du schnellen Zugriff auf die gesamte Datei brauchst, kannst du einen TMemoryStream mit den Daten füttern oder MMFs benutzen.

In jedem Fall macht das viel mehr Sinn und ist deutlich schneller als mit Strings und den daraus entstehenden Problemen herumzufriemeln.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 17.10.10 21:12 
user profile iconGlostami hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das ganze in einenn String lade, kann ich mit length(s) die größe der Daten heraufinden.

In der Delphipraxis gab es früher mal so einen Experten, der hat Screenshots grundsätzlich immer in einer Word-Datei hochgeladen. :wall:

Wie wäre ein einfacher Aufruf von GetFileSize(Ex), um die Dateigröße zu ermitteln? Oder du lädst die Datei in einen FileStream und rufst dann die Methode Size auf oder du machst es mit FindFirst(File).
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 18.10.10 18:10 
user profile iconGlostami hat folgendes geschrieben Zum zitierten Posting springen:
Der Sinn des ganzen sollte folgender sein

Dann nimm wenn schon array of Byte aber besser arbeitest du direkt mit einem Stream.