c# - pages - javascript asp net
Proxing videos localmente con un zócalo TCP (3)
He estado realmente interesado en agregar soporte para podcasts de video a Media Browser.
Me gustaría que los usuarios puedan navegar a través de los podcasts de video disponibles y transmitirlos desde los internets. Eso es realmente fácil porque el reproductor de medios, etc., jugará alegremente un archivo que vive en la nube.
El problema es que quiero almacenar en caché estos archivos localmente, por lo que las vistas posteriores del mismo episodio no implicarán la transmisión y, en su lugar, reproducirán el archivo local.
Entonces ... estaba pensando, ¿por qué no alojar un HttpListener
y cuando el reproductor multimedia le pide partes del archivo, HttpListener
descargue y lo almacene localmente? La próxima vez que un usuario reproduzca el archivo, ya tendremos porciones del archivo localmente.
¿Alguien sabe de código de ejemplo que utiliza HttpListener
para HttpListener
?
EDITAR
La idea sería solo proxy de contenido transmisible simple como MP3 o Mov. La recompensa se destinará a una implementación real.
Aquí está la API que me gustaría:
// will proxy a uri on the local port, if cacheFile exists it will resume the
// download from cacheFile.
// while the file is downloading it will be name cacheFile.partial, after the
// download is complete the file will be renamed to cacheFile.
// Example usage: ProxyFile("http://media.railscasts.com/videos/176_searchlogic.mov", 8000, @"c:/downloads/railscasts/176_searchlogic.mov")
//
// Directly after this call http://localhost:8000 will be the proxy stream, it will be playable locally.
void ProxyUri(Uri uri, int port, string cacheFile)
Editar 2
HttpListener
parece bastante poco prometedor. Probablemente necesite hacer el trabajo en un nivel de socket TCP ya que HttpListener
s parece requerir que el programa se ejecute como administrador, lo que será realmente complicado.
Streaming no fue diseñado para ser guardado, y estos protocolos también son muy personalizados y muy complejos de implementar, las sesiones de transmisión hacen mucha validación y sincronización que será extremadamente difícil de imitar. Por supuesto, no es una tarea imposible, pero es una tarea bastante grande de hacer. Solo otra forma es leer y guardarlo como un archivo de medios local, y usarlo como referencia. Porque puede usar el codificador de medios de Windows para leer secuencias y escribir datos de secuencias como archivos locales, pero aún así puede no permitirle copiar datos protegidos.
¿Consideró usar el proxy HTTP con funciones de almacenamiento en caché?
Me gusta:
Ver también Web Cache @ wikipedia
Si desea que su aplicación tenga dicho componente de caché web, le sugiero que busque la implementación de caché web en .Net y no la codifique desde cero.
No había hecho nada con HttpListener
antes, así que pensé que sería un buen ejercicio para ponerme al día con él, y así lo demostró. Lo implementé como una única clase ProxyListener
cuyo constructor toma los parámetros de la función ProxyUri
que especificó. Una vez que obtenga una instancia, comience a escuchar (y potencialmente a descargar) llamando a su método de Start
. Cuando haya terminado con esto, llame a Cleanup
.
Hay uno o dos bordes ásperos, pero básicamente funciona según tu pregunta. Para probarlo, lo construí como una aplicación de consola con una clase de Program
que acepta líneas de entrada que constan de (uri, puerto, nombre de archivo), separadas por espacios, crea las instancias de ProxyListener
y las inicia. Puede ejecutar esta aplicación de consola, escribir una línea adecuada y el programa de descarga se iniciará (imprimiendo el progreso a la consola). Simultáneamente, puede, por ejemplo, iniciar IE y buscar el archivo desde el puerto especificado, y podrá descargarlo mientras el programa de descarga sigue funcionando. El progreso del "cargador" también se imprimirá en la consola.
Tengo problemas para pegarlo aquí, tal vez por tamaño (no es tan grande, pero es más grande que los fragmentos que normalmente ves aquí, la clase ProxyListener
tiene menos de 200 líneas). ¿Suena interesante? Si es así, lo publicaré en un pastebin y actualizaré esta respuesta con un enlace.
Actualización: publicado como una esencia .
Tenga en cuenta que necesitará privilegios de administrador para ejecutar el programa, ya que HttpListener
requiere.
Actualización 2: en determinadas circunstancias, no es necesario tener privilegios de administrador para ejecutar HttpListener
. Ver este enlace y este . La idea es, si puede reservar un espacio de nombre de URL durante el tiempo de instalación, entonces el usuario no tiene que tener privilegios de administrador si escucha en contra de ese espacio de nombres.