2013-05-09 12 views
5

Próbuję przesłać strumieniowo plik wideo za pomocą cherrypy. Kiedy idę do localhost: 8080/stream? Video = video.avi zaczyna się pobieranie, ale po kilku sekundach po prostu "uzupełnia" pobieranie bez względu na rozmiar pliku. Jestem raczej nowy w tym i nie mogę się dowiedzieć, dlaczego to robi. Dlaczego nawet nie rozpoznaje pliku, jeśli jest to Matroska (.mkv)?Pliki strumieniowe z cherrypy

Oto moja klasa 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} 

Odpowiedz

2

zdałem sobie sprawę, że wszystko, co potrzebne do zrobienia było zmienić otwarty (wideo), aby otworzyć (wideo, „rb”), tak by odczytać plik binarny tryb. Potem plik został pobrany całkowicie i działał.

+0

Robi się coś podobnego. Również przy zatrzymywaniu się podczas buforowania, a także nie wiem, jak kontynuować pobieranie źródła po osiągnięciu rozmiaru bufora. – Twisty