2013-05-09 11 views
5

Sto provando a trasmettere in streaming un file video usando cherrypy. Quando vado a localhost: 8080/stream? Video = video.avi inizia a scaricare, ma dopo pochi secondi "scarica" ​​il download, non importa quanto sia grande il file. Sono piuttosto nuovo a questo e non riesco a scoprire perché lo sta facendo. Inoltre, perché non riconosce nemmeno il file se è Matroska (.mkv)?Streaming di file con cherrypy

Qui è la mia classe Stream:

class Stream(object): 
@cherrypy.expose 
def default(self, video=None): 
    BASE_PATH = ".." 
    video = os.path.join(BASE_PATH, video) 
    if video == None: 
     return "no file specified!" 
    if not os.path.exists(video): 
     return "file not found!" 
    f = open(video) 
    size = os.path.getsize(video) 
    mime = mimetypes.guess_type(video)[0] 
    print(mime) 
    cherrypy.response.headers["Content-Type"] = mime 
    cherrypy.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % os.path.basename(video) 
    cherrypy.response.headers["Content-Length"] = size 

    BUF_SIZE = 1024 * 5 

    def stream(): 
     data = f.read(BUF_SIZE) 
     while len(data) > 0: 
      yield data 
      data = f.read(BUF_SIZE) 

    return stream() 
default._cp_config = {'response.stream': True} 

risposta

2

ho capito che tutto quello che dovevo fare era di cambiare aperta (video) per aprire (video, 'rb'), in modo che sarebbe leggere il file in formato binario modalità. Dopo che il file è stato scaricato completamente e ha funzionato.

+0

Fare qualcosa di simile. Anche ottenere una sorta di arresto durante il buffering e anche non si sa come continuare a scaricare l'origine una volta che la dimensione del buffer è stata soddisfatta. – Twisty