2009-01-20 6 views
3

J'essaie de créer une application de lecteur vidéo en utilisant Adobe Flex et libh264streaming. Dans un petit boîtier, mon petit joueur fonctionne très bien.Flex VideoDisplay arrête la mise en mémoire tampon

Toutefois, si la vidéo est plus au sujet 200-300MB je vois tas de questions: a) le navigateur se crashy b) il ne cesse jamais mise en mémoire tampon, le téléchargement continue jusqu'à ce qu'il soit CPU vidéo dans son intégralité (300M) c) l'utilisation augmente en fonction de la consommation de la mémoire du navigateur

Je suppose que a) et c) sont causés b) puisque le lecteur a besoin de plus en plus de mémoire pour stocker la vidéo. Donc, je voudrais avoir une limite sur la taille de la mémoire tampon et arrêter le téléchargement de la vidéo dès qu'il atteint le plafond. Je pense que le lecteur vidéo YouTube fonctionne exactement comme ça (en regardant le contrôle du joueur dans le bas du lecteur).

Des idées pour l'implémenter dans Flex?

Merci

Répondre

1

Ce qui est exactement "libh264streaming"? Les recherches sur Google n'atteignent que ce fil avec ce texte exact. D'après votre description, il semble que la vidéo ne soit pas diffusée du tout, mais seulement pour le téléchargement progressif.

Le téléchargement progressif est parfois appelé à tort diffusion. Il s'agit simplement d'un téléchargement HTTP normal d'un fichier et tant que les en-têtes vidéo sont au début du fichier, Flash commence à lire le fichier dès qu'il contient les en-têtes plus un certain nombre de données vidéo (4 images clés I croyez). Le téléchargement progressif n'offre généralement pas de limitation de la bande passante ou d'autres avantages de la diffusion, mais certains ont fourni des implémentations qui se téléchargent lentement, ce qui est plus proche du streaming et peut démarrer le téléchargement progressif au milieu du fichier. milieu sans télécharger le tout.

Flash Player ne prend en charge que RTMP pour le streaming. C'est un protocole propriétaire supporté par Flash Media Server et plusieurs options open source comme Red5, rubyizumi. Il y a seulement deux jours, Adobe a annoncé qu'il publierait et fournirait des licences ouvertes pour RTMP, vous devriez donc voir plus de produits avec le support RTMP dans un proche avenir. Le streaming fournit une communication bidirectionnelle avec le client et le serveur, de sorte que le serveur envoie un nombre demandé de trames en tant que tampon, et le client demande des trames pour remplir le tampon si nécessaire. Le serveur n'envoie pas plus que ce qui est demandé et le serveur peut chercher à divers points avec seulement le tampon ayant besoin d'être rafraîchi, pas la vidéo entière.

Si vous voulez fournir de gros fichiers, vous avez probablement besoin d'un véritable serveur de streaming. Une alternative serait de diviser les fichiers en morceaux, de les télécharger au besoin et de les lire les uns après les autres. Ce serait compliqué aussi, mais faisable.

HTH,

Sam


Nous recrutons! Les développeurs et les AQ de la région de Washington, DC (ou qui cherchent à déménager) doivent envoyer leur curriculum vitae à [email protected]


+0

Désolé, je l'ai tapé totalement faux. Ce que je voulais dire est mod_h264_streaming http://h264.code-shop.com/trac. – user43685

0

Je devine en partie la raison répondit celui-ci de ne encore est parce qu'il n'y a pas de grande réponse pour cela. Je ne suis certainement pas un expert en matière de streaming Flash, mais dans l'intérêt d'afficher au moins quelque chose en réponse pour vous, je devine, en lisant les docs et en essayant moi-même quelques choses, que vous essayez faire ne peut pas vraiment être fait avec un objet VideoDisplay et entièrement dans l'environnement Flex; c'est probablement quelque chose qui doit être manipulé sur le serveur, ou au moins entre le serveur et le client, de sorte que le flux soit correctement livré et terminé, et que l'objet VideoDisplay fonctionne normalement. Désolé, j'aimerais avoir une meilleure réponse pour vous;

0

Il est difficile de dire avec certitude, mais il semble que la lib vous mentionne fournit un mécanisme de contrôle pour dire au serveur quel bloc vous souhaitez jouer (je suis Pour obtenir ceci à partir de la déclaration sur leur page web: ... "Vous avez des clips vidéo vraiment longs et vous ne voulez pas les ré-encoder en parties plus petites? Nous prenons également en charge les 'clips vidéo virtuels', vous pouvez donc spécifier uniquement lire une partie de la vidéo ou créer des liens de téléchargement vers des parties spécifiques de la vidéo. "

Pour moi, il semble que vous ayez juste besoin d'ajouter une structure de contrôle qui vous permette (dites au serveur) d'obtenir la vidéo en morceaux.

Si ce n'est pas po Pour une raison quelconque, vous avez juste accès à un flux de données brut:

J'ai besoin de savoir quelles interfaces vous utilisez dans flex pour charger la vidéo, mais en général, vous devez ajouter un écouteur qui reçoit ProgressEvent et vérifiez les octets chargés (pour un objet chargeur générique)

Votre autre option serait de créer votre propre socket avec des méthodes de lecture et d'écriture, que vous pouvez utiliser pour vérifier vos compteurs d'octets lorsque les données entrent. Vous devez mettre des octets lire dans un bytearray, et puis quand vous avez un morceau utilisable, vous auriez besoin de convertir ce tableau d'octets dans un format approprié pour l'objet joueur ...

Regardez flash.net.Socket

(http://livedocs.adobe.com/flex/2/langref/flash/net/Socket.html)

1

I a été en mesure de créer un composant sur la base de deux objets VideoDisplay qui charge les fichiers mp4 en morceaux (par exemple avec du tampon 1 minute chacune). L'affichage vidéo secondaire commence à charger la vidéo dès que l'affichage principal atteint un certain point (50% de la taille de la mémoire tampon dans mon cas). Le composant bascule vers l'affichage secondaire dès que la vidéo principale est terminée.

Cette approche fonctionne plutôt bien avec mod_h264_streaming. Les opérations de recherche fonctionnent presque instantanément.

Questions connexes