AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Doppelte(ähnliche) MP3's automatisch löschen!
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelte(ähnliche) MP3's automatisch löschen!

Ein Thema von ATwardz · begonnen am 16. Mai 2003 · letzter Beitrag vom 17. Mai 2003
Antwort Antwort
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#1

Doppelte(ähnliche) MP3's automatisch löschen!

  Alt 16. Mai 2003, 19:12
Neues Programm neue Probleme!

Ich hatte mir vorgestellt ein Programm zu schreiben was mir die verwaltung der MP'3 erleichtert!
Das Programm soll alle MP3's auf der Platte finden, auflisten und nach grösse, Ähnlichkeit der Namen und Länge vergleichen!
Alle Dateien die gleich gross sind, ähnliche Namen haben oder die gleiche Länge sollen einander zugeordnet werden, so das der User die letzte Kontrolle über das Löschen hat!

Ich habe meine Vorstellung mehr oder weniger mit der Finfirst, Finnext methode aufgelistet, aber wie kann ich die MP'3 tags auslesen und vergleichen, so das jede Datei mit jeder verglichen wird!
Die Grösse und Namen Geschichte hatte ich mir so vorgestellt, das alle Dateien
Einmal nach Grösse
Einmal nach Länge
sortiert werden, in 2 Listen und der PC dann immer den Aktuellen Itemindex mit dem nächsten vergleicht!

Jetzt mein hauptproblem, wie bringe ich den Rechner dazu alle Dateien auf ähnliche Namen zu vergleichen?

Warum schreibt der jetzt einen Roman? Weil ich gerne Anregungen und Verbesserungsvorschlage erhalten würde!Wäre sehr dankbar dafür bevor ich mit dem Projekt eigentlich beginne da ich jetzt erst nur die Suche Programmiert habe! Den ich dann auch ma demnächst hier zeigen werde!

Danke für alle Mitdenker



Thx @wardz
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#2
  Alt 16. Mai 2003, 19:32
Hallo zum Auslesen der Tags usw hab ich folgendes gefunden:

Bitrate und ID3-Tags aus MP3-Dateien ermitteln


Delphi-Quellcode:
Diese Procedure demonstriert, wie man Informationen, wie Bitrate, Dauer, ID3-Tags aus MP3-Dateien ermitteln kann.

Zunächst benötigt man einige Typendefinitionen und Konstanten:

Type
  TID3Tag = record
    ID: string[3];
    Titel: string[30];
    Artist: string[30];
    Album: string[30];
    Year: string[4];
    Comment: string[30];
    Genre: byte;
    dauer: longint; //in sekunden;
    sample: integer;
    bits: byte;
    vers: byte;
    layers: byte;
end;

const
  MPEG_BIT_RATES : array[1..3] of array[1..3] of array[0..15] of word =
  { Version 1, Layer I }
    (((0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0),
  { Version 1, Layer II }
    (0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0),
  { Version 1, Layer III }
    (0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0)),
  { Version 2, Layer I }
    ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0),
  { Version 2, Layer II }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0),
  { Version 2, Layer III }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)),
  { Version 2.5, Layer I }
    ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0),
  { Version 2.5, Layer II }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0),
  { Version 2.5, Layer III }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)));

  sample_rates: array[1..3] of array [0..3] of word=
    ((44100,48000,32000,0),
    (22050,24000,16000,0),
    (11025,12000,8000,0));



Es folgt die eigentliche „Auslese" Procedure:

var
  ID3Tag: TID3Tag;

procedure Lese_ID3Tag(Filename: string);
var
  Buffer: array[1..128] of char;
  F: File;
  mp3hdrread: array[1..4] of byte;
  mp3hdr: longint absolute mp3hdrread;
  tempbyte, bitrateindex, versionindex: byte;
  bitrate, version, layer, groese: longint;
