• seguici su feed rss
  • seguici su twitter
  • seguici su linkedin
  • seguici su facebook
  • cerca

SEI GIA' REGISTRATO? EFFETTUA ADESSO IL LOGIN.



ricordami per 365 giorni

HAI DIMENTICATO LA PASSWORD? CLICCA QUI

NON SEI ANCORA REGISTRATO ? CLICCA QUI E REGISTRATI !

Come realizzare un flusso streaming video in PHP senza disporre di un server streaming

di :: 20 febbraio 2021
Come realizzare un flusso streaming video in PHP senza disporre di un server streaming

Un server straeaming è una macchina dedicata alla erogazione di contenuti video / audio, in modo fluido, senza interruzioni, e senza necessità di scaricare il contenuto per intero sul dispositivo (pc, smartphone,...) per poterlo riprodurre. Un flusso streaming non consente di scarire il file video sorgente, ma solo di vederlo.

Youtube è un esempio di server streaming. Spesso lo utilizziamo come "repository" dei nostri video, che poi inglobiamo nelle pagine web del nostro sito tramite il codice rilasciato da YouTube.

Tuttavia non sempre vogliamo, o possiamo, pubblicare i nostri video su YouTube, ad esempio quando vogliamo che i video risiedano in una area riservata del nostro sito e quindi non siano pubblici su YouTube o in una directory del nostro sito accessibile al pubblico.

Ad esempio, questo è un codice HTML 5 per erogare un video mp4 presente su un nostro ipotetico sito web

 <video width="320" height="240" controls>
  <source src="https://www.miosito.it/movie.mp4" type="video/mp4">
</video> 

La url del file video, "https://www.miosito.it/movie.mp4", è pubblica, e se la copiassi nella barra degli indirizzi del nostro browser potrei scaricarmi il video. E già questo ci fa capire che quello non è un flusso streaming. Ma se volessimo rendere inaccessibile quel file video al dominio pubblico? Dobbiamo trovare una strada alternativa.

Una soluzione è quella disporre in una macchina dedicata ad erogare flussi streaming, ma metterla in piedi costa, sia per il server (ad esempio se lo noleggiamo presso un provider), sia per la banda necessaria per erogare il flusso.

In molti casi il nostro sito è su un comune spazio web condiviso: in questi casi il problema è come possiamo erogare un file mp4 in modalità streaming e quindi non renderlo disponibile per il download diretto.

PHP ci viene in aiuto. Ecco uno script che genera un flusso "pseudo" streaming, lo chiamiamo "video.php" e lo collochiamo nella root del nostro sito.

Al suo interno verrà erogato il video la cui path assoluta è "/var/www/html/video/movie.mp4".

<?php

$file_path="/var/www/html/video/movie.mp4";

$fp = @fopen($file_path, 'rb');
$size   = filesize($file_path); // File size
$length = $size;           // Content length
$start  = 0;               // Start byte
$end    = $size - 1;       // End byte

header('Content-type: video/mp4');
header("Accept-Ranges: bytes");
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);

?>

Nella pagina in cui vogliamo visualizzare il video, inseririamo il seguente codice HMTL 5

<video width="320" height="240" controls>
  <source src="video.php" type="video/mp4">
</video> 

Come vedete, non ho inserito la url del file ma la url dello script php, che a sua volta erogherà il flusso video. Provate....

Abbiamo visto come erogare un simil flusso streaming: non è un reale flusso streaming perchè questo necessita di un software dedicato (e quindi di un server dedicato), ma viene comunque simulato un flusso stream.

Fatto questo, se volessimo rendere disponibile il video solo agli utenti registrati del nostro sito, dobbiamo procedere con due interventi

  1. Protteggiamo con un file ".htaccess" la cartella "video" che contiene il file mp4, in questo modo i video non saranno scaricabili.
    Ecco un esempio di file ".htaccess" da inserire nella cartella "video" (per maggiori info sull'utilizzo dei file .htaccess e .htpasswd vi rimando al altri articoli).
    AuthType Basic
    AuthName "PRIVATE"
    AuthUserFile /var/www/html/video/.htpasswd
    require valid-user​
  2. Facciamo precedere l'erogazione del video, quindi allo script "video.php", un controllo sulla autenticazione dell'utente, che farete come meglio credete (ad esempio con le sessioni).

Lascio a voi questi due sviluppi!

 
pay per script

Hai bisogno di uno script PHP personalizzato, di una particolare configurazione su Linux, di una gestione dei tuoi server Linux, o di una consulenza per il tuo progetto?

 
 
 
x

ATTENZIONE