2010-07-21 4 views
12

Dernièrement, j'ai recherché différentes méthodes pour diffuser des MP4 dans le navigateur. Flash Media Server est un choix évident ici (en utilisant Cloudfront), et la plupart des solutions que j'ai vues utilisent le protocole RTMP.La technologie de streaming vidéo HD de YouTube?

Cependant, j'ai passé du temps sur YouTube avec Firebug et Chrome débogueur à comprendre comment leur streaming fonctionnait et j'ai découvert des différences intéressantes entre certaines de leurs vidéos et les tarifs de qualité.

Mes deux exemples de vidéos sont A et B. A est disponible jusqu'à 480p et B est disponible jusqu'à 1080p. Pour les deux vidéos, tous les débits jusqu'à 480p sont servis dans un conteneur FLV avec vidéo H.264 et audio AAC, via HTTP. Ce qui est intéressant ici est que si vous n'avez pas encore téléchargé (mis en cache) la vidéo entière, et que vous essayez de passer à une partie non-attachée de la vidéo, une nouvelle requête sera faite avec un paramètre 'begin' égal au décalage cible millisecondes. Exemple de vidéo A à 480p:

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 

Le fichier retourné par cette URL est un FLV entièrement valide contenant uniquement la partie de la vidéo après le décalage ont sollicité. J'ai fait le même genre de test sur les versions haute résolution de la vidéo B. À 720p et 1080p, YouTube renvoie une vidéo dans un conteneur MP4, également avec la vidéo H.264 et l'audio AAC. Ce qui m'impressionne, c'est que leur serveur prend le même type de décalage pour une vidéo MP4 (via le paramètre 'begin') et renvoie un MP4 streamable valide (atome moov à l'avant du fichier avec des corrections correctes) la partie demandée de la vidéo.

Alors, comment YouTube fait-il cela? Comment génèrent-ils le conteneur FLV ou MP4 à la volée avec les en-têtes appropriés et seulement le segment souhaité de la vidéo demandée? Je sais que cela peut être accompli en utilisant FFMPEG pour chercher le point de départ désiré et le script qt-faststart pour repositionner l'atome moov au début du flux, mais il semble que ce serait trop lent pour gérer à la demande des millions de Visionneuses YouTube.

Des idées?

Merci d'avance! Footnote: Je ne suis pas autorisé à inclure plus d'un lien à ce stade, donc voici l'URL de Video A: http://www.youtube.com/watch?v=hWjrMTWXH28 "Vidéo disponible jusqu'à 480p"

+0

En note .. Vimeo n'utilise aucune technologie similaire. Lorsque vous regardez une vidéo sur Vimeo, l'ensemble du MP4 est progressivement téléchargé et vous ne pouvez pas passer devant la partie qui a déjà été mise en mémoire tampon. – bgentry

Répondre

0

Je ne pense pas que YouTube utilise FFMPEG pour son streaming. Le format du conteneur, flv ou mp4, est assez simple et ne nécessite pas beaucoup de calculs. Il est important de rechercher l'image clé la plus proche de l'horodatage begin spécifié et de commencer à partir de celle-ci.

3

Une question simulaire a été posée à ce forum. http://www.flashforum.de/forum/video/flv-ab-beliebiger-position-streamen-248483.html

Il y a deux solutions avaiable:

  1. Utiliser un serveur de streaming
  2. Utilisez un fichier wrapper écrit dans un langage de programmation de votre choix (par exemple est écrit en php)

Dans les deux solutions, vous devez modifier toutes vos vidéos. utiliser flvmid pour ajouter les informations d'image-clé à la vidéo-flv.Dans la deuxième solution vous php-script recive la requête que vous avez posté ci-dessus et analyse le flv-video jusqu'à atteindre la position donnée par le paramètre begin. Après cela, il commence à pousser le contenu vidéo vers le visiteur de la page. Lire le fil pour obtenir plus d'informations et un php-code-exemples.

Le fil original est écrit en allemand, mais vous pouvez utiliser http://translate.google.com pour obtenir un mauvais anglais :)

Le HTTP que vous avez posté-réponse contient la ligne suivante:

Server:gvs 

Peut-être gvs signifie quelque chose comme "Google Video Server". J'ai cherché gvs mais je n'ai pas pu trouver quelque chose de valeur.

+0

gvs pourrait aussi signifier, les systèmes à grande vitesse, je pense qu'ils hébergent leurs vidéos sur un réseau de contenu adapté pour la vidéo, et le réseau de contenu pourrait se composer de serveurs gvs de quelque sorte. –

1

Youtube utilise le serveur lighttpd pour le streaming. Il utilise en réalité le pseudo-streaming non-streaming. Ce mécanisme permet aux téléspectateurs de rechercher des parties d'une vidéo qui n'ont pas encore été téléchargées.

2

Jetez un coup d'œil au serveur NGINX, il a exactement les mêmes modules. L'auteur a fait tout l'analyse et la réécriture des conteneurs FLV et MP4 pour produire le décalage requis exact. Pas besoin de ffmpeg à la partie streaming car ce serait trop.