Ir al contenido


Foto

Guardar grabaciones de audio en la base de datos


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

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 24 agosto 2014 - 01:53

Hola a todos

He comprado un grabador de llamadas telefonicas, el cual archiva dichas llamadas en un directorio de la siguiente manera:
Ejemplo: D:\usb-record\2014\08\22\2014-08-22_15-40-22_000_8095638902.mp3

La idea es que las llamadas se van a guardar en la computadora donde esta la base de datos, hasta ahi todo bien.

el problema esta en como archivar en estas llamadas en la base de datos con un programa delphi que estara en otras computadoras, ya que no quiero compartir en la red, las carpetas donde dichas llamadas van a ser archivadas.

se, porque lo hemos tratado en el foro que para guardar la llamada telefonica en firebird puedo hacer algo como esto:



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;



donde a opendialog1.filename, lo puedo sustituir por la ruta del archivo.  Pero si el archivo no esta en la computadora donde esta el programa de delphi, entonces tendria que compartir en la red las carpetas del servidor donde estan estos archivos de audio.

He pensado hacer un trigger o un store procedure que maneje el asunto. El problema es que queria que estos archivos estuvieran en otra base de datos para que no creciera demasiado la base de datos principal.


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 agosto 2014 - 08:15

Yo nunca lo he probado, pero creería que no habría problema es guardar en un BLOB los mp3. Debiera ser como tratar cualquier otro BLOB de toda la vida, al leer el Stream del blob se lo pasaría al reproductor. Lo que no recuerdo es si el componente que viene por defecto en Delphi tiene la posibilidad de leer un Stream, algo como LoadFromStream().
Si no la otra posibilidad es una vez recuperado el Stram guardardo en un directorio temporal con la extensión mp3 (o la que fuera) y mandar este path completo al reproductor. Luego de reproducirlo, borrar este archivo.

Ahora bien, el problema es que si tu esperas guardar los archivos de audio en una 2da base de datos vas a necesitar de un 2do IBDatabase y los DataSet y Transactions que te sean necesarios.
No recuerdo bien si desde 2.5 o si era algo planeado para la 3.0 que se pueda hacer operaciones cross database. Por eso te digo que va a ser necesario de más componentes. Y si es que ya 2.5 cuenta con esto estoy en serias dudas de que los componentes de Delphi por defecto para Firebird estén preparados para trabajar con esto.

Saludos,
PD: Recuerda Luk2009 que ya está disponible las etiquetas. Puedes hacerlo de 2 formas:
[nobbc]


delphi
  1.  





delphi
  1.  


[/nobbc]
  • 0

#3 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 24 agosto 2014 - 09:02

Gracias delphius por responder

para reproducir lo hare como indicas con un archivo temporal, como lo hanlamos en este hilo: Hilo

El problema esta en enviar un comando para grabar un archivo que esta en otra pc en la base de datos, sin que esa carpeta este compartida.

Otra opcion que he pensado es la de crear un programita en el servidor que cuando se genere el evento haga el analisis del archivo y lo guarde en la otra base de datos. Este programa tendria dos conexiones, una para cada base de datos. Utilizo Zeos y firebird 2.1 y como bien dice delphius, a partir de la 2.5 es que se puede hacer cross database.

la idea es que cuando se genera una alarma, el operador realiza una o varias llamadas y luego cierra la operacion.  El grabador ubica los audios de estas llamadas, creando una estructura:
D:\usb-record\2014\08\22\2014-08-22_15-40-22_000_8095638902.mp3  de año,mes,dia, y luego pone el nombre del archivo con todos estos datos mas la hora, luego un 000, que no se para que es y luego el numero de telefono al cual se llamó.

El programita delphi que deje en el servidor, tiene que establecer cuales de esos archivos corresponden a esa alarma en particular, para ello hara una busqueda de los telefonos que correspondan a ese cliente y compararlos con los archivos que se hayan generado en el intervalo en  que la alarma se completó.

luego guardar los que correspondan a ese cliente en la base de datos de llamadas.


  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 24 agosto 2014 - 11:27

Desconozco la arquitectura y diseño de tu aplicación, pero  con Datasnap, desarrollando un servidor y correrlo en el pc que quieres aislar, luego desde los pcs clientes solo ejecutas el método en el servidor que hace la tarea, con esta solución no tendrías que compartir carpetas ni nada de esas cosas.

Saludos.
  • 0

#5 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 24 agosto 2014 - 03:52

Hola Wilson como estas?

La aplicacion esta hecha con delphi 7 y la verdad es que nunca he utilizado datasnap, viendo este VIDEO De Luis Felipe Gonzalez me he dado una idea del asunto.

Pero no se como podria utilizarlo en este caso. Porque los archivos de audio se crean de manera independiente por un grabador de llamadas, en unas carpetas de windows. La idea es tener acceso a estos archivos desde cualquier otra pc en la red. Por esta razon quiero guardar estos archivos en una base de datos y con ello poder accesar sin problemas.



  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 24 agosto 2014 - 04:26

Hola Wilson como estas?

La aplicacion esta hecha con delphi 7 y la verdad es que nunca he utilizado datasnap, viendo este VIDEO De Luis Felipe Gonzalez me he dado una idea del asunto.

Pero no se como podria utilizarlo en este caso. Porque los archivos de audio se crean de manera independiente por un grabador de llamadas, en unas carpetas de windows. La idea es tener acceso a estos archivos desde cualquier otra pc en la red. Por esta razon quiero guardar estos archivos en una base de datos y con ello poder accesar sin problemas.


Todo bien Luciano, lo que quieres hacer con respecto a las carpetas y los archivos no tienen mayores inconvenientes, lo que tiene algo de complejidad es desarrollarlo en Delphi 7, dada la tecnología que este usa, sería mucho más fácil y eficiente hacerlo con una versión igual o posterior a Delphi 2009 preferiblemente superior a XE, por el soporte nativo que tiene para ejecutar métodos en el servidor y para  el intercambio de archivos.

Es probable que los maestros que dominan la Api de windows sugieran algún método más directo para tal fin, sin necesidad de usar Datasnap.

Saludos.

  • 0

#7 Rolphy Reyes

Rolphy Reyes

    Advanced Member

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

Escrito 25 agosto 2014 - 07:49

Saludos.

Creo que la mejor idea, desde mi punto de vista, es crear un servicio e instalarlo en cada PC.

La idea del servicio consistiría en estar leyendo el directorio donde se almacenan los archivos MP3, una vez que haya algún cambio validar si ese archivo ya fue cargado a la BD y luego moverlo a otro directorio o eliminarlo para que la carpeta siempre este en blanco, así sabrías que cuando haya un cambio el directorio es porque un archivo nuevo se copio al directorio.
  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 25 agosto 2014 - 11:26

Gracias Rolphy

Estoy creando un programita que hace algo parecido. Este programita va a estar en el servidor y lo primero que hara es establecer el intervalo de tiempo en el cual el operador completó el procedimiento de determinado cliente y guardarlo en una tabla.  Luego de esto debo crear la ruta al directorio con DecodeDateTime en la fecha de inicio del procedimiento de donde sacare el año,mes y dia. 

luego hay que leer el directorio buscando los archivos que corresponda a ese cliente y en determinado intervalo de tiempo.
para luego guardar en la otra base de datos los archivos de audio que correspondan.

estoy pensando hacer un stringlist con los archivos que haya en el directorio. alguna idea de como recorrer el directorio que pueda buscar por hora y por telefono.



  • 0




IP.Board spam blocked by CleanTalk.