Проблема с синхронизацией для сгенерированного звука в некоторых браузерах

Мне нужно сгенерировать звук из файла 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;
Другие вопросы по тегам