Мне нужно преобразовать объект 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» также недействителен. Я знаю, что «дублирую» каплю в памяти. Существующие решения не подходят для моей проблемы или нуждаются в функции извлечения. Я полностью запутался, и я был бы рад получить помощь от более опытных программистов.
Вы можете вернуть свой большой двоичный объект с помощью 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);
Почему бы просто не сохранить ссылку на исходный большой двоичный объект, который использовался для создания этого URL-адреса большого двоичного объекта?