JavaScript: неверный URL-адрес fetch() (преобразование большого двоичного объекта в файл)

Мне нужно преобразовать объект blob в аудиофайл (.mp3). Я использовал getUserMedia() и получил данные с микрофона пользователя в виде объекта blob (кодировка .mp3, частота дискретизации 160). Рассматривайте audioElement как аудиоэлемент на моей HTML-странице и audioElementSource как атрибут src для тега <audio>.

Пример значения переменной audioElementSource: blob:http://127.0.0.1/4a9c819c-549b-45b4-bc1e-78e8c6f9a953

Созданный объект большого двоичного объекта является источником аудиоэлемента. Насколько я знаю, объект blob представляет собой необработанные (двоичные?) данные, хранящиеся в памяти браузера и доступные по ссылке (?). Затем пользователь нажимает кнопку отправки, и объект большого двоичного объекта должен быть преобразован в файл .mp3 и отправлен на сервер. Вот код:

Код кнопки на странице HTML: <button type = "button" onclick = "add_spkr()">Add audio</button>

Код JS (та же HTML-страница):

function add_spkr() {

  let audioElement = document.getElementById('audio'); // the audio element
  var aeb = audioElement.src; // contains blob:http://127.0.0.1/... string

  // ?? .MP3 FROM URL ??
  // my_file = ??

  $.ajax({
    type: "POST",
    url: 'foo.php', // backend
    data: {
      name: "some_name",
      audio_file: my_file
    },
    success: function(response) {}
  });
}

В функции add_spkr() мне нужно как-то создать аудиофайл. Вставка let get_my_blob_back = await fetch(aeb).then(r => r.blob()); в add_sprk() функция не работает. fetch пишет "неверный URL". URL-адрес с опущенной частью "blob:" также недействителен. URL-адрес с «localhost» вместо «127.0.0.1» также недействителен. Я знаю, что «дублирую» каплю в памяти. Существующие решения не подходят для моей проблемы или нуждаются в функции извлечения. Я полностью запутался, и я был бы рад получить помощь от более опытных программистов.

Почему бы просто не сохранить ссылку на исходный большой двоичный объект, который использовался для создания этого URL-адреса большого двоичного объекта?

gre_gor 23.04.2023 17:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете вернуть свой большой двоичный объект с помощью fetch, как вы написали, если политика безопасности содержимого страницы не запрещает такие URL-адреса.

var b = new Blob(["StackOverflow"]);
var u = URL.createObjectURL(b);
fetch(u)
.then(r => r.blob())
.then(b => b.text())
.then(console.info);

Другие вопросы по теме