begin
  AssignFile(F, Filename);

  Reset(F,1);
  groese:=filesize(f);
  blockread(f,mp3hdrread,4);
  tempbyte:=mp3hdrread[1];
  mp3hdrread[1]:=mp3hdrread[4];
  mp3hdrread[4]:=tempbyte;
  tempbyte:=mp3hdrread[2];
  mp3hdrread[2]:=mp3hdrread[3];
  mp3hdrread[3]:=tempbyte;

  reset(f,1);
  Seek(F,FileSize(F)-128);
  BlockRead(F, Buffer, SizeOf(Buffer));
  CloseFile(F);
  bitrateindex:=((mp3hdr shr 12) and $F);
  versionindex:=((mp3hdr shr 19) and $3);

  case versionindex of
    0: version:=3;
    1: version:=0; //unbekannt
    2: version:=2;
    3: version:=1;
  end;

  layer:=4-((mp3hdr shr 17) and $3);

  if version<>0 then
    bitrate:=MPEG_BIT_RATES[version][layer][bitrateindex]
  else
    bitrate:=128;

  with ID3Tag do
  begin
    ID:=copy(Buffer,1,3);
    Titel:=copy(Buffer,4,30);
    Artist:=copy(Buffer,34,30);
    Album:=copy(Buffer,64,30);
    Year:=copy(Buffer,94,4);
    Comment:=copy(Buffer,98,30);
    Genre:=ord(Buffer[128]);
    sample:=sample_rates[version][((mp3hdr shr 10) and $3)];
    dauer:=(groese*8) div ((bitrate)*1000);
    bits:=bitrate;
    vers:=version;
    layers:=layer;
  end;
end;


Die Procedure kann man dann folgendermaßen Anwenden:


procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Lese_ID3Tag(OpenDialog1.FileName);

    Titel.Caption:=ID3Tag.Titel;
    Artist.Caption:=ID3Tag.Artist;
    Album.Caption:=ID3Tag.Album;
    Year.Caption:=ID3Tag.Year;
    Comment.Caption:=ID3Tag.Comment;
    Genre.Caption:=IntToStr(ID3Tag.Genre);

    Duration.Caption:=IntToStr(id3tag.dauer);
    Samplerate.Caption:=IntToStr(id3tag.sample);
    Bitrate.Caption:=IntToStr(id3tag.bits);
    Layer.caption:=IntToStr(id3tag.layers);
    Yersion.caption:=IntToStr(id3tag.vers);
  end;
end;
Und diese Funktion gibt den Prozentwert der Übereinstimmung von zwei String aus:

Delphi-Quellcode:
function TSuchenForm.DoStringMatch(s1, s2: string): Double;
var
  i, iMin, iMax, iSameCount: Integer;
begin
  iMax := Max(Length(s1), Length(s2));
  iMin := Min(Length(s1), Length(s2));
  iSameCount := -1;
  for i := 0 to iMax do
  begin
    if i > iMin then
      break;
    if s1[i] = s2[i] then
      Inc(iSameCount)
    else
      break;
  end;
  if iSameCount > 0 then
    Result := (iSameCount / iMax) * 100
  else
    Result := 0.00;
end;
Vielleicht hat dir das ja weitergeholfen.

Man liest sich, Stanlay
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#3
  Alt 17. Mai 2003, 12:10
@Stanlay Hanks: Deine Stringvergleich-Funktion hat ein kleines Problem, wenn nämlich im einen String irgendwo ein einzelner Buchstabe reingerutscht ist, ist die Übereinstimmungsquote sehr gering, obwohl die beiden Strings sich nur durch einen Buchstaben unterscheiden. Gerade bei Multimediadateien kann das problematisch sein (weiß allerdings nicht, wie MP3 aufgebaut ist).

WinDiff zeigt in dieser Hinsicht interessante Ansätze, denn es kann solche "kleinen" Unterschiede feststellen und anzeigen. Leicht zu implementieren ist das allerdings sicher nicht (naja, ist halt Arbeit). Es gibt es jedoch den Quellcode zum Download (siehe http://msdn.microsoft.com/library/de...smpwindiff.asp). Wenn du also eine dicke Leitung hast...
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz