Wir haben Probleme beim Versenden von mp4s, die auf einem iPad mit einer Standard-App "rails 3" wiedergegeben werden. Der mp4 wird korrekt wiedergegeben, wenn die Route in Chrome und anderen Browsern auf einem Desktop angezeigt wird.Was ist der richtige Weg, um mp4-Dateien über Schienen zu einem Ipad zu dienen?
Hier ist unser Code:
file_path = File.join(Rails.root, 'test.mp4')
send_file(file_path, :disposition => "inline", :type => "video/mp4")
Wir 0.0.0.0:3000/video/test.mp4 schlagen das Video anzusehen und präsentiert mit nicht-Symbol auf dem ipad spielen. Wir haben versucht, verschiedene Header "Content-Length", "Content-Range" usw. zu ändern, aber sie scheinen das Endergebnis nicht zu beeinflussen.
Wir haben versucht, auch send_data zu einem gewissen Grad
heißt
File.open(file_path, "r") do |f|
send_data f.read, :type => "video/mp4"
end
Das gleiche Video serviert feine aus dem öffentlichen Ordner verwenden, wenn auf dem iPad gesehen.
Was ist der richtige Weg, um mp4-Dateien über Schienen zu einem Ipad zu dienen?
Ich denke, es gibt einen Zaunpfosten Fehler im Code. Ich glaube, die Länge sollte "bytes.end - bytes.begin + 1" sein - wenn der Bytebereich von Byte 10 bis 12 ist, sollte dies 3 Byte sein. Wenn Sie 'send_data' aus irgendeinem Grund verwenden, stellen Sie sicher, dass' Content-Length' in den Antwortheadern steht. – tovodeverett
Vielen Dank für diese Lösung! Ich habe Korrekturen basierend auf @tovodeverett Kommentar hinzugefügt. Mit Sinatra (anstelle von Rails) für die Entwicklung konnte ich das send_data-Verhalten mit sinatra/streaming contrib wie folgt replizieren: 'stream {| out | out.write IO.binread (Dateipfad, Länge, Offset); out.flush} ' –
Danke für die Lösung! Uns ist aufgefallen, dass der Reaktionsstatus explizit auf '206' gesetzt werden muss, damit dieser Ansatz in Chrome funktioniert. –