Проблема с синхронизацией для сгенерированного звука в некоторых браузерах
Мне нужно сгенерировать звук из файла mp3. Поэтому я использую библиотеку curl для получения файла, затем устанавливаю необходимые заголовки иecho
аудиоконтент.
Проблема в том, что он некорректно работает в браузерах Chrome и Safari. Аудиофайлы загружаются, и начинается воспроизведение, но вы не можете изменить время (невозможно установить.currentTime
в javascript, а также в браузере ползунок времени не работает). (В Firefox работает нормально).
Код: php
$agent = 'stagefright/1.2 (Linux;Android 5.0)';
$url = 'http://www.jplayer.org/audio/mp3/Miaow-07-Bubble.mp3';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1) ;
curl_setopt($ch, CURLOPT_REFERER, 'http://www.jplayer.org/');
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
$media = curl_exec($ch);
curl_close($ch);
$content_length = strlen($media);
$type = "audio/mpeg";
header("Content-type: ".$type);
header("Content-length: ".$content_length);
echo $media;
exit;
Любые идеи?
Может мне не хватает заголовков php?
Спасибо.
1 ответ
Как я предполагаю, мне не хватало заголовка php.
Необходимо добавить следующий заголовок:
header('Accept-Ranges: bytes');
Надеюсь, это кому-нибудь поможет.
ОБНОВИТЬ:
Я нашел здесь очень похожий вопрос: HTML5
Добавление Accept-Ranges
Заголовок исправить проблему для Chrome. Но для сафари вам нужно проверитьHTTP_RANGE
и добавить Content-Range
заголовок.
Вот моя реализация, которая отлично работает во всех основных браузерах.
$content_length = strlen($media_total);
$total_bytes = $content_length;
$content_length_1 = $content_length - 1;
if (isset($_SERVER['HTTP_RANGE'])) {
$byte_range = explode('-',trim(str_ireplace('bytes=','',$_SERVER['HTTP_RANGE'])));
$byte_from = $byte_range[0];
$byte_to = intval($byte_range[1]);
$byte_to = $byte_to == 0 ? $content_length_1 : $byte_to;
$media_total = substr($media_total,$byte_from,$byte_to);
$content_length = strlen($media_total);
header('HTTP/1.1 206 Partial Content');
}
else {
$byte_from = 0;
$byte_to = $content_length_1;
}
$content_range = 'bytes '.$byte_from.'-' . $byte_to . '/' . $total_bytes;
header('Accept-Ranges: bytes');
header("Content-Range: ".$content_range);
header("Content-type: ".$type);
header("Content-length: ".$content_length);
header('Content-Transfer-Encoding: binary');
echo $media_total;
exit;