PDA

Ver la Versión Completa : Tags mp3


Khronos
11-10-2008, 12:18:13
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
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 (http://www.id3.org)

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 Developer Resources/id3v2library.html

Salu2 y gracias.

greenflash
14-08-2010, 19:18:59
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..