Аудио с сервера Icecast не воспроизводится в Chrome
у меня возникли проблемы с получением статического контента (mp3-файлов), обслуживаемого сервером Icecast, чтобы играть в браузере Google Chrome с HTML5. Причина, по которой мы обслуживаем MP3 через Icecast, - это политика: CPB требует, чтобы они были "потоковыми", а не "загруженными", поскольку мы-Общественное радио. Наши живые аудиопотоки отлично воспроизводятся в Chrome.
если вы поместите URL-адрес для MP3, обслуживаемого моим сервером Icecast 2.4.3, прямо в панель URL-адресов в google Chrome, он не воспроизводится. Сделать то же самое в Firefox, IE, Safari и т. д.. он играет! Попробуйте:
https://streaming.kansaspublicradio.org:8001/mp3/First_0713886.mp3
(временное решение, которое я использую, - это Flash, но последнее обновление для Chrome (v60.0) делает Flash заблокированным по умолчанию, опция "всегда разрешать этот сайт", похоже, не работает, и маленький значок, показывающий, что Flash заблокирован, намного более дискретен. Попробуйте здесь: http://kansaspublicradio.org/kpr-news/midwest-farmers-hope-boost-online-grocery-shopping )
мое лучшее предположение о том, почему это происходит, заключается в том, что это имеет какое-то отношение к этому: https://developers.google.com/web/updates/2016/03/play-returns-promise?hl=en
поэтому я попытался воспроизвести их пример кода, в котором они обезьяна с HTML5 Media Capture, чтобы получить звук для воспроизведения без взаимодействия с пользователем. Но с этот URL для аудио, он не может играть и бросает эту ошибку:Uncaught (in promise) DOMException: The element has no supported sources.
попробуйте:https://jsfiddle.net/wo94xohr/2/ он терпит неудачу только в Chrome, а не Firefox или других.
я попробовал еще раз, но без HTML5 Media Capture. По-прежнему без шансов. Попробуйте:https://jsfiddle.net/yrhets74/
кроме того, если вы посмотрите на заголовки ответов, вы увидите "Content-Range:bytes 0-0/0"... может, это что-то значит?
обновление: я тестирую, чтобы узнать, является ли это проблемой CORS (cross origin resource sharing). Я обновил в jsfiddle в:
var audioElement = document.querySelector('#music');
audioElement.crossOrigin = "anonymous"; // CORS access restriction. Worth a shot but no dice
audioElement.type = "audio/mpeg"; // just in case? idk
audioElement.src = "https://streaming.kansaspublicradio.org:8001/mp3/First_0713886.mp3";
function startPlayback() {
// .play() is a Promise
return audioElement.play().then(function(x){console.log('yay!')}, function(reason){
console.log('Error: ' + reason);
});
}
var playButton = document.querySelector('#play');
playButton.addEventListener('click', startPlayback);
он не изменил конечный результат в Chrome, но в Firefox он не играет сейчас, и он дает предупреждение:Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://streaming.kansaspublicradio.org:8001/mp3/First_0713886.mp3. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
как вы думаете, сервер Icecast нуждается в заголовке "Access-Control-Allow-Origin", установленном в "allow" или что-то еще?
вот полный ответ Сервер Icecast:
Request URL:https://streaming.kansaspublicradio.org:8001/mp3/First_0713886.mp3
Request Method:GET
Status Code:206 Partial Content
Remote Address:129.237.213.244:8001
Referrer Policy:no-referrer-when-downgrade
Response Headers
view source
Accept-Ranges:bytes
Cache-Control:no-cache
Content-Length:526408
Content-Range:bytes 0-0/0
Content-Type:audio/mpeg
Date:Tue, 15 Aug 2017 19:34:23 GMT
Expires:Mon, 26 Jul 1997 05:00:00 GMT
Pragma:no-cache
Server:Icecast 2.4.3
Request Headers
view source
Accept:*/*
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:en-US,en;q=0.8,ms;q=0.6
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:streaming.kansaspublicradio.org:8001
Origin:https://fiddle.jshell.net
Pragma:no-cache
Range:bytes=0-
Referer:https://fiddle.jshell.net/_display/
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
обновление 2: мы добавили заголовок CORS Access-Control-Allow-Origin:*
к заголовкам ответов сервера icecast, и теперь jsfiddle работает в Firefox-нет CORS header ‘Access-Control-Allow-Origin’ missing
предупреждение. По-прежнему не играет в Chrome, хотя : (
Я также протестировал WAV-файлы и файлы M3U, и ни один не будет играть в Chrome. Firefox может воспроизводить wav-файл (с кодом JSfiddle), но нет файла m3u
2 ответов
Я думаю, что проблема заключается в вашем потоке. Вот немного измененный пример с другим потоковым URL:
audioElement.src = "http://novazz.ice.infomaniak.ch/novazz-128.mp3";
https://jsfiddle.net/yrhets74/5/
это работает на моей машине с Firefox и Chrome 55 60.
VLC говорит мне, что используемый кодек-MPEG Audio 1/2 (mpga).
Что касается политики CORS, вас может заинтересовать этот вопрос:DOMException: не удалось загрузить, потому что не поддерживается источник найдено
Chrome, скорее всего, будет воспроизводить аудиофайлы со стандартами битрейт 128 , 160 , 320 , 512 , ...
Я не на 100% на специфику этого, однако, похоже, что некоторые MP3, использующие более старые версии Lame, или дольше, чем пару минут, или при высоких (300 =) битрах, похоже, затронуты. Похоже, это связано с webkit, так как это также влияет на пользователей Safari.