AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Microsoft Mp3 und Pics

Ein Thema von ATS3788 · begonnen am 18. Nov 2012 · letzter Beitrag vom 21. Nov 2012
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#11

AW: Microsoft Mp3 und Pics

  Alt 20. Nov 2012, 08:57
Prüf doch mal nach, ob der WMP die JPGs nicht in die MP3s schreibt und evtl. die AlbumArt-Datei nur übrig bleibt.
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Microsoft Mp3 und Pics

  Alt 20. Nov 2012, 13:52
Öhm, ich bin verwirrt. Du sagtest einmal, dass die GUI nicht im mp3-File zu sehen ist, und jetzt willst du die doch daraus extrahieren? Oder ist die da dann doch in einem anderen Format enthalten?

Nebenbei können meine Mp3FileUtils auch Private-Frames lesen und schreiben, dazu gibt es da die Methode function GetPrivateFrame(aOwnerID: AnsiString; Content: TStream): Boolean; . OwnerID wäre sowas wie "WM/WMCollectionID", Content ein Stream, wo die Daten rein sollen (zum selberparsen, da in den Private-Frames beliebige Daten stehen können, nicht nur Text), und Result gibt an, ob der Frame überhaupt vorhanden war oder nicht.
The angels have the phone box.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: Microsoft Mp3 und Pics

  Alt 20. Nov 2012, 14:29
Zitat:
Du sagtest einmal, dass die GUID nicht im mp3-File zu sehen ist
Aber als Datei-Name denke da hast was falsch interpretiert.

Zitat:
AlbumArt_{79A094C5-71C5-46EC-9276-666196504245}_Large.jpg
gruss
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Microsoft Mp3 und Pics

  Alt 20. Nov 2012, 14:42
Und wie ordnet man einem mp3-File dann die richtige Cover-Datei zu? Oder gibt es pro Ordner immer nur eine Cover-Datei (ggf. in unterschiedlichen Größen)?
Denn in dem Code auf Stackoverflow wird ja im ID3-Tag nach dieser GUID gesucht, also sollte die ja dann darin zu finden sein (ggf. in einer anderen Codierung, die als Dateiname nicht gültig wäre).
The angels have the phone box.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Microsoft Mp3 und Pics

  Alt 20. Nov 2012, 16:10
Zitat:
Oder gibt es pro Ordner immer nur eine Cover-Datei (ggf. in unterschiedlichen Größen)?
Jo Folder.jpg, _Small und _Large

gruss
  Mit Zitat antworten Zitat
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#16

AW: Microsoft Mp3 und Pics

  Alt 21. Nov 2012, 09:07
Delphi-Quellcode:

function getAlbumGUID(filename : string; var GUID : TGUID) : boolean;
const

TAG_INDICATOR_LENGTH = 3;
TAG_TYPE = 'ID3';
TAG_MAJOR = 3;
TAG_MINOR = 0;
HEADER_SIZE_BEGIN = 6;
HEADER_SIZE_END = 9;
EXTENDED_HEADER_POS = 5;
EXTENDED_HEADER_SIZE_LENGTH = 4;
FRAME_HEADER_LENGTH = 10;
FRAME_ID_LENGTH = 4;
FRAME_MEDIA_PLAYER_OWNER1 = 'WM/WMCollectionID';
FRAME_MEDIA_PLAYER_OWNER2 = 'WM/WMCollectionGroupID';
FRAME_MEDIA_PLAYER_ID = 'PRIV';
FRAME_SIZE_BEGIN = 4;
FRAME_SIZE_END = 7;
retValue = false;
HEADER_LENGTH = 10;
var
Stream : TFileStream;

Header10 : array[0..HEADER_LENGTH-1] of byte;

extHeaderData : array[0..EXTENDED_HEADER_SIZE_LENGTH-1] of byte;
frameHeader : array[0..FRAME_HEADER_LENGTH-1] of byte;
i : integer;
tagType : string[TAG_INDICATOR_LENGTH];
majorVersion : integer;
minorVersion : integer;
extHeader : LongBool;
extHeaderSize : integer;
tagSize : integer;
currPos : integer;
frameType : string;
frameLength : integer;

owner : pAnsiChar;
FrameData : pAnsiChar;
b : byte;

Test : array [0..2000] of AnsiChar;

begin
    try
        // read in file
       Stream := TFileStream.Create(filename , fmOpenRead);
       Stream.Position := 0;

       stream.Read(Header10, HEADER_LENGTH);

       tagType := '';

      for i := 0 to TAG_INDICATOR_LENGTH do
            tagType := tagType + AnsiChar(Header10[i]);

  majorVersion := integer(Header10[TAG_INDICATOR_LENGTH]);
  minorVersion := integer(Header10[TAG_INDICATOR_LENGTH + 1]);
        if (tagType = TAG_TYPE) and (majorVersion = TAG_MAJOR) and (minorVersion = TAG_MINOR) then begin

            // get extended header bit

          extHeader := bool(Header10[EXTENDED_HEADER_POS] and $10);

            // get size of extended header
            extHeaderSize := 0;
            if extHeader then begin

                Stream.seek(HEADER_LENGTH, soBeginning);
                Stream.read(extHeaderData, EXTENDED_HEADER_SIZE_LENGTH);

                for i := 0 to EXTENDED_HEADER_SIZE_LENGTH do begin

                    extHeaderSize := ROL(extHeaderSize , 8);
                    extHeaderSize := extHeaderSize or extHeaderData[i];

                end;
               extHeaderSize := extHeaderSize + EXTENDED_HEADER_SIZE_LENGTH;

            end;
            // get size of tag.
            // 4 bytes with the most significant bit ignored
            tagSize := 0;
            for i := HEADER_SIZE_BEGIN to HEADER_SIZE_END do begin

                tagSize := ROL(tagSize, 7);
                tagSize := tagSize or (Header10[i] and $7f);

            end;

            // tagSize includes extended header
              tagSize := tagSize + HEADER_LENGTH;

            // read tags
            currPos := HEADER_LENGTH + extHeaderSize;
            while (currPos < tagSize) do begin

                Stream.seek(currPos, soBeginning);
                Stream.read(frameHeader, FRAME_HEADER_LENGTH);

                frameType := '';
                // frame id
              for i := 0 to FRAME_ID_LENGTH -1 do
                 frameType := frameType + char(frameHeader[i]);

                // frame length
                 frameLength := 0;
                for i := FRAME_SIZE_BEGIN to FRAME_SIZE_END do begin
                  frameLength := ROL(frameLength, 8);
                  frameLength := frameLength or frameHeader[i];
                end;

                if frameType = FRAME_MEDIA_PLAYER_ID then begin
                 frameData := nil;
                 GetMem(frameData , frameLength);
                 fillChar(frameData^ , frameLength , 0);
                    stream.read(frameData^, frameLength);
                   owner := frameData;
                    if (owner = FRAME_MEDIA_PLAYER_OWNER1) or (owner = FRAME_MEDIA_PLAYER_OWNER2) then begin
                   CopyMemory ( @guid, frameData + length(owner) , SizeOf(TGUID));
               CopyMemory ( @Test, frameData + length(owner) , SizeOf(TGUID));


                        Result := true;
                        exit;

            end;
            if frameData <> nil then
            FreeMem(frameData);
            end;

              currPos := currPos + FRAME_HEADER_LENGTH + frameLength;

            end;
        end;

    finally
     if frameData <> nil then
            FreeMem(frameData);
      Stream.Free;

    end;
        Result := false;
end;
Gausi hast schon recht, ich dachte da steckt vielleicht ein Algoritmus
dahinter den ich nicht erkenne, hier wird nur ein vorhandenes GUID
in 'WM/WMCollectionID' oder WM/WMCollectionGroupID' erzeugt.
Trotzdem hat es Spass gemacht das zu übersetzen

Von unseren Kollegen von Visual Basic
http://social.msdn.microsoft.com/For...-436f053c58cf/
Werde ich mir mal die Tage anschauen.

Des weiteren habe ich ein MP3 mit CDEx geripped. (Dire Straits Making Movies (
Microsoft generiert wie auch immer die GUID
nur
Desktop.ini
[.ShellClassInfo]
FolderType=MusicAlbum
MusicBuyUrl=http://redir.metaservices.microsoft.com/redir/buynow/?providerName=AMG&albumID=D16C59EC-A3B1-4EBC-B275-40A1500BF58A&a_id=R%20%20%20%20%205888&album=Makin g%20Movies&artistID=FD91FC7F-CDEE-4DE9-89D4-4984E307AFB9&p_id=P%20%20%20%20%204101&artist=Dire %20Straits&locale=407&geoid=5e&version=12.0.9200.1 6420&userlocale=407
die GUID
AlbumArt_{D16C59EC-A3B1-4EBC-B275-40A1500BF58A}_Large.jpg
Wie generieren sie diese GUID

Zitat:
Nun weiss ich wenigstens was eine GUID ist
Martin MIchael

Geändert von ATS3788 (21. Nov 2012 um 09:10 Uhr) Grund: Quote stimmte nicht
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 15:30 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