Ir al contenido


Foto

Guardar archivo de audio-mp3 en un campo de una base de datos firebird


  • Por favor identifícate para responder
19 respuestas en este tema

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 25 enero 2012 - 01:37

Hola a todos

La idea es guardar un archivo de audio, en este caso mp3 en un campo de una base de datos firebird.

La idea es grabar una llamada telefonica en una computadora y luego pasar ese archivo al servidor y ademas guardarlo en una tabla de una base de datos.

Cual es la mejor manera de hacerlo?

Ya el proceso de grabacion esta hecho con Lame y con Bass.


  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 25 enero 2012 - 03:00

Debes de crear un campo blob de tipo binary. Luego ya dependerá del lenguaje que uses para hacer el insert del dato correspondiente. Si es Delphi (y si no recuerdo mal porque no lo tengo a mano) sería algo así



delphi
  1. TablaCampoBlob.LoadFromFile('archivo.mp3');



No obstante, advertirte que ésto hará que la BD te crezca mucho por lo que te recomiendo que grabes los archivos en una carpeta del servidor y en la BD sólo la ruta

Nos leemos
  • 0

#3 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 25 enero 2012 - 03:45

Personalmente dejar los ficheros en una carpeta nunca me gusto, prefiero crear una base de datos solo para los ficheros, con una sola tabla con un campo nombre y otro con el blob, mas un tercer campo "ID", así, al dar de alta un nuevo fichero obtengo un ID y luego, en la base de datos primaria, almaceno solo el ID del fichero, para tenerlo todo conectado.

Esto incluso te permite usar una bd de ficheros diferente por mes, o por año, o por zona de la empresa, etc.
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 25 enero 2012 - 06:15

Saludos.

Comparto la idea de Sergio, puedes crear una BD diferente para los archivos MP3 y me imagino que accederás a ella a través de Delphi que para el usuario es transparente el proceso.

Si llegara a crecer demasiado y eres tú quien le da soporte a la aplicación podrías crear nuevas BD y guardar las "viejas" pudiendo crear una aplicación para históricos.

Creo que tienes bastante tela por donde cortar. (y)
  • 0

#5 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 25 enero 2012 - 08:08

Si mr las llamadas consumen mucho mucho
espacio en disco

en donde trabajo alrededor de 120 gb mensuales

Y solamente tengo 22 extensiones
Y 10 troncales

una disa

y no ocupamos buzones de voz

No.se tu volumen estimado de llamadas
pero piensale por el lado de el tamaño de la Db

por otro lado
que sistema de telefonia usas ?

  • 0

#6 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 25 enero 2012 - 11:07

Coincido con Sergio en la implementación de una base independiente para blob's ya que como bien mencionan, consultas e históricos te ayudaría mucho; con firebird 2.5 puedes consultar através de SP'S bases de firebird externas además de tiempo de los backup, un punto importante lo que menciona root es la codificación de los archivos, creo dado que utilizas lame y solo vas a grabar voz: mp3 una codificación: bitrate a 48K o 64K, Mono, VBR para la compresión para evitar consumir mucho espacio en disco y listo.

Para realizar pruebas de codificación un software de edición de audio te podría dar una buena idea para la configuración adecuada de audio a utilizar.

Saludos luk
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 25 enero 2012 - 11:24

Necesariamente debe ser en MP3?, existen otros formatos que consumen mucho menos espacios.

Saludos.
  • 0

#8 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 25 enero 2012 - 11:26

Necesariamente debe ser en MP3?, existen otros formatos que consumen mucho menos espacios.

Saludos.


por hay anda OGG me parece

  • 0

#9 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 25 enero 2012 - 07:05

Gracias a todos por sus respuestas.

Me gusta la idea de crear una base de datos solo para los archivos de audio.

No tienen que ser necesariamente mp3, ya que solo voy a grabar voz.

El volumen de llamadas no es tan alto, ya que solo se grabaran llamadas especificas, en relacion a eventos especificos.

Preguntas:

Como se graba un archivo de audio en un campo blob de una base de datos?
Usando zeos y firebird por ejemplo?
Estoy usando Lame y Bass para generar el archivo, pero no tengo muchos conocimientos de su manejo. Hace un tiempo Enecumene me explico algunas cosas y ahora que retomo el proyecto, estoy viendo la mejor forma de hacerlo.

Como no tengo una central telefonica, estoy viendo la mejor manera de captar el audio de la llamada, asi que cualquier sugerencia es bienvenida.


  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 enero 2012 - 07:20

Una vez tengas tu llamada como un archivo cualquiera que sea su extensión,  lo guardas con un OpenDialog:



delphi
  1.   if dlgOpen1.Execute then
  2.   Query1TuCampoBlob.LoadFromFile(dlgOpen1.FileName); // para guardarlo
  3.  
  4.  
  5. Query1TuCampoBlob.SaveToFile('c:\TuArchivo.tuExtension');// Para recuperarlo



Esto aplica para cualquier tipo de archivo.

Saludos

PD: Para recuperarlo podrías valerte de una carpeta temporal y abrirlo con el programa de tu gusto, o podrías hacerlo directamente a un componente Delphi que sea capaz de reproducir el formato escogido.
  • 0

#11 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 26 enero 2012 - 02:43

No sería LoadFromFlile como puse yo más arriba??
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 26 enero 2012 - 07:26

por hay anda OGG me parece


Pos NO! :D, hay dos opciones, hasta ahora los que menos espacio son el RM y el M4e este ultimo ocupa 1/3 de lo que ocupa un Mp3.

Saludos.
  • 0

#13 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 26 enero 2012 - 07:48

Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, general-purpose compressed audio format for mid to high quality (8kHz-48.0kHz, 16+ bit, polyphonic) audio and music at fixed and variable bitrates from 16 to 128 kbps/channel. This places Vorbis in the same competitive classas audio representations such as MPEG-4 (AAC), and similar to, but higher performance than MPEG-1/2 audio layer 3, MPEG-4 audio (TwinVQ),WMA and PAC.

Creo funcionaria
  • 0

#14 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 26 enero 2012 - 08:59

root  que central telefonica tienen en tu oficina?

Enecumene que componenentes puedo usar para comprimir en esos formatos que mencionas?


  • 0

#15 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 29 enero 2012 - 12:48

Gracias a WILSON, El proceso de grabar quedo para pruebas asi:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   zQuery1.Open; // o ZQuery1.Active := True
  4.   try
  5.     if OpenDialog1.Execute then
  6.     begin
  7.       //INICIAR TRANSACCIÓN AQUÍ
  8.       zQuery1.Append; // o ZQuey1.Insert
  9.       ZQuery1ALARMNUM.asInteger :=3 ;    { Si ya dispones de algún trigger o procedimiento en la DB que asigne ese número desde un generador, entonces esta líneano es necesaria }
  10.       ZQuery1LLAMADA.LoadFromFile(OpenDialog1.FileName);
  11.       zQuery1.Post;
  12.       try
  13.       //commit transacion aquí
  14.       except
  15.       //Rollback transacción aqui
  16.       end;
  17.     end;
  18.   finally
  19.   zQuery1.Close;
  20.   end;



para el proceso de ir oyendo los archivos en desde un dbgrid hago lo siguiente:



delphi
  1. ZQuery1.Close;
  2. ZQuery1.SQL.Text:='select * from alarmas where alarmnum =:palarmnum';
  3. ZQuery1.ParamByName('palarmnum').AsInteger:=ZQuery2ALARMNUM.AsInteger;
  4. ZQuery1.Open;
  5. ZQuery1LLAMADA.SaveToFile('c:\audio\luciano.mp3');
  6. MediaPlayer1.FileName:='C:\audio\luciano.mp3';
  7. ProgressBar1.Max:=0;
  8. MediaPlayer1.Close;
  9. MediaPlayer1.Open;
  10. MediaPlayer1.Play;
  11. ProgressBar1.Max := MediaPlayer1.Length;



mi problema esta en que si le doy a otro registro en el dbgrid, me sale el error de que el archivo esta siendo utilizado.

Como libero el archivo al momento de darle a boton del dbgrid para poder escucharlo?

gracias por adelantado
  • 0

#16 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 29 enero 2012 - 08:51

A  manera de pruebas y con base en tu algoritmo, intenta con  lo siguiente, donde la carpeta AUDIO/LUCIANO sería un carpeta temporal, y por cada registro que ejecutes crearía un archivo  diferente, después tendrás que hacer una rutina para limpiar la carpeta temporal para que no crezca mucho.



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Archivo: string;
  4. begin
  5.   ZQuery1.Close;
  6.   ZQuery1.SQL.Text := 'select * from alarmas where alarmnum =:palarmnum';
  7.   ZQuery1.ParamByName('palarmnum').AsInteger := ZQuery2ALARMNUM.AsInteger;
  8.   Archivo := 'c:\audio\luciano'+IntToStr(ZQuery2ALARMNUM.AsInteger)+'.mp3';
  9.   ZQuery1.Open;
  10.   ZQuery1LLAMADA.SaveToFile(Archivo);
  11.   MediaPlayer1.Close;
  12.   MediaPlayer1.FileName := Archivo;
  13.   ProgressBar1.Max := 0;
  14.   MediaPlayer1.Open;
  15.   MediaPlayer1.Play;
  16.   ProgressBar1.Max := MediaPlayer1.Length;
  17. end;



Saludos
  • 0

#17 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 29 enero 2012 - 08:08

Gracias Wilson por responder, habia hecho esto:



delphi
  1. procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
  2. begin
  3.   ZQuery1.Close;
  4.   ZQuery1.SQL.Text:='select * from alarmas where alarmnum =:palarmnum';
  5.   ZQuery1.ParamByName('palarmnum').AsInteger:=ZQuery2ALARMNUM.AsInteger;
  6.   ZQuery1.Open;
  7.   if FileExists('c:\audio\lciano.mp3') then
  8.     begin
  9.       deletefile('c:\audio\lciano.mp3' );
  10.       ZQuery1LLAMADA.SaveToFile('c:\audio\luciano.mp3');
  11.       MediaPlayer1.FileName:='C:\audio\luciano.mp3';
  12.     end
  13.   else
  14.     begin
  15.       deletefile('c:\audio\luciano.mp3' );
  16.       ZQuery1LLAMADA.SaveToFile('c:\audio\lciano.mp3');
  17.       MediaPlayer1.FileName:='C:\audio\lciano.mp3';
  18.     end;
  19.   ProgressBar1.Max:=0;
  20.   MediaPlayer1.Close;
  21.   MediaPlayer1.Open;
  22.   MediaPlayer1.Play;
  23.   ProgressBar1.Max := MediaPlayer1.Length;
  24. end;



con ello creo un archivo y luego lo borro con el siguiente click. Que piensas de hacerlo asi.
  • 0

#18 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 29 enero 2012 - 09:05

Si, así también funciona, allí  lo depuro un poco.



delphi
  1. procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
  2. begin
  3.   MediaPlayer1.Close;
  4.   if FileExists('c:\audio\luciano.mp3') then
  5.     deletefile('c:\audio\luciano.mp3');
  6.   ZQuery1.SQL.Text := 'select * from alarmas where alarmnum =:palarmnum';
  7.   ZQuery1.ParamByName('palarmnum').AsInteger := ZQuery2ALARMNUM.AsInteger;
  8.   try
  9.     ZQuery1.Open;
  10.     ZQuery1LLAMADA.SaveToFile('c:\audio\luciano.mp3');
  11.   finally
  12.     ZQuery1.Close;
  13.   end;
  14.   MediaPlayer1.FileName := 'C:\audio\luciano.mp3';
  15.   ProgressBar1.Max := 0;
  16.   MediaPlayer1.Open;
  17.   MediaPlayer1.Play;
  18.   ProgressBar1.Max := MediaPlayer1.Length;
  19. end;


  • 0

#19 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 29 enero 2012 - 11:41

muchas gracias wilson funciona muy bien;

Root espero tu respuesta de que tipo de central telefonica tienes y como capturas las llamadas.


  • 0

#20 rretamar

rretamar

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 28 marzo 2012 - 10:17

Tuve la oportunidad de trabajar en un proyecto como el tuyo (que actualmente está funcionando 24x7 en varios sitios) y saqué varias conclusiones, acá van:

1) Es una locura guardar imágenes, videos o audio en una base de datos. No sólo por el enorme tamaño que tendrá, sino porque existe la posibilidad de que la base de datos se corrompa y pierdas TODO. Sí, todo. Mejor tener un campo donde se guarde un nombre de un archivo y mantener los archivos (de audio, video o imágenes) separados, creando automáticamente una estructura de directorios en forma cronológica (por ejemplo años/meses/días), ya que es sabido que un directorio con muchas entradas se vuelve inmanejable luego de una cierta cantidad de archivos. De esa forma la base de datos quedó pequeña y cero problemas. Además, y esto es interesante, se puede RECONSTRUIR LA BASE DE DATOS recorriendo la estructura de directorios, para ello me ayudo almacenando ciertos datos en el nombre de los archivos. De hecho el software que escribí contempla esa posibilidad. La base de datos que usé fue inicialmente SQLITE (aka "lo pequeño es bello"), pero luego necesité accesos concurrentes (multiusuario), así que migré a FIREBIRD.

Una frase que resume lo dicho en pocas palabras:

Un profesor nos decía "¿Puedes hacer una query a un campo binario que te devuelta todos los registros donde hay imágenes de morenas con ojos verdes? ¡¡¡NO!!! Entonces... ¿Porqué guardas la fotografía en la base de datos si no puedes saber que hay en ese campo?"

  ;)

2) El formato de audio: luego de evaluzar muchos formatos de compresión de audio, para la banda vocal (frecuencia de muestreo entre 0 y aproximadamente 3 khz) me decanté por el formato SPEEX: es un formato libre y optimizado para compresión de voz. Los archivos resultantes son muy pequeños y la calidad de audio es muy buena.

http://www.speex.org/


Mis dos centavos al tema.
  • 0




IP.Board spam blocked by CleanTalk.