Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
archivo mp3+texto

saludos en el foro, tengo un pequeño problema, no domino el manejo de archivos en delphi y el trabajo que tengo que hacer es unir un archivo mp3 + archivo de texto todo en un solo archivo maestro. bueno lo que tengo que hacer es almacenar el archivo mp3 y su letra en un solo archivo, alguna sugerencia?..... creo que mínimamente debe usar estructuras o no?

Saludos.
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
  #2  
Antiguo 29-07-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Supongo que puedes "montar" un archivo con estructura propia, incluyendo las dos partes. Padrías añadir al inicio un número de bytes fijos para dar información del tamaño de cada archivo y luego incluir los dos ficheros.

Otra opción, tal vez más sencilla para empezar, sea comprimir ambos archivos en uno sólo. Una vez que tu aplicación los vaya a reproducir, descomprimirlos y trabajar con ellos por separado.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 29-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Lo que te sugiere Neftali puede ser una buena solución, si no también puedes almacenar el archivo mp3 y el archivo de texto como archivo de recursos dentro de una dll o dentro del propio ejecutable.. Si buscas por el foro encontrarás varios ejemplos de como hacer esto.

Salu2
Responder Con Cita
  #4  
Antiguo 29-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
buenas ideas...

OK creo que usaré lo de la estructura lo que no me ubico como definir la estructura del archivo, bueno creo que sería lo siguiente:
Código:
type
archivo_compuesto = packed record
     tam_mp3:byte
     tam_text:byte
     cont_mp3://que tipo de dato
     cont_text://que tipo de dato
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
  #5  
Antiguo 29-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Hola,te sugiero algo como esto (lo estoy haciendo a ojo sin el compilador delante).

Código Delphi [-]

uses Classes;

procedure FusionarArchivos (mp3, text, salida: string);
var
FMp3, FText, FSalida: TFileStream;
begin

FSalida:= TFileStream.Create(salida, fmCreate);
FText:= TFileStream.Create(text, fmOpenRead or fmShareDenyWrite);
FMp3:= TFileStream.Create(mp3, fmOpenRead or fmShareDenyWrite);

FSalida.CopyFrom(FMp3, FMp3.size);
FSalida.CopyFrom(FText, FText.size);

FSalida.free;
FMp3.free;
FText.free;

end;

Basicamente sería algo como eso, tambien se me ocurre guardar al final de este archivo datos con el tamaño de cada archivo con un record, algo como esto:

Código Delphi [-]
type
   Datos = packed record
     Mp3Size : integer;
     TextSize: integer;
end;

Lo puedes hacer con la clase TFileStream y la función WriteBuffer.. Para separar los archivos tendrías que obtener el tamaño de cada archivo y moverte a través de él... te recomiendo que sigas usando la clase TFileStream.

Espero haberte ayudado.

Salu2

Última edición por Khronos fecha: 29-07-2008 a las 19:38:47.
Responder Con Cita
  #6  
Antiguo 29-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
Ok Khronos......... voy a ir probando compilando.......
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
  #7  
Antiguo 31-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
todo bien.........

hola que tal........ les cuento que me fue:
construí un registro con los tamaños de los archivos:
Código Delphi [-]
type
  tamanio_mp3texto = packed record
  tam_mp3:integer;
  tam_texto:integer;
end;

y el procedimiento guardar:
Código Delphi [-]
procedure guardar(amp3,atexto,acompuesto:string);
var
mp3,texto,compuesto:TFileStream;
tamanios:tamanio_mp3texto;
begin
    mp3:=TFileStream.Create(amp3,fmOpenRead);
    texto:=TFileStream.Create(atexto,fmOpenRead);
    compuesto:=TFileStream.Create(acompuesto,fmCreate);
    compuesto.CopyFrom(mp3,mp3.Size);
    compuesto.CopyFrom(texto,texto.Size);
    tamanios.tam_mp3:=mp3.Size;
    tamanios.tam_texto:=texto.Size;
    compuesto.WriteBuffer(tamanios,SizeOf(tamanios));
    compuesto.Free;
    mp3.Free;
    texto.Free;
