Moin,
der Hinweis auf die File.php ist richtig - ein wesentliches Problem für das Streaming ist, dass die oben genannte Funktion kein Byte-Serving kann (HTTP-Range-Requests).
Was die File.php offenbar kann ist, die Benutzerberechtigung überprüfen. Ich habe sie daher als Ausgangspunkt für eine geschützte Streaming-Möglichkeit verwendet:
PHP-Code:
/**
* Send the file to the browser
*
* @param string $filename An optional filename
*/
public function sendToBrowser($filename=null)
{
// Make sure no output buffer is active
// @see http://ch2.php.net/manual/en/function.fpassthru.php#74080
while (@ob_end_clean());
// Prevent session locking (see #2804)
session_write_close();
// Disable zlib.output_compression (see #6717)
ini_set('zlib.output_compression', 'Off');
// START ADDED BY HN
if(strpos($this->mime,"mp4")!==FALSE && isset($_GET["stream"])){
$this->sendVideoStream();
return;
}
//END ADDED BY HN
// Open the "save as …" dialogue
header('Content-Type: ' . $this->mime);
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . ($filename ?: $this->basename) . '"');
header('Content-Length: ' . $this->filesize);
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');
header('Connection: close');
// Output the file
$resFile = fopen(TL_ROOT . '/' . $this->strFile, 'rb');
fpassthru($resFile);
fclose($resFile);
// Stop the script
exit;
}
//START ADDED BY HN
protected function sendVideoStream(){
$path = TL_ROOT . '/' . $this->strFile;
$videostream = new VideoStream($path);
$videostream->start();
exit();
}
//END ADDED BY HN
Die Methode sendVideoStream verwendet die Klasse VideoStream. Die Klasse kann man am einfachsten direkt unten in die File.php mit rein kopieren (Wobei es vermutlich "sauberer" wäre, die Klasse ordentlich im Autoload abzulegen).
Das Streaming kann dann über die Download-URL genutzt werden, wenn der GET-Parameter "stream" mit angehängt wird, also etwa so:
Code:
index.php/geschuetzteseite.html?file=files/geschuetzte-videos/video.mp4&stream
Die genauen Bedingungen, wann eine Datei zum Stream und wann zum DL angeboten wird, können in der Zeile
PHP-Code:
if(strpos($this->mime,"mp4")!==FALSE && isset($_GET["stream"])){
festgelegt werden. Hier wird geprüft, ob der Parameter "stream" existiert und die Datei ein mp4-Mime hat.
Mit dieser Methode kann ein eingeloggter Benutzer die Datei genau dann streamen, wenn er sie auch herunterladen dürfte.
Um das Video auf einer Inhaltsseite einzubinden, kann man entweder als HTML-Element den Video-Tag selber schreiben mit der genannten URL oder das Template ce_player editieren. Ich habe letzteres getan und das Template wie folgt angepasst:
PHP-Code:
<?php $this->extend('block_searchable'); ?>
<?php $this->block('content'); ?>
<!-- indexer::stop -->
<?php if ($this->isVideo): ?>
<video<?= $this->size ?><?php if ($this->poster): ?> poster="<?= $this->poster ?>" preload="none"<?php endif; ?><?php if ($this->autoplay): ?> autoplay<?php endif; ?> controls>
<?php foreach ($this->files as $file): ?>
<source type="<?= $file->mime ?>" src="<?= $this->Environment->requestUri ?>?stream=true&file=<?= $file->path ?>" title="<?= $file->title ?>">
<?php endforeach; ?>
</video>
<?php else: ?>
<audio<?= $this->size ?> preload="none"<?php if ($this->autoplay): ?> autoplay<?php endif; ?> controls>
<?php foreach ($this->files as $file): ?>
<source type="<?= $file->mime ?>" src="<?= $file->path ?>" title="<?= $file->title ?>">
<?php endforeach; ?>
</audio>
<?php endif; ?>
<!-- indexer::continue -->
<?php $this->endblock(); ?>