2017-08-22 5 views
0

J'utilise Pyramid avec ZODB comme base de données. Je veux retourner la réponse vidéo et je suis capable de mais le seul problème est le navigateur télécharge la vidéo entière, puis la joue et je ne veux pas que cela se produise. Je voulais diffuser de la vidéo, mais je suis incapable de trouver une solution appropriée. Voici mon codeComment servir Réponse vidéo sans télécharger l'intégralité de la vidéo sur le navigateur

Fonction qui retourne une réponse vidéo est:

@view_config(context=Content, name='getcontentplay') 
def getContentImage(context,request): 
    blob = context.blobdata 
    resp = Response(content_disposition="inline; filename=\""+blob.filename.encode('utf-8')+"\"",content_type=blob.contentType,) 
    resp.app_iter = blob.data 
    resp.content_length = blob.size 
    return resp 

Et Blob Storage Class est:

from ZODB.blob import Blob 
from persistent import Persistent 

class BlobWrapper(Persistent): 
    def __init__(self, filedata,contentType,filename): 
     self.contentType = contentType 
     self._blob = Blob(filedata) 
     self.filename = filename 

    def _getData(self): 
     fp = self._blob.open('r') 
     data = fp.read() 
     fp.close() 
     return data 

    def retFile(self): 
     return self._blob.open('r') 

    data = property(_getData) 

    @property 
    def size(self): 
     if 'size' in self.__dict__: 
      return self.__dict__['size'] 
     reader = self._blob.open() 
     reader.seek(0,2) 
     size = int(reader.tell()) 
     reader.seek(0) 
     reader.close() 
     self.__dict__['size'] = size 
     return size 

    def getSize(self): 
     return self.size 

Et mon code HTML de modèle est

<video poster="/static/images/kid.png" controls controlsList="nodownload" preload="none"> 
 
    <source src="${urltovideo}" /> 
 
</video>

+0

J'ai eu des problèmes avec les encodages qui enregistrent l'information "c'est comment charger cette vidéo" à la fin du fichier au lieu du début. S'agit-il de toutes les vidéos personnalisées dans un format unique? Si tel est le cas, essayez de télécharger une vidéo de travail générique depuis un autre site et essayez-la. Je poste seulement un commentaire parce que je suis brumeux sur les détails et je pense que plus d'information est nécessaire. La chose blob pourrait être un problème mais cela pourrait aussi n'avoir rien à voir avec le problème réel, espérons que cela a du sens. Alors ... Comment les vidéos sont-elles encodées? Avez-vous essayé des vidéos d'autres sources? –

+0

Aussi, juste pour vous le faire savoir, j'utilise pyramid pour passer des demandes de films à Nginix avec un en-tête 'X-Accel-Redirect', principalement dans un format mp4. J'intègre un jwplayer (propriétaire mais qui fonctionne pour moi) qui gère l'affichage croisé des vidéos. –

+0

@plantian J'ai du mal à vous comprendre le code fonctionne très bien le seul problème est que le navigateur charge d'abord la vidéo entière et la joue ensuite. Supposons que si je télécharge une vidéo de 20 Mo, je devrais attendre que le navigateur charge 20 Mo avant que je puisse voir la lecture de la vidéo. Et aussi je viens d'éditer la question pour mieux la comprendre. Merci –

Répondre

0

Vous demandez comment obtenir une réponse chunked/streaming et les détails de ceci dépendent entièrement de votre serveur wsgi et de tous les autres serveurs/proxies entre le serveur wsgi et le navigateur du client. Par exemple, nginx va, par défaut, mettre en tampon toute la réponse de son amont avant d'envoyer la réponse au client. En outre, de nombreux serveurs WSGI feront de même à un certain degré et vous devrez regarder leurs paramètres pour savoir comment régler cette mise en mémoire tampon.

+0

avez-vous des liens auxquels je peux me référer? –