end;

Ahora para recuperar el archivo compuesto y "copiar" la parte del archivo mp3 hago lo siguiente:

Código Delphi [-]
 
procedure abrir(acompuesto:string);
var
compuesto,mp3,texto:TFileStream;
tamanio:tamanio_mp3texto;
cont:PChar;
begin
     compuesto:=TFileStream.Create(acompuesto,fmOpenRead);
     mp3:=TFileStream.Create('c:\prueba.mp3',fmCreate);
     //me ubico para leer los tamaños de los archivos:
     compuesto.Position:=compuesto.Size-8;
     //recupero el tamaño del archivo mp3 y del texto
     compuesto.Read(tamanio,sizeof(tamanio));
     //posiciono al principio para copiar al archivo mp3
     compuesto.Position:=0;
     while (compuesto.Position<=tamanio.tam_mp3) do
     begin
          compuesto.Read(cont,sizeof(cont));
          mp3.Write(cont,sizeof(cont));
          compuesto.Position:=compuesto.Position+1;
     end;
     mp3.Free;
     compuesto.Free;    
end

El problema es que no copia realmente el archivo como debería puesto que al tratar de abrirlo no reproduce y el tamaño del archivo no es el correcto.

Alguna sugerencia............

Saludos
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
  #8  
Antiguo 31-07-2008
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
2-D@monic, creo que no te has explicado bien, si te refieres a incluir la letra de una canción en un archivo mp3, no es simplemente fusionar ambos, como has mencionado, ya que el resultado será desconocido para muchos reproductores al no respetar tú la estructura normal de un mp3; debes:Hay componentes en delphi que manejan el ID3 como las Audio Tools Library; te recomiendo que revises el código de la unidad ID3v2.pas para que comprendas el manejo de archivos.

Ya nos contarás cómo te fué.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
  #9  
Antiguo 31-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
gracias por la recomendación [rcarrillom] pero el programa que estoy haciendo va fusionar el archivo mp3 con el txt para crear un nuevo archivo que solo pueda abrir el programa que estoy haciendo (con otra extensión), no hay necesidad de que otro reproductor lo haga puesto que ese no es el objetivo.
Como les iba diciendo no puedo separar los archivos una vez fusionados, hasta el momento puedo recuperar sus tamaños con
Cita:
compuesto.Position:=compuesto.Size-8;
//recupero el tamaño del archivo mp3 y del texto
compuesto.Read(tamanio,sizeof(tamanio));
porque como ven la estructura contiene dos tipos integer.
Al momento de recuperar con
Cita:
while (compuesto.Position<=tamanio.tam_mp3) do
begin
compuesto.Read(cont,sizeof(cont));
mp3.Write(cont,sizeof(cont));
compuesto.Position:=compuesto.Position+1;
end;
no me recupera el archivo como debería. tal vez pueda ser porque la variables cont es tipo pchar; no se me ocurre otro tipo de dato que tiene que ser buffer según la ayuda de delphi, bueno en realidad puse pchar por un ejemplo que tenía la ayuda.
el archivo que guarda es de menor tamaño (casi 25% más pequeño) que el archivo mp3 original.

también les quiero comentar que al fusionar los archivos los guarda bien puesto que el tamaño concuerda con el archivo original más el texto añadido.

alguna sugerencia.........

saludos.
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
  #10  
Antiguo 31-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
Bueno...... el objetivo es leer un archivo mp3, leer un archivo de texto, unir ambos y guardarlos en un archivo compuesto (esto ya es posible gracias al códio de khronos) con otra extensión, al momento abrir el archivo compuesto separar los archivos mp3 y texto, y leerlos separadamente; al momento de separarlos lo único que se debe hacer es leer el bloque mp3 y todo ese bloque guardarlo en un archivo mp3 (hasta el momento no me sale), de manera que pueda ser utilizado separadamente, lo mismo para el archivo de texto.

saludos.
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
  #11  
Antiguo 31-07-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
Ok.......... ya se cual era el problema...... como estoy haciendo uso de un archivo de acceso directo en el cual no se su estructura lo más lógico es copiar byte por byte hasta el tamaño der archivo mp3, con lo cual el tipo de variable buffer con el cual almaceno cada registro es tipo byte, además ya no necesito posicionar el puntero del registro puesto que la ller con redbuffer la salta al siguiente registro, entonces la función sería así:
Cita:
procedure abrir(acompuesto:string);
var
compuesto,mp3,texto:TFileStream;
tamanio:tamanio_mp3texto;
cont:byte;
begin
compuesto:=TFileStream.Create(acompuesto,fmOpenRead);
mp3:=TFileStream.Create('c:\prueba.mp3',fmCreate);
//me ubico para leer los tamaños de los archivos:
compuesto.Position:=compuesto.Size-8;
//recupero el tamaño del archivo mp3 y del texto
compuesto.Read(tamanio,sizeof(tamanio));
//posiciono al principio para copiar al archivo mp3
compuesto.Position:=0;
while (compuesto.Position<=tamanio.tam_mp3) do
begin
compuesto.Read(cont,sizeof(cont));
mp3.Write(cont,sizeof(cont));
end;
mp3.Free;
compuesto.Free;
end
como ven copio byte por byte al archivo mp3, lo compilé ejecutó y creo el archivo mp3 tal y es...........
pero hay un problema...........
como ven en el archivo estoy guardando el archivo mp3 en una ubicación del disco duro, (para ver si reproduce) pero lo que debería ser es que se cargue en memoria para poder utilizarlo para reproducirlo...... como puedo hacer esto?. me explico, una vez "separado" el archivo mp3 y el de texto debo reproducir el archivo con mediaplayer pero como ven al declarar el archivo lo guarda en alguna ubicación..... lo que sería bueno es que al momento de cargarlo no se guarde en ningún lado sino que esté en la memoria y pueda darle esa dirección al componente mediaplayer para que lo reproduzca...... puedo hacer eso?......... la solución que se me viene a la cabeza es guardarlo temporalmente en el disco duro, reproducirlo desde esa dirección y una vez cerrado el programa eliminarlo.....

Alguna sugerencia........

saludos.
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
  #12  
Antiguo 31-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Hola 2-D@monic, como te dije con los TFileStream se soluciona rapidamente.. Te hice un ejemplo que funciona perfectamente, une un archivo mp3 y un archivo de texto y te permite separarlos... está en el archivo adjunto.

Lo mejor es lo que tu dices, guardarlo temporalmente y luego eliminarlo..

Salu2
Archivos Adjuntos
Tipo de Archivo: zip Join.zip (7,4 KB, 13 visitas)
Responder Con Cita
  #13  
Antiguo 01-08-2008
Avatar de 2-D@monic
2-D@monic 2-D@monic is offline
Miembro
 
Registrado: may 2007
Posts: 94
Poder: 18
2-D@monic Va por buen camino
Ok khronos todo bien......... creo que sí.... guardaré temporalmente los archivos.
__________________
Soy pésimo en lo que mejor hago y por eso me siento bendecido.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como puedo grabar texto en un Archivo de Texto sin Sobreescribir???? AGAG4 Varios 12 08-11-2005 22:53:00
archivo de texto jovehe Impresión 16 13-10-2004 22:44:39
Db y archivo de texto carlospcs Conexión con bases de datos 0 10-08-2004 23:55:09
Db y archivo de texto carlospcs MySQL 0 10-08-2004 23:51:14
Archivo de Texto tiel Varios 5 16-07-2004 20:37:12


La franja horaria es GMT +2. Ahora son las 22:34:49.


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
Copyright 1996-2007 Club Delphi