
Guardar archivo de audio-mp3 en un campo de una base de datos firebird
#1
Escrito 25 enero 2012 - 01:37
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.
#2
Escrito 25 enero 2012 - 03:00
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
#3
Escrito 25 enero 2012 - 03:45
Esto incluso te permite usar una bd de ficheros diferente por mes, o por año, o por zona de la empresa, etc.
#4
Escrito 25 enero 2012 - 06:15
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.

#5
Escrito 25 enero 2012 - 08:08
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 ?
#6
Escrito 25 enero 2012 - 11:07
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
#7
Escrito 25 enero 2012 - 11:24
Saludos.
#8
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
#9
Escrito 25 enero 2012 - 07:05
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.
#10
Escrito 25 enero 2012 - 07:20
if dlgOpen1.Execute then Query1TuCampoBlob.LoadFromFile(dlgOpen1.FileName); // para guardarlo 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.
#11
Escrito 26 enero 2012 - 02:43
#12
Escrito 26 enero 2012 - 07:26
por hay anda OGG me parece
Pos NO!

Saludos.
#13
Escrito 26 enero 2012 - 07:48
Creo funcionaria
#14
Escrito 26 enero 2012 - 08:59
Enecumene que componenentes puedo usar para comprimir en esos formatos que mencionas?
#15
Escrito 29 enero 2012 - 12:48
procedure TForm1.Button1Click(Sender: TObject); begin zQuery1.Open; // o ZQuery1.Active := True try if OpenDialog1.Execute then begin //INICIAR TRANSACCIÓN AQUÍ zQuery1.Append; // o ZQuey1.Insert 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 } ZQuery1LLAMADA.LoadFromFile(OpenDialog1.FileName); zQuery1.Post; try //commit transacion aquí except //Rollback transacción aqui end; end; finally zQuery1.Close; end;
para el proceso de ir oyendo los archivos en desde un dbgrid hago lo siguiente:
ZQuery1.Close; ZQuery1.SQL.Text:='select * from alarmas where alarmnum =:palarmnum'; ZQuery1.ParamByName('palarmnum').AsInteger:=ZQuery2ALARMNUM.AsInteger; ZQuery1.Open; ZQuery1LLAMADA.SaveToFile('c:\audio\luciano.mp3'); MediaPlayer1.FileName:='C:\audio\luciano.mp3'; ProgressBar1.Max:=0; MediaPlayer1.Close; MediaPlayer1.Open; MediaPlayer1.Play; 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
#16
Escrito 29 enero 2012 - 08:51
procedure TForm1.Button1Click(Sender: TObject); var Archivo: string; begin ZQuery1.Close; ZQuery1.SQL.Text := 'select * from alarmas where alarmnum =:palarmnum'; ZQuery1.ParamByName('palarmnum').AsInteger := ZQuery2ALARMNUM.AsInteger; Archivo := 'c:\audio\luciano'+IntToStr(ZQuery2ALARMNUM.AsInteger)+'.mp3'; ZQuery1.Open; ZQuery1LLAMADA.SaveToFile(Archivo); MediaPlayer1.Close; MediaPlayer1.FileName := Archivo; ProgressBar1.Max := 0; MediaPlayer1.Open; MediaPlayer1.Play; ProgressBar1.Max := MediaPlayer1.Length; end;
Saludos
#17
Escrito 29 enero 2012 - 08:08
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject); begin ZQuery1.Close; ZQuery1.SQL.Text:='select * from alarmas where alarmnum =:palarmnum'; ZQuery1.ParamByName('palarmnum').AsInteger:=ZQuery2ALARMNUM.AsInteger; ZQuery1.Open; if FileExists('c:\audio\lciano.mp3') then begin deletefile('c:\audio\lciano.mp3' ); ZQuery1LLAMADA.SaveToFile('c:\audio\luciano.mp3'); MediaPlayer1.FileName:='C:\audio\luciano.mp3'; end else begin deletefile('c:\audio\luciano.mp3' ); ZQuery1LLAMADA.SaveToFile('c:\audio\lciano.mp3'); MediaPlayer1.FileName:='C:\audio\lciano.mp3'; end; ProgressBar1.Max:=0; MediaPlayer1.Close; MediaPlayer1.Open; MediaPlayer1.Play; ProgressBar1.Max := MediaPlayer1.Length; end;
con ello creo un archivo y luego lo borro con el siguiente click. Que piensas de hacerlo asi.
#18
Escrito 29 enero 2012 - 09:05
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject); begin MediaPlayer1.Close; if FileExists('c:\audio\luciano.mp3') then deletefile('c:\audio\luciano.mp3'); ZQuery1.SQL.Text := 'select * from alarmas where alarmnum =:palarmnum'; ZQuery1.ParamByName('palarmnum').AsInteger := ZQuery2ALARMNUM.AsInteger; try ZQuery1.Open; ZQuery1LLAMADA.SaveToFile('c:\audio\luciano.mp3'); finally ZQuery1.Close; end; MediaPlayer1.FileName := 'C:\audio\luciano.mp3'; ProgressBar1.Max := 0; MediaPlayer1.Open; MediaPlayer1.Play; ProgressBar1.Max := MediaPlayer1.Length; end;
#19
Escrito 29 enero 2012 - 11:41
Root espero tu respuesta de que tipo de central telefonica tienes y como capturas las llamadas.
#20
Escrito 28 marzo 2012 - 10:17
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.