Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Tags mp3 (https://www.clubdelphi.com/foros/showthread.php?t=60720)

Khronos 11-10-2008 12:18:13

Tags mp3
 
Bueno buscando encontré la forma de obtener informacion de las etiquietas IDV2. Pero hay archivos mp3 que tienen una imagen del album, estuve buscando pero no conseguí gran cosa. ¿Alguien sabe como obtener la imagen del album de un archivo mp3?

Salu2

Lepe 11-10-2008 16:04:49

¿dentro del mp3 tiene la imagen? Es la primera vez que lo escucho.

Yo siempre he visto la caratula en la misma carpeta que los mp3s, y algunos reproductores la pillan de ahí y la muestran al reproducr una canción. En este caso se trata de buscar en la misma carpeta por imágenes tipo jpg y bmp principalmente (si es esto lo que quieres, mira en los trucos del club, o en la ayuda de delphi por FindFirst)

Saludos

cHackAll 12-10-2008 00:36:51

Código Delphi [-]
function GetHeaderSize(const Value: Cardinal): Cardinal;
asm
 xor   ecx, ecx
 xchg  eax, ecx
@loop: shl  eax, 7
 or    al,  cl
 shr   ecx, 8
 jnz  @loop
end;

function GetFrameSize(const Value: Cardinal): Cardinal;
asm
 xchg al, ah
 rol eax, 10h
 xchg al, ah
end;

procedure TForm1.Button1Click(Sender: TObject);

type
 TFrame = packed record
  ID, Size: Cardinal;
  Flags: Word;
 end;

var
 hFile, Size, Buffer, FrameSize, Diff, hImage: Integer;

 Header: packed record
  ID: array [0..2] of Char;
  Version, Revision, Flags: Byte;
  Size: Cardinal;
 end;

 Frame: ^TFrame;
 Image: PChar;

begin
 hFile := _lopen('Sonata ClubDelphi.mp3', OF_READ);
 _lread(hFile, @Header, SizeOf(Header));                 // leemos los primeros 10 bytes del mp3
 Header.Version := 0; // don't needed
 if PCardinal(@Header)^ = $334449{ID3} then              // si el identificador es válido, ID3v2 está presente
  begin
   Size := GetHeaderSize(Header.Size);                   // obtenemor el tamaño "real" del cabezal
   Buffer := LocalAlloc(0, Size);                        // reservamos memoria
   Frame := Ptr(Buffer);
   _lread(hFile, Frame, Size);                           // leemos todo el ID3v2 en la memoria reservada
   while (Size > 0) and (Byte(Frame.ID) > 0) do
    begin
     FrameSize := GetFrameSize(Frame.Size);              // obtenemos el tamaño "real" del frame
     if Frame.ID = $43495041{APIC} then                  // si el frame es una imagen
      begin
       Image := PChar(Cardinal(Frame) + SizeOf(TFrame)); // obtenemos el inicio de los datos del frame
       Diff := lstrlen(@Image[1]) + 4;                   // obtenemos el tamaño del MIME y tipo
       Image[6] := '.';                                  // cambiamos '/' por '.' para "componer" el nombre de archivo
       hImage := _lcreat(@Image[1], 0);                  // creamos el archivo de imagen
       _lwrite(hImage, @Image[Diff], FrameSize - Diff);  // lo guardamos
       CloseHandle(hImage);                              // y cerramos
      end;
     Inc(FrameSize, SizeOf(TFrame));                     // consideramos el tamaño del cabezal del frame actual
     Inc(Cardinal(Frame), FrameSize);                    // ...para saltar al siguiente frame
     Dec(Size, FrameSize);
    end;
   LocalFree(Buffer);
  end;
 CloseHandle(hFile);
end;

Nota; considerando que el anterior código tuvo un proposito más informativo que práctico, aconsejo usar (por ejemplo) los componentes JEDI para manejar dicha informacion.

Saludos

Khronos 12-10-2008 01:12:00

Muchisimas gracias cHackAll. Al final ya encontre lo que buscaba, el componente JvId3v2 de jedi consigue las imagenes como quería. Pero encontré una dll mas funcional en:
http://www.3delite.hu/Object Pascal ...v2library.html

Salu2 y gracias.

greenflash 14-08-2010 19:18:59

Cita:

Empezado por cHackAll (Mensaje 319616)
Nota; considerando que el anterior código tuvo un proposito más informativo que práctico, aconsejo usar (por ejemplo) los componentes JEDI para manejar dicha informacion.

Gracias cHackAll!!! Me he registrado solo para agradecer este codigo es lo unico que he encontrado funcional.. por alguna razon el componente de tags de id3v2 de JVCL esta dandome un AV... Ya vere eso pero solamente queria la image y lo tuyo funciono de maravilla. SEguiremos investigando..


La franja horaria es GMT +2. Ahora son las 14:40:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi