Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   enviar archivo audio (https://www.clubdelphi.com/foros/showthread.php?t=41803)

jeyco 26-03-2007 17:08:35

enviar archivo audio
 
Hola, necesito enviar un archivo a otro ordenador a traves de udp y no se como hacerlo, alguien sabe?

seoane 26-03-2007 18:24:54

Solo por curiosidad ¿por que udp y no tcp? Si te decides a usar udp tendras que enviar el archivo dividido en pequeños trozos, y no tendras forma de saber si llegaron a su destino ni en que orden. Tendras que realizar tu las comprobaciones pertinentes tanto en el origen como en el destino, es decir, el mismo trbajao que ya hace tcp. No entiendo porque en este caso te decides por udp :confused:

De todas formas si te decides a realizarlo con udp, yo lo haria de la siguiente manera. Mandaria mensajes udp de un tamaño fijo, para eso utilizaria un record, algo como esto:
Código Delphi [-]
type
  TPaquete = record
    Numero: Integer;
    Longitud: Integer;
    // Mensajes de mas de 256, a mi, no me sulen dar buen resultado
    Datos: array[0..127] of Bytes;   
  end;

Ahora el programa que envia partiria el archivo en trozos no mas grandes de 128 bytes. Con esa infroamcion rellenaria el record, donde numero seria la posicion que ocupa ese trozo dentro del archivo (0,1,2,3), Longitud el numero de bytes del array que pertenecen al archivo (nomalmente valdra 128, menos en el ultimo paquete que puede ser menor).

Por parte el receptor recibiria los paquetes y los colocaria en su lugar para recomponer el archivo, llevando la cuenta de los paquetes recibidos y comprobando asi que han llegado todos.

Tampoco estaria mal incluir en el record el numero total de paquetes o el nombre del archivo. Pero eso lo puedes dejar para mas adelante.

Lo dicho, piensate lo de TCP y si todavia quieres hacerlo por UDP y no sabes por donde empezar, vuelve a preguntar e intentare poner algo de codigo.

jeyco 26-03-2007 19:00:25

Hola, muchas gracias por responder...
En realidad es que tengo que hacer mi proyecto fin de carrera con delphi y la verdad es que no tengo casi ni idea de delphi. Lo que necesito hacer es un programa que envie un archivo de musica por internet a otro ordenador, y otro programa que lo reciba y lo reproduzca en tiempo real. No se muy bien por donde comenzar. Por eso lo de UDP, me dijeron que para reproducir en tiempo real no servia el TCP. ¿Se podria reproducir en tiempo real con TCP? Perdon por mi ignorancia, pero es que estoy empezando con delphi.

seoane 27-03-2007 00:46:52

Vaya, empezáramos por ahí. Tu no quieres transmitir un archivo, tu lo que quieres es transmitir audio, lo que se suele llamar streamming. En ese caso la cosa cambia, y como ya te habían dicho, el udp puede ser una buena opción.

Te preguntaras porque ahora el udp es bueno, pues por la misma razón que antes era malo :D . TCP controla la transmisión, controla que los paquetes lleguen ordenados, y sobre todo, que lleguen todos, volviendo a enviar los paquetes que se pierden por el camino. Esto es perfecto si queremos transmitir un archivo y queremos estar seguros de que llega completo al otro lado, pero introduce retardos en la transmisión. Sin embargo cuando transmitimos audio no nos importa que lleguen todos los paquetes, que se pierdan un par de paquetes entre un par de cientos, no afectara demasiado a la calidad del sonido. Tampoco nos importa tanto que no lleguen ordenados, si un par de paquetes llegan tarde se desechan y punto.

Mi consejo, ya que estas haciendo un proyecto importante, es que intentes implementar alguno de los protocolos que ya existen para transmitir audio. Primero intenta desarrollar el cliente y pruebalo con cualquier reproductor que soporte streamming. Luego, una vez probado el servidor, comienza a desarrollar tu propio cliente.

Si te decides a hacerlo tu mismo yo empezaría por un diseño sencillo, partiría la información en paquetes pequeños y los transmitiría de una manera similar a como describí arriba con los ficheros. Pero ahora utilizaremos un parámetro diferente, una marca de tiempo. Cuando el cliente reciba los paquetes, los mandara a reproducir en el momento que indica su marca de tiempo, si un paquete llega con una marca de tiempo anterior al punto donde se encuentra la reproducción simplemente lo desechamos, si llegado a un punto todavía no ha llegado el paquete que va en ese lugar pues no reproducimos nada y continuamos con el siguiente cuando le llegue su turno.

Como ves, aun intentando simplificarlo, no es un algo sencillo por eso te aconsejo que para comenzar con buen pie intentes imitar alguno de los protocolos que ya se usan y que se supone que dan buen resultado.

Crandel 27-03-2007 01:08:01

Como te dice seoane, debes escribir un protocolo de transmicion basado en udp. Pero por supuesto ya esta escrito y seguro que puedes encontrar varios ejemplos por ahi, una busqueda rapida me dio con estos componentes para delphi.

Pero seguro que puedes encontrar mas buscando por las palabras claves "stream audio" o "streaming audio"

jeyco 27-03-2007 01:57:32

Muchas gracias por las indicaciones, empezare por ahi a ver lo que puedo hacer...
Un saludo...

jeyco 28-03-2007 03:49:43

Bueno ya he conseguido enviar los paquetes UDP y que lleguen a su destino. Mi problema ahora es como reproducirlo mientras van llegando. No se como hacerlo...


La franja horaria es GMT +2. Ahora son las 19:10:13.

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