MediaRecorder не работает на некоторых айфонах
Есть страничка, на которой нужно записать ответ голосом. На андроиде работает без проблем. На айфонах заработало только после подключения полифилла, взятого с просторов интернета. Но сейчас начали поступать отзывы от пользователей, что на некоторых айфонах все равно не работает, или работает через раз.
Подскажите, пожалуйста, в чем может быть проблема? У меня нет айфона и нет возможности отладить, посмотреть консоль на нем. Не знаю даже на что ругается.
Ссылка на пример: https://marsurvey.ru/marina/ssi8/cgi-bin/test.html
Код функции записи голоса (убрала некоторые неважные куски кода, полный код можно посмотреть по ссылке в voice_record-v0.1.js):
function voiceRecord(pass, ques, testMode, recordName) {
if (recordName === undefined) recordName = ques;
var URL = '../voice_record/voice.php?pass=' + pass + '&q=' + recordName + '&testMode=' + testMode;
if (navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = function(constraints) {
var getUserMedia = (navigator.getUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia ||
navigator.webkitGetUserMedia);
if (!getUserMedia) {
return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
}
return new Promise(function(resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
}
}
if (navigator.mediaDevices.getUserMedia === undefined || MediaRecorder === undefined) {
$("#" + ques + "_div .header2 .err").show()
} else {
$(".timer").val("00:00:00")
}
var mime = 'audio/webm';
if (!MediaRecorder.isTypeSupported(mime)) {
mime = 'audio/mp3'
}
if (!MediaRecorder.isTypeSupported(mime)) {
mime = 'audio/wav'
}
if (!MediaRecorder.isTypeSupported(mime)) {
mime = 'audio/ogg'
}
navigator.mediaDevices.getUserMedia({
audio: true
})
.then(stream => {
const mediaRecorder = new MediaRecorder(stream, {
mimeType: mime
});
document.querySelector('#start').addEventListener('click', function() {
if (!document.querySelector('#start').classList.contains("disabled")) {
mediaRecorder.start();
$('#start').addClass("disabled")
$('#stop').removeClass("disabled")
StartTime()
}
});
let audioChunks = [];
mediaRecorder.addEventListener("dataavailable", function(event) {
audioChunks.push(event.data);
});
document.querySelector('#stop').addEventListener('click', function() {
if (!document.querySelector('#stop').classList.contains("disabled")) {
mediaRecorder.stop();
$('#stop').addClass("disabled")
$('#replay').removeClass("disabled")
StopTime()
}
});
document.querySelector('#replay').addEventListener('click', function() {
if (window.confirm("Подтвердите, пожалуйста, что Вы хотите удалить эту запись и записать свой ответ заново.")) {
if (!document.querySelector('#replay').classList.contains("disabled")) {
$(".timer").val("00:00:00")
if ($("audio").length == 1) {
let src = $("audio").attr("src")
let params = {
src: src
};
(async() => {
let promise = await fetch("../voice_record/remove.php", {
method: 'POST',
body: JSON.stringify(params)
});
if (promise.ok) {
let response = await promise.json();
$('#start').removeClass("disabled")
$('#replay').addClass("disabled")
$("#messages").empty()
$("#" + ques).val("")
console.log("remove: " + response.result);
}
})();
}
}
}
});
mediaRecorder.addEventListener("stop", function() {
const audioBlob = new Blob(audioChunks, {
type: mime
});
let fd = new FormData();
fd.append('voice', audioBlob);
sendVoice(fd);
audioChunks = [];
});
});
async function sendVoice(form) {
let promise = await fetch(URL, {
method: 'POST',
body: form
});
if (promise.ok) {
let response = await promise.json();
let audio = document.createElement('audio');
audio.src = response.data + "#" + (new Date().getTime());
audio.controls = true;
audio.autoplay = false;
document.querySelector('#messages').appendChild(audio);
$("#" + ques).val(location.href.split('/cgi-bin')[0] + response.data.replace("..", ""))
}
};
}
