ugrás a tartalomhoz

Video Stream tekerés inaktiválása

alkony4 · 2017. Ápr. 23. (V), 21.03
Szervusztok!

PHP-s megoldással szeretnék streamelni videót, amivel nincs is gond, nagyszerű kis kód van rá, viszont szeretném elérni, hogy ne lehessen tekergetni.
Ha egy html video tagbe teszem, ez ugyan nem gond, könnyen kiiktatható, de ha egy lejátszóval nyitom meg ott már más a helyzet ugyebár mivel nincs kontrolom a kliens program felett, így a kódon szeretnék csiszolni. Miként írnátok át ezt, hogy az igényeket kielégítse?

// Open
if (!($stream = fopen($path, 'rb')))
	{
	die('Could not open stream for reading');
	}
	
	
	
	
// setHeader()
ob_get_clean();
header("Content-Type: video/mp4");
header("Cache-Control: max-age=2592000, public");
header("Expires: ".gmdate('D, d M Y H:i:s', time()+2592000) . ' GMT');
header("Last-Modified: ".gmdate('D, d M Y H:i:s', @filemtime($path)) . ' GMT' );
$start = 0;
$size  = filesize($path);
$end   = $size - 1;
header("Accept-Ranges: 0-".$end);


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] : $c_end;
		}
	$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($stream, $start);
	header('HTTP/1.1 206 Partial Content');
	header("Content-Length: ".$length);
	header("Content-Range: bytes $start-$end/".$size);
	}
else
	{
	header("Content-Length: ".$size);
	}
	
	
	
	
// Stream()
$i = $start;
set_time_limit(0);
while(!feof($stream) && $i <= $end)
	{
	$bytesToRead = $buffer;
	if(($i+$bytesToRead) > $end)
		{
		$bytesToRead = $end - $i + 1;
		}
	$data = fread($stream, $bytesToRead);
	echo $data;
	flush();
	$i += $bytesToRead;
	}
	
	
	
// End()
fclose($stream);
exit;
Megtisztelő válaszaitokat előre is köszönöm!
 
1

Ezzel kapcsolatban még

alkony4 · 2017. Ápr. 24. (H), 08.58
Ezzel kapcsolatban még hozzájön az, hogy ha bármi úton módon kiiktatható a seeking, akkor a php-n belül hogy érhető el, hogy a video egy megadott időpontól kezdjen el betöltődni.

Tippek, megoldások?

Köszönöm a segítségetek előre is.
2

Ne tedd

janoszen · 2017. Ápr. 24. (H), 13.01
A PHP hihetetlenul nem hatekony nagy meretu binaris fajlok kiszolgalasara. Nem tudom, hany user fogja ezt hasznalni, de ha 2-nel tobb, akkor ezt oldd meg szerver szinten.
3

Ezzel most nem vagyok

alkony4 · 2017. Ápr. 24. (H), 14.35
Ezzel most nem vagyok beljebb, de azért kösz a választ.
4

Beljebb vagy

janoszen · 2017. Ápr. 24. (H), 15.07
A problema ott van, hogy szerver oldalon egyedul nem tudod letiltani a seekelest. Abban az adatban ami mar a usernel van tud seekelni, ha akarod ha nem. A range requestek letiltasa meg nem hatekony, mert ha megszakad a letoltes nem tudja folytatni. nginxben vannak mindenfele modulok amikkel tudsz jatszani, PHP-bol sztem ezt nem tudod megoldani.