À l'aide de php à la sortie d'une vidéo mp4
Ok, fondamentalement, j'ai un projet qui nécessite que les vidéos sont cachés par les utilisateurs tout en restant capables de les voir (à l'aide de php). voici ce que j'ai obtenu jusqu'à présent:
L'video.php fichier présent:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'path/to/movie.mp4');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$out = curl_exec($ch);
curl_close($ch);
header('Content-type: video/mp4');
header('Content-type: video/mpeg');
header('Content-disposition: inline');
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($out));
echo $out;
exit();
?>
et le fichier html qui est censé afficher c'est à l'aide de html5 comme on pourrait s'y attendre. maintenant, voici la chose.. quand j'ai directement intégrer cette (non ), il fonctionne. mais il ne fonctionne pas sur mon iPhone et ne fonctionne pas dans la balise... si j'utilise directement le fichier au lieu de le wrapper php, tout fonctionne bien, sur mon iPhone aussi...
donc je suppose que ma question est: quelles sont les header() de l'information de parfaitement reproduire un mp4 qui peuvent être diffusés via l'iPhone et de l'HTML5?
Solution dérivée de: http://mobiforge.com/developing/story/content-delivery-mobile-devices
video.php fichier:
<?php
$file = 'path/to/videofile.mp4';
$fp = @fopen($file, 'rb');
$size = filesize($file); //File size
$length = $size; //Content length
$start = 0; //Start byte
$end = $size - 1; //End byte
header('Content-type: video/mp4');
header("Accept-Ranges: 0-$length");
if (isset($_SERVER['HTTP_RANGE'])) {
$c_start = $start;
$c_end = $end;
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
if (strpos($range, ',') !== false) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
exit;
}
if ($range == '-') {
$c_start = $size - substr($range, 1);
}else{
$range = explode('-', $range);
$c_start = $range[0];
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
}
$c_end = ($c_end > $end) ? $end : $c_end;
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
exit;
}
$start = $c_start;
$end = $c_end;
$length = $end - $start + 1;
fseek($fp, $start);
header('HTTP/1.1 206 Partial Content');
}
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: ".$length);
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end) {
if ($p + $buffer > $end) {
$buffer = $end - $p + 1;
}
set_time_limit(0);
echo fread($fp, $buffer);
flush();
}
fclose($fp);
exit();
?>
- Duplicata de cette question.
- C'est très étrange de voir comment vous êtes l'envoi de deux
Content-type
les en-têtes avec des valeurs différentes. - Kelly, j'ai vu cette question et il n'aide pas vraiment, et il ne ressemble pas à le même problème (avec le mien, il n'a même pas de jouer quand embeding dans <video> html5.. Icktoofay, oui ça ne change pas le résultat..
- edit: il y avait un bug avec le script d'origine de sorte que le ci-dessus est une version modifiée de fixation.
- J'ai eu des problèmes avec
header("Accept-Ranges: 0-$length");
. Firefox n'a pas la longueur du film de webm-films. La modification de ce àheader("Accept-Ranges: bytes");
ensuite travaillé.
Vous devez vous connecter pour publier un commentaire.
Iphones utiliser quelque chose appelé octet-plages audio et vidéo à la demande. Voir ce lien pour trouver une solution. C'est dans l'Annexe A.
http://mobiforge.com/developing/story/content-delivery-mobile-devices
Voici un code ciselée qui permettra de faire ce que vous voulez (à partir de cette question). Le PHP est la solution qui semble la plus élégante, et il ajoute une solution plus efficace, qui pourrait travailler qui utilise le serveur web pour fournir le contenu.
Plus De Performance
Noter que ce n'est pas le moyen le plus efficace de le faire, parce que l'ensemble du dossier doit passer par PHP, de sorte que vous aurez juste besoin d'essayer de comment ça se passe pour vous.
En supposant que la raison pour laquelle vous voulez faire, c'est de restreindre l'accès, et vous avez besoin de plus d'efficacité, plus tard, vous pouvez utiliser un drapeau pour le serveur web.
Apache avec X-Sendfile module ou lightty (nginx info ici)
C'est un peu plus avancé et que vous devez utiliser uniquement si vous en avez besoin, mais il est de détente et de savoir que vous avez une option de mise à niveau lorsque vous commencez avec quelque chose qui est assez facile, mais a performance médiocre.
Ce code était très pratique pour moi, mais j'ai éprouvé de la difficulté parce que je suis en utilisant la session de vars, et PHP files d'attente de l'accès aux sessions. Si une vidéo a été chargement, toutes les requêtes AJAX était impossible, etc. Donc, assurez-vous d'appeler
session_write_close()
avant de commencer la production.Oui, c'est facile à faire. Pas besoin de régler ces en-têtes manuellement. Laisser le serveur le faire automatiquement.
Heres un travail de script -