Диапазон HTTP, потоковая передача, музыка и аудио

У меня есть веб-сайт, который я использую для потоковой передачи аудио файлов.
В основном, MP3 & OGG.
С тех пор, как несколько месяцев я сам (PHP) справлялся с парящей частью (до того, как это стало apache2). Сначала я делаю нормальный ответ 200 OK с разрезанным двоичным ответом моих мультимедийных аудиофайлов (для выделения памяти).
Он работает нормально, но у меня есть продолжительность Бесконечность на всех моих аудио.
В соответствии с этот вопрос, я вчера обновил потоковую часть.

И теперь у меня есть одна из самых странных ошибок, которые я мог себе представить. Мой рефакторинг кода действительно отлично работает с MP3, но не с OGG … Изображения или zip-загрузка также работают с классом выше, и они оба работают как и прежде.

Вот мой класс Stream.

<?php
class Stream extends Response
{
protected $filepath;
protected $delete;
protected $range = ['from' => 0, 'to' => null];

public function __construct($filePath, $delete = false, $range = NULL)
{
$this->delete = $delete;
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $filePath);
$size = filesize($filePath);

$this->headers['Content-Type'] = $mimeType;
$this->headers['Content-Length'] = $size;
$this->headers['Accept-Ranges'] = 'bytes';
$this->headers['Content-Transfer-Encoding'] = 'binary';
unset($finfo, $mimeType);

$this->code = 200;
$this->range['to'] = $size - 1;

if ($range !== NULL) {
if (preg_match('/^bytes=\d*-\d*(,\d*-\d*)*$/i', $range) === false) {
$this->code = 416;
} else {
$ranges = explode(',', substr($range, 6));
foreach ($ranges as $rangee) {
$parts = explode('-', $rangee);
$this->range['from'] = intval($parts[0]);
$this->range['to'] = intval($parts[1]);

if (empty($this->range['to'])) {
$this->range['to'] = $size - 1;
}
if ($this->range['from'] > $this->range['to'] || $this->range['to'] >= $size) {
$this->code = 416;
}
}
$this->code = 206;
}

}

if ($this->code === 416) {
$this->headers = ['Content-Range' => 'bytes */{' . $size . '}'];
} elseif ($this->code === 206) {
$this->headers['Content-Range'] = 'bytes {' . $this->range['from'] . '}-{' . $this->range['to'] . '}/{' . $size . '}';
}

$this->filepath = $filePath;
}

public function show()
{
http_response_code($this->code);

foreach ($this->headers as $header => $value) {
header($header . ': ' . $value);
}

$file = fopen($this->filepath, 'r');
fseek($file, $this->range['from']);

$interval = $this->range['to'] - $this->range['from'];
$outputBufferInterval = 4 * 1000;

if ($interval < $outputBufferInterval) {
$outputBufferInterval = $interval;
}

ob_start();
while ($interval > 0) {
echo fread($file, $outputBufferInterval);
$interval -= $outputBufferInterval;
ob_flush();
}
fclose($file);
ob_end_clean();

if ($this->delete) {
unlink($this->filepath);
}
}
}

Я немного запутался с HTTP_RANGE.
Спасибо,

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …