Python - Django: Streaming-video - /mp4-Datei mit HttpResponse
Bin ich mit Python2.7, django==1.7
und uwsgi
für das streaming von video - /mp4-Datei zu iPhone
Spieler.
Mein code ist wie folgt:
def stream(request):
with open('/path/video.mp4', 'r') as video_file:
response = HttpResponse(video_file.read(), content_type='video/mp4')
response['Content-Disposition'] = 'inline; filename=%s' % 'video.mp4'
return response
video_file.close
Wenn ich einige kleine Videos (weniger als 1MB), es-streams im browser, aber im iPhone palyer habe ich diese Fehlermeldung:
[uwsgi-http key: 127.0.0.1:8008 client_addr: 192.168.0.172
client_port: 14563] hr_write(): Broken pipe [plugins/http/http.c-Linie
564]
Und wenn die Größe des Videos ist mehr als 5 MB, ist es nicht Strom in beiden (also browser-und iPhone-Spieler) mit dem gleichen Fehler.
Habe ich versucht, das zu tun, chunk chunk Rückkehr mit StreamHttpRespose wie folgt:
def read(chunksize=8192):
with open('/path/video.mp4', 'rb') as video_file:
byte = video_file.read(chunksize)
while byte:
yield byte
return StreamingHttpResponse(read(), content_type='video/mp4')
Aber es ist der gleiche Fehler: Broken pipe
.
fyi ich streamen können pdf-und Bild-Dateien. Dieses problem ist nur mit mp4-Dateien. Und auch ich habe die content_type zu "video-mpeg', den browser heruntergeladen, dass, während ich verhindern wollen-Datei herunterladen.
Was ist deine Idee? Jede Lösung!!!!?
- Um zu streamen brauchst du einen anderen thread zum schreiben der Daten auf die Antwort. Denn die Art und Weise Sie es tun wird einfach warten, bis Sie gelesen haben, die ganze Datei und senden Sie Sie zusammen.
- Vielen Dank für Ihren Kommentar, Aber in der zweiten Lösung (StreamHttpResponse) bin ich beim Lesen der video Datei als byte und senden Sie es in jedem chunk durch yield-Befehl. es heißt, es spielt keine Notwendigkeit zu warten, für immer die ganze Datei.
- Ja. Du hast Recht
- Hallo Aida, ich würde gerne wissen, wenn Sie noch keine Lösung gefunden zu diesem Thema. Ich habe das gleiche Problem 🙂 vielen Dank
- Ich erklärte Ihr, was ich Tat, für, die. Aber es ist nicht die Lösung, nur funktioniert es einwandfrei. Wenn Sie finden keine Lösung, bitte beantworten Sie meine Frage, und verdienen Sie Ihre Punktzahl 😉
- Danke @Aida.Mirabadi !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem und hat eine Menge der Graben vor der Suche nach einer praktikablen Lösung!
Offenbar die
Accept Ranges
- header ist erforderlich für HTML5-video-Steuerelemente funktionieren (https://stackoverflow.com/a/24977085/4264463). Also, wir müssen beide analysieren die angeforderte Palette ausHTTP_RANGE
und zurückContent-Range
mit der Antwort. Der generator übergeben wirdStreamingHttpResponse
auch zurückgeben muss, die Inhalt basierend auf dieser Auswahl auch (durchoffset
undlength
). Ich habe festgestellt, das follow-snippet, das funktioniert Super (von http://codegist.net/snippet/python/range_streamingpy_dcwatson_python):stream_video
. Also benutzte ichstream_video
wie ein Blick in meineurls.py
Datei und dann hatte Sie html wie:<video width="320" height="240" controls><source src="the/full/url/to/video.mp4" type="video/mp4"></video>
or
dievideo
html-Tags, aber nicht beide.<video>
.Nach viel suchen, ich finde nicht meine Lösung.
So, ich habe versucht, erstellen Sie einen stream-server einfach mit
nodejs
aus html5-video-streamer.js Referenz als unten:Nun habe ich separate stream-server mit
nodejs
dass streamsmp4
Dateien neben-python-Projekt, das bietet meine APIs.Ich bin mir bewusst, Es ist nicht meine Lösung, aber es funktioniert für mich 😉