2010-07-21 6 views
12

Últimamente he estado investigando diferentes métodos para la transmisión de MP4 al navegador. Flash Media Server es una opción obvia aquí (usando Cloudfront), y la mayoría de las soluciones que he visto usan el protocolo RTMP.¿Tecnología HD Streaming Server de YouTube?

Sin embargo, pasé un tiempo en YouTube con el depurador Firebug y Chrome averiguando cómo funcionaba la transmisión y descubrí algunas diferencias interesantes entre algunos de sus videos y las tasas de calidad.

Mis dos videos de muestra son A y B. A está disponible hasta 480p y B está disponible hasta 1080p. Para ambos videos, todas las tarifas de hasta 480p se sirven en un contenedor FLV con video H.264 y audio AAC, a través de HTTP. Lo que es interesante aquí es que si aún no ha descargado (en caché) todo el video, e intenta pasar a una parte del video que no se ha guardado en la memoria caché, se realizará una nueva solicitud con un parámetro 'comenzar' igual al desplazamiento del objetivo en milisegundos. Ejemplo de vídeo a 480p A:

http://v11.lscache8.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dWTldQVF9FSkNNNl9PSlhJ&fexp=904806%2C902906%2C903711&algorithm=throttle-factor&itag=35&ipbits=0&burst=40&sver=3&expire=1279756800&key=yt1&signature=D2D704D63C242CF187CAA5B5D5BAFB8DFACAC5FF.39180C01559C976717B651A7EB1D0C6249231EB7&factor=1.25&id=8568eb3135971f6f&begin=111863 

Response Headers: 
Cache-Control:public,max-age=23472 
Connection:close 
Content-Length:14320637 
Content-Type:video/x-flv 
Date:Wed, 21 Jul 2010 17:23:48 GMT 
Expires:Wed, 21 Jul 2010 23:55:00 GMT 
Last-Modified:Wed, 19 May 2010 12:31:41 GMT 
Server:gvs 1.0 
X-Content-Type-Options:nosniff 

El archivo devuelto por esta URL es un FLV totalmente válido que contenga sólo la parte del vídeo después de lo solicitado offset.

Hice el mismo tipo de prueba en las versiones de mayor resolución de Video B. A 720p y 1080p, YouTube devolverá un video en un contenedor MP4, también con video H.264 y audio AAC. Lo que es impresionante para mí es que su servidor toma el mismo tipo de compensación para un video MP4 (a través del parámetro 'begin') y devuelve un MP4 válido y transmisible (átomo moov en la parte delantera del archivo con compensaciones correctas) que también solo incluye la porción solicitada del video.

Entonces, ¿cómo lo hace YouTube? ¿Cómo generan el contenedor FLV o MP4 sobre la marcha con los encabezados correctos y solo el segmento deseado del video solicitado? Sé que esto se puede lograr utilizando FFMPEG para buscar el punto de inicio deseado y la secuencia de comandos qt-faststart para reposicionar el átomo de moov al frente de la secuencia, pero parece que esto sería demasiado lento para manejarlo a demanda para millones de Espectadores de YouTube.

Ideas?

¡Gracias de antemano!

Nota al pie: No tengo permitido incluir más de 1 enlace en este momento, así que aquí está la URL del video A: http: // www.youtube .com/watch? V = hWjrMTWXH28 "Video disponible hasta 480p"

+0

Como nota al margen ... Vimeo no utiliza ninguna tecnología similar. Cuando ve un video en Vimeo, todo el MP4 se descarga progresivamente y no puede arrastrar hacia adelante más allá de la parte que ya se almacenó en el búfer. – bgentry

Respuesta

0

No creo que YouTube use FFMPEG para su transmisión. El formato del contenedor, ya sea flv o mp4, es bastante simple y no requiere mucha computación. Es importante solo encontrar el fotograma clave más cercano a la marca de tiempo begin especificada y comenzar desde allí.

3

Se ha hecho una pregunta similar en este foro. http://www.flashforum.de/forum/video/flv-ab-beliebiger-position-streamen-248483.html

Hay dos soluciones disponibles:

  1. utilizar un servidor de streaming
  2. Utilizar un archivo-contenedor escrita en una programación en idioma de su elección (ejemplo está escrito en PHP)

En ambas soluciones necesita modificar todos sus videos fe usando flvmid para agregar las informaciones clave-marco al flv-video.

En la segunda solución, php-script recibe la solicitud que ha publicado anteriormente y analiza el flv-video hasta que alcanza la posición dada por el parámetro begin. Después de eso, comienza a enviar el contenido del video al visitante de la página. Lea el hilo para obtener más información y un php-code-examples.

El hilo original está escrito en alemán, pero se puede utilizar http://translate.google.com a tener una mala Inglés :)

El HTTP-respuesta que has enviado contiene la siguiente línea:

Server:gvs 

Tal gvs significa algo así como "Google Video Server". He buscado gvs pero no he podido encontrar nada de valor.

+0

gvs también podría significar sistemas grand vitesse, creo que alojan sus videos en una red de contenido adaptada para video, y la red de contenido puede consistir en servidores gvs de algún tipo. –

1

Youtube usa el servidor lighttpd para la transmisión. En realidad usa pseudo streaming no streaming. Este mecanismo permite a los espectadores buscar partes de video todavía no descargadas

2

Eche un vistazo al servidor NGINX, tiene módulos para hacer exactamente esto. El autor hizo todo el análisis sintáctico y la reescritura de los contenedores FLV y MP4 para generar el desplazamiento exacto requerido. No es necesario ffmpeg en la parte de transmisión ya que sería excesivo.