Diseño de un cliente Streaming - Python

Iniciado por kamaxito, 8 Marzo 2012, 21:54 PM

0 Miembros y 1 Visitante están viendo este tema.

kamaxito

Buenas!!

Soy nuevo en esto de la programación y más aún en Python, puesto que es mi primer "programa".

Tengo que realizar lo siguiente: Diseño de un cliente de streaming (primera versión del nodo fuente). Una vez que disponemos de un stream continuo de audio y/o vídeo construiremos una aplicación cliente que se conecte con el servidor de streaming instalado en el hito anterior y descarge una copia del stream. Por tanto, hay que construir una aplicación que a partir de la dirección IP del host y el puerto donde Icecast está escuchando, realice una petición en regla. La respuesta por parte de Icecast a dicha petición es lo que más adelante enviaremos a los peers.

Algún manual, nociones o cualquier cosa que me sea de ayuda? Porque no se ni por dónde empezar ...




Bueno, pues por si a alguien le interesa, ésto es lo que he hecho y funciona a las mil maravillas :D

Código (python) [Seleccionar]
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 8000))
archi = open("c:\\Users\\Kamaxito\\Desktop\\archivo.bin", "wb")
s.send("GET /video HTTP/1.1\r\n\r\n")
datos = s.recv(1024)
while True:
   datos = s.recv(1024)
   archi.write(datos)





Elektro H@cker: Usa el botón "Insertar código"

kamaxito

Buenas, pues ahora toca enviar un video a un peer que se conecte a la fuente, es decir, a un equipo que se conectará a mi servidor IceCast.

La verdad, no tengo ni idea de cómo hacerlo, solo se que tengo que elegir el protocolo UDP con lo que ello conlleva ...

A ver si alguien se anima y me echa una manita, y no al cuello precisamente  ;-)

Coco88

#2
Hola

Yo también tengo que hacer esto. ¿Podría explicarme paso a paso como has hecho esto?

Código (python) [Seleccionar]
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 8000))
archi = open("c:\\Users\\Kamaxito\\Desktop\\archivo.bin", "wb")
s.send("GET /video HTTP/1.1\r\n\r\n")
datos = s.recv(1024)
while True:
   datos = s.recv(1024)
   archi.write(datos)



Muchas gracias




Elektro H@cker: Usa el botón "Insertar código"

Runex

#3
Cita de: Coco88 en 20 Abril 2012, 21:40 PM
Hola

Yo también tengo que hacer esto. ¿Podría explicarme paso a paso como has hecho esto?

Código (python) [Seleccionar]
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 8000))
archi = open("c:\\Users\\Kamaxito\\Desktop\\archivo.bin", "wb")
s.send("GET /video HTTP/1.1\r\n\r\n")
datos = s.recv(1024)
while True:
   datos = s.recv(1024)
   archi.write(datos)



Muchas gracias

Paso a paso, te puedo explicar yo más o menos como, pero los sockets poco los he tocado en mi vida xD.

En primer lugar inicia el socket, asignándolo a una variable denominada s.
Luego utiliza el método connect, de socket (s.socket) paáandole como parámetro "localhost", su propio Pc vamos xD y el puerto 8000, igual que le podría haber pasado cualquier otro.

Después abre un archivo en modo lectura y si no me equivoco, que lo más posible es que si, le envia una cadena de texto:  s.send("GET /video HTTP/1.1\r\n\r\n"), el GET no lo había visto por Python aún, si no es en Tkinter :S.

Lo último solamente inicia un bucle infinito, recibiendo datos del socket y guardando en el archivo abierto antes, lo recibido de éste.

Eso es más o menos una vista así por encima, no he podido especificar más porque poco sé de sockets, mejor que te ayude el autor :)

Un saludo :)
"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".

Coco88

Muchas gracias por tu respuesta.  :D

¿Y esto como lo ejecuto en ubuntu?

polmadur

Cita de: Coco88 en 23 Abril 2012, 11:58 AM

¿Y esto como lo ejecuto en ubuntu?

si no recuerdo mal, para ejecutarlo simplemente debes darle permisos de ejecucion y en la terminal ejecutar el comando

./"nombre del archivo

Existe otra opcion y es la de ejecutar directamente

python nombre del archivo

Coco88

Al ejecutarlo me da este error:  :huh:

AttributeError: 'module' object has no attribute 'AF_INET'

Coco88


Estudio de la tasa de pérdida de bloques en tres escenarios diferentes: (1) cuando source y peer se ejecutan en la misma máquina (localhost), (2) cuando lo hacen en la misma red local (preferiblemente a través de WiFi), aunque en máquinas diferentes y finalmente, (3) cuando lo hacen en redes diferentes (por ejemplo, entre dos casas). En cada una de estas tres situaciones, conteste a las preguntas:

-¿Se desordenan en algún momento los bloques de vídeo?, es decir, ¿llegan al peer los paquetes en el mismo orden que fueron enviados?

No tiene confirmación ni control de flujo, por lo que los paquetes pueden adelantarse unos a otros; y tampoco se sabe si ha llegado correctamente, ya que no hay confirmación de entrega o recepción.

-¿Se  pierden  paquetes?  Si  es  así,  ¿a  qué  crees  que  se  debe  dicha pérdida? ¿Existe alguna relación entre la tasa de pérdida de bloque de vídeo (de un determinado vídeo) y su bit-rate?

Este protocolo no está orientado a conexión y si se produce una pérdida de paquetes no se reenvian. Además la perdida de paquetes también se produce por descartes de paquetes que no llegan a tiempo al receptor.

Sin embargo la voz es bastante predictiva y si se pierden paquetes aislados se puede recomponer la voz de una manera bastante óptima. El problema es mayor cuando se producen pérdidas de paquetes en ráfagas.

Para evitar la pérdida de paquetes una técnica muy eficaz en redes con congestión o de baja velocidad es no transmitir los silencios. Gran parte de las conversaciones están llenas de momentos de silencio. Si solo transmitimos cuando haya información audible liberamos bastante los enlaces y evitamos fenómenos de congestión.
De todos modos este fenómeno puede estar también bastante relacionado con el jitter y el jitter buffer.

¿Algo más que añadir??

Saludos

Coco88

Hola

¿Estarían correctas las respuestas? Saludos

Coco88

Hola

¿Alguien sabe como sería el código?

Saludos