Я пытаюсь создать аудиоплеер с помощью js и flask. Аудиофайлы извлекаются из корзины GCP, а аудиофайлы имеют общий доступ. Но когда я пытаюсь воспроизвести звук, он выдает
Access to audio at 'https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3' from origin 'http://localhost' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
GET https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3 net::ERR_FAILED 206
Мой HTML-код выглядит так:
<audio class = "js-audio-source" src = "https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3" crossorigin = "anonymous">
<source src = "https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3" type = "audio/mp3">
</audio>
<ul id = "audio-playlist" class = "text-start ml-4">
<li style = "cursor:pointer;" title = "Chapter 01" data-chapter-id = "1" index = "1" path = "https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3">
▶ Chapter 01
</li>
</ul>
<input type = "range" id = "seek-bar" value = "0" style = "display: block;width: 500px;">
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js" integrity = "sha512-aVKKRRi/Q/YV+4mjoKBsE4x3H+BkegoM/em46NNlCqNTmUYADjBbeNefNxYV7giUp0VxICtqdrbqU7iVaeZNXA= = " crossorigin = "anonymous" referrerpolicy = "no-referrer"></script>
<script>
var playlist = document.querySelector("#audio-playlist");
var total_songs = playlist.children.length;
var default_volume = 0.05;
$(".volume-count").html((default_volume*300)/3);
var seek_bar = document.querySelector("#seek-bar");
seek_bar.value = 0;
var audio_source = document.querySelector(".js-audio-source");
var current_song = 0;
var audio_api;
var gain_node;
var analyser_node;
var track;
var interval;
function init(){
audio_source.src = playlist.children[current_song].getAttribute("path");
var playingChapterID = playlist.children[current_song].getAttribute("data-chapter-id");
audio_source.volume = default_volume;
audio_source.crossOrigin = "anonymous";
}
init()
playlist.addEventListener('click', function(e){
current_song = parseInt(e.target.getAttribute("index"))-1 ;
init();
play();
});
function song(path){
audio_source.src = path;
}
function play(){
audio_source.play();
interval = setInterval(update_seek, 60);
if (audio_api === undefined){
audio_api = new window.AudioContext() || new window.WebkitAudioContext();
gain_node = audio_api.createGain();
analyser_node = audio_api.createAnalyser();
track = audio_api.createMediaElementSource(audio_source);
}
track.connect(analyser_node).connect(gain_node).connect(audio_api.destination);
}
function pause(){
audio_source.pause();
clearInterval(interval);
}
function update_seek(){
seek_bar.value = (audio_source.currentTime/audio_source.duration)*100;
}
$(document).keydown(function(e) {
if (e.keyCode == 32) { // Space key
e.preventDefault();
play()
}
if (e.keyCode == 27) { // Space key
e.preventDefault();
pause()
}
});
</script>
Я попытался добавить audio_source.crossOrigin = "anonymous";
в функцию init(), а также попытался добавить crossorigin = "anonymous"
prop в тег audio. Но, похоже, это не работает.
Плеер отлично работает (по крайней мере, воспроизводит, приостанавливает и ищет обновления) с локальными аудиофайлами. И когда я напрямую открываю URL-адрес аудио корзины GCP в браузере, он воспроизводится без проблем.
Как я могу это исправить? Пожалуйста, помогите.
@JaromandaX спасибо за ответ. Есть ли у вас какие-либо предложения по решению этой проблемы?
Попробуйте настроить CORS в корзине GCP, содержащей аудиофайлы. Вы можете проверить этот document1 и document2, чтобы узнать, как настроить CORS для корзины GCP.
gsutil cors set cors-json-file gs://<bucket_name>
Это загрузит эти настройки конфигурации CORS в вашу корзину. И после этого вы можете получить текущие настройки в любое время, используя
gsutil cors get gs://<bucket_name>
.
gsutil cors
позволяет получить или установить конфигурацию CORS для одного или нескольких сегментов. Это поддерживается только для сегментов, а не для объектов. Пример документа CORS JSON выглядит следующим образом:
[
{
"origin": ["http://localhost”],
"method": ["GET"],
"responseHeader": ["Content-Type"],
"maxAgeSeconds": 3600
}
]
Также проверьте приведенные ниже аналогичные примеры
CORS установлен, но не влияет на запрос
Короче говоря, CORS — это механизм, с помощью которого сервер контролирует доступ к своим ресурсам — сервер, с которого вы получаете звук, не разрешает доступ к этому ресурсу из сценария браузера с перекрестным происхождением ... TL; DR, вы не можете это исправить в коде браузера