PHP Streaming-MP3
Ich habe eine sehr ähnliche situation zu der person, die fragte:
Kann ich dienen MP3-Dateien mit PHP?
Grundsätzlich bin ich versucht zu schützen, mp3-files direkt herunterladen, so dass die Nutzer müssen gehen durch php zu bekommen, authentifiziert ersten.
Hier ist mein code:
header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($file));
header('X-Pad: avoid browser bug');
Header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: binary");
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
readfile($file);
Hier ist mein problem: Die Datei spielt nur ein sehr kleines Stück des anfangs (via Quicktime im browser) und Stoppt dann - Quicktime scheint zu denken, dass die Länge der Datei ist nur so lange, wie das Stück es geschafft, download. Wenn ich neu laden - es spielt eine etwas größere Brocken - was auch immer es gelang den download bis zu diesem Punkt.
Ist, dass ein problem in den Kopf-ich bin senden? Wie würde ich das streamen ist so eine Datei?
Ist es ein problem, wenn eine swf-Datei liest aus der Datei?
Dank!
Danke Jungs für die ganzen Antworten. Obwohl keines dieser Dinge waren genau das, was gelöst ist das problem, viele von Ihnen schickte mich in die richtige Richtung. Sehr geschätzt wird.
Für die vollständige Lösung siehe unten meine Antwort
- Ich nehme an, Sie haben nicht diese Tippfehler ("Header") in deinem code? Auch, Sie brauchen nicht die X-Pad-hack. Dies ist nur erforderlich für die alten Netscape (siehe george.hotelling.net/90percent/geekery/...). Sie brauchen nicht Content-Transfer-Encoding, und Sie sollten nur angeben, Content-Type once (audio/mpeg ist in Ordnung).
- Flaschen: PHP-Funktionen sind case-insensitiv, so ist es nur ein Konsistenz-Problem. Der Content-Type kann sein, das eigentliche Problem hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was hat den trick.
if(file_exists($file)){
... Ist es das was du meintest?header('Accept-Ranges: bytes');
Wenn Sie den Content-Transfer-Encoding besser zu nutzen versuchenheader("Content-Transfer-Encoding: chunked");
Können Sie versuchen,HTTP-Segmentierung. Stellen Sie den "Transfer-Encoding" - header auf "chunked", geben dann die Größe wird jedes Stück vor dem Versand. Am Ende jedes chunk-Größe und chunk mit einem CRLF.
Für etwas komplexer, ich empfehle ein streaming-server, wie Icecast.
Zwei Dinge zeichnen Sie aus:
Content-Length
gesetzt. Wenn Sie den server eingestellt ist, um automatisch die gzip-Ausgabe, dies kann zu Chaos mit Dingen. Deaktivieren SieContent-Length
und sehen, wenn dieses es regelt.Content-Type
s eingestellt. Seit es Mp3, die Sie servieren, verwenden Sie einfachaudio/mpeg
. Können Sie effektiv loszuwerden, die ganze Letzteheader()
Befehl. Es ist einfach zu weit mit den HTTP-Headern.Probieren Sie es aus und lassen Sie uns wissen, wie es geht!
wenn Ihr server läuft auf apache oder lighty, ich würde vorschlagen, Sie schauen in x-sendfile
http://tn123.ath.cx/mod_xsendfile/
dieses können Sie Griff-Authentifizierung in Ihrer php-Anwendung, aber lassen Sie Ihren webserver Griff die übertragung der Datei. die Leistung Verbesserung gewinnen Sie einen schönen zusätzlichen Vorteil
Entfernen
header("Content-Transfer-Encoding: binary");
Und Sie werden eingestellt!Für diese Lösung müssen Sie auch konfigurieren xsendfile in apache (mod_xsendfile) oder nginx HttpSecureLinkModule - Sie geben Ihnen genaue mp3 -, browser-spielen wird es richtig
Anwendung alle diese Lösungen, die gültig sind, zu verbergen, dem ursprünglichen Pfad und mit dem Namen, leider nicht verhindern von unerlaubten download.
Ja der client (in meinem Fall Chrome) downloads die Datei.
Hier die Linien habe ich auf meinem server:
mit oder ohne die Linie
das endgültige Ergebnis ändert sich nicht
Das Verzeichnis /mp3 befindet sich in
(also /home/myuser/mp3)
und die public-HTML-Verzeichnis ist
daher aufrufen meiner domain und geben
lädt es eine Datei namens music.mp3 mit allen original-content.