À 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é.
InformationsquelleAutor Jubair | 2011-05-07