Я передаю аудиофайлы с сервера Node.js Express с заголовками Content-Range
и без кэширующих заголовков. Это работает нормально в последней версии Safari, но не в Chrome.
Хотя при потоковой передаче полного аудиофайла с HTTP 200
мои заголовки были
{ 'Content-Length': 4724126,
'Content-Type': 'audio/mpeg',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'POST, GET, OPTIONS',
Expires: 0,
Pragma: 'no-cache',
'Cache-Control': 'no-cache, no-store, must-revalidate' }
и работает как на Chrome, так и на Safari <audio>
.
При потоковой передаче частичного содержимого с помощью HTTP 206 заголовки были
{ 'Content-Length': 4724126,
'Content-Type': 'audio/mpeg',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'POST, GET, OPTIONS',
Expires: 0,
Pragma: 'no-cache',
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Accept-Ranges': 'bytes',
'Content-Range': 'bytes 120515-240260/4724126' }
Это привело к ошибке страницы Chrome , на которой был тег <audio>
или <video>
.
Даже встроенный медиа-тег, созданный Chrome при использовании потокового URL прямо в браузере, не работает, и привел к этому
Аудиофайл подается на чтение локального файла и создание потока чтения файла через Node.js createReadStream
api:
var file = fs.createReadStream(path, {start: range[0], end: range[1]});
Я разместил код для сервера здесь .
[UPDATE]
Оказывается, что Chrome более строг в отношении Range
и Content-Range
запросов / ответов. Таким образом, любой Content-Range
ответ должен иметь Range
предыдущий запрос. Типичным случаем является очистка панели игрока от второго S. API отправит запрос "Range"
, сервер ответит заголовком «Content-Range». В моем случае я отправлял Content-Range
ответ на обычный запрос без "Range"
. Safari работает, потому что это более street-html
жалоба, т.е. он не требует строго "Range"
запроса перед "Content-Range"
ответом. Итак, я удалил заголовок «Content-Range» из своего ответа, и он не работает.
Конец истории (!).
Чтобы решить эту проблему, я также разместил на форуме Chromium net-dev в Chrome bad Range header: Диапазон: байты = 0-