Solución:
Debe implementar la funcionalidad de omisión usted mismo en PHP. Este es un fragmento de código que hará eso.
<?php
$path="file.mp4";
$size=filesize($path);
[email protected]($path,'rb');
if(!$fm) {
// You can also redirect here
header ("HTTP/1.0 404 Not Found");
die();
}
$begin=0;
$end=$size;
if(isset($_SERVER['HTTP_RANGE'])) {
if(preg_match('/bytes=h*(d+)-(d*)[D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) {
$begin=intval($matches[0]);
if(!empty($matches[1])) {
$end=intval($matches[1]);
}
}
}
if($begin>0||$end<$size)
header('HTTP/1.0 206 Partial Content');
else
header('HTTP/1.0 200 OK');
header("Content-Type: video/mp4");
header('Accept-Ranges: bytes');
header('Content-Length:'.($end-$begin));
header("Content-Disposition: inline;");
header("Content-Range: bytes $begin-$end/$size");
header("Content-Transfer-Encoding: binaryn");
header('Connection: close');
$cur=$begin;
fseek($fm,$begin,0);
while(!feof($fm)&&$cur<$end&&(connection_status()==0))
{ print fread($fm,min(1024*16,$end-$cur));
$cur+=1024*16;
usleep(1000);
}
die();
Más rendimiento
Tenga en cuenta que esta no es la forma más eficiente de hacerlo, porque todo el archivo debe pasar por PHP, por lo que solo tendrá que probar cómo funciona para usted.
Suponiendo que la razón por la que desea hacer esto es restringir el acceso, y necesita más eficiencia más adelante, puede usar una marca para el servidor web.
Apache con módulo X-Sendfile o lightty (información de nginx aquí)
$path="file.mp4";
header("X-Sendfile: $path");
die();
Esto es un poco más avanzado y solo debe usarlo si lo necesita, pero es relajante saber que tiene una opción de actualización cuando comienza con algo que es bastante fácil pero tiene un rendimiento mediocre.
Encontré una forma mucho más barata de PHP al experimentar con la solución aceptada. Aunque no lo he probado con X-Sendfile, sospecho que el rendimiento es aún mejor en general para su sitio, ya que significa un archivo Apache más corto.
Solo necesita el siguiente código para publicar videos .mp4 buscables desde PHP (no se han probado con .webm u otros tipos):
$file="path/file.mp4";
header('Content-Type: video/mp4'); #Optional if you'll only load it from other pages
header('Accept-Ranges: bytes');
header('Content-Length:'.filesize($file));
readfile($file);
Mucho más limpio y rápido; El código de respuesta aceptado dio como resultado que el video tardara mucho en cargarse por alguna razón, la carga del video con este código fue instantánea (ambas pruebas se realizaron en un servidor local con un archivo de video de 7.25 MB).
Probado con los reproductores de video predeterminados de Chrome, Firefox y Edge.
Editar: probado sin header('Content-Type: video/mp4');
, ¡aún funciona si el archivo se carga desde otra página! Si accede directamente a la URL, no habrá reproductor de video; el código simplemente se imprimirá.