[ STREAMING ] Réaliser son propre système de streaming

streaming-tv

 

 

Salut mes Dyrknautes !!!

 

Envie de vous faire un petit serveur de streaming ?
J'ai une bonne nouvelle pour vous !
Je vais aujourd'hui vous expliquer comment streamer vos fichiers audio, vidéo, ...
Et surtout je vous offrirais en bonus un petit script PHP qui fait le boulot !

 

Alors le streaming comment ça fonctionne ?

 

Première partie
La Rencontre !

 

 

Tout part d'une requête que fait votre ordinateur vers un serveur distant :

 

Toc Toc monsite.com ? Je suis l'ordinateur de Dyrk, et je voudrais voir la vidéo "Toto.mp4"

Request URL:  http://monsite.com/Toto.mp4
Request Method: GET
Remote Address:Ordinateur de Dyrk

 

Ce à quoi le serveur vous répondra :

 

Salut ordinateur de Dyrk !
La vidéo "Toto.mp4" est bien là. C'est un fichier MP4 qui fait 52464391 octets !

Status Code:  200 OK <= Tout va pour le mieux
Content-Length: 52464391 <= Je pèse 52464391 octets
Content-Range: bytes 0-52464390/52464391 <= Je t'envois 0 octet  pour l'instant !
Content-Type: video/mp4 <= Je suis un MP4

 

Deuxième partie
L'Échange

 

 

Une fois les présentations faites, votre ordinateur sait que le fichier existe, et en connaît la taille.
Votre ordinateur va à présent, demander progressivement des petits bouts au serveur, qu'il chargera au fur et à mesure.

Salut  monsite.com, maintenant qu'on se connaît, j'aimerais la suite du fichier à partir du  48ème octets !
Range:bytes=48-  <= Envois moi le reste !

 

Ce à quoi répondra favorablement notre serveur !

 

Hey ordinateur de Dyrk, pas de soucis, j'ai ce qu'il te faut !
Le fichier faisant 52464391 octets, si tu me demandes de t'épargner les 48 premiers octets, je t'envoie  les 52464343 octets suivants !

Status Code: 206 Partial Content <= On commence à échanger.
Content-Length:52464343    <= Je te file mes 52464343 octets restants
Content-Range:bytes 48-52464390/52464391 <= Je t'envois les octets que j'ai entre le 48ème et le 52464390ème.

 

Ou pas :

 

Salut ordinateur de Dyrk, je ne suis malheureusement pas en capacité de fournir ce que tu me demande ...

HTTP/1.1 416 Requested Range Not Satisfiable

 

 

Le Script !

 

 

Voilà,  vous comprenez à présent plus ou moins comment ça fonctionne  ^^

 

 

Tout cela se gère de manière automatique ... sans votre bénédiction, vu que l'ordinateur appelle directement le fichier vidéo.

 

 

Aussi, je vais vous présenter un script qui vous permettra de faire la passerelle entre votre internaute, et votre fichier vidéo ...
Ce que j'entends par "Streaming Contrôlé", c'est le fait de pouvoir ralentir les requêtes ....
Et donc de pouvoir éviter à votre serveur d'être saturé ^^

 

 

$file   = 'YourFile.mp4';
$timer  = 0.01;
$fp     = @fopen($file,'rb');
$size   = filesize($file);
$length = $size;
$start  = 0;
$end    = $size-1;
$buff   = 1024 * 8;
header('Content-type: video/mp4');
header("Accept-Ranges: bytes");

function stream_error($start,$end,$size){
        header('HTTP/1.1 416 Requested Range Not Satisfiable');
        header("Content-Range: bytes $start-$end/$size");
        exit;
}

if (isset($_SERVER['HTTP_RANGE'])) {
    $c_start = $start;
    $c_end   = $end;
    list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
    if (strpos($range, ',') !== false) stream_error($start,$end,$size);
    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) stream_error($start,$end,$size);
    $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);
while(!feof($fp) && ($p = ftell($fp))<=$end) { if ($p+$buff>$end) $buff = $end-$p+1;
    usleep( $timer * 1000000);
    echo fread($fp, $buff);
    flush();
}

fclose($fp);
exit();

 

 

Les 2 seules variables dont vous aurez à vous préoccuper, sont :

file     : Qui est le nom du fichier que nous souhaitons streamer.
timer :  Qui est le bridage ... le nombre de secondes à espacer entre chaque requête.

 

Voili voilà, à vos popcorns et bon streaming !

Partagez ce contenu

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *