Наладить корректную запись с микрофона на Safari

Бьюсь над кроссплатформенным вариантом записи звука с микрофона на JS.

В общем для начала я использовал Media Stream Recording нативного js:

if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
    console.log('getUserMedia supported.');

    let onSuccess = function(stream) {
        const mediaRecorder = new MediaRecorder(stream, {mimeType: mimeType});
    
        let chunks = [];

        mediaRecorder.start();

        // лишняя логика нажатий на кнопки опущена

        mediaRecorder.onstop = function (e) {
            const file = new File(chunks, "voice");
            console.log(file);
            // тут передаю файл на сервер, со стороны бекенда php
        }

        mediaRecorder.ondataavailable = function (e) {
            chunks.push(e.data);
        }
    }
    
    let onError = function(err) {
        console.log('The following error occured: ' + err);
    }
    
    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);
} else {
   console.log('getUserMedia not supported on your browser!');
}

Этот код идеально работает в хромоподобных браузерах, на сервер уходит файл audio/webm я его конвертирую с помощью ffmpeg в mp3 и ogg. Всё отлично.

Но есть проблема с Safari как на IOS так и на MACOS.

Код, который привёл выше, отправляет на сервер файл формата mp4a aac, который содержит всего 1 секунду "корректной записи", то есть запись 5 секунд, НО слышно только первую. Попробовал конвертировать в другие форматы, но безуспешно.

Тогда я обратился к RecordRTC, сделал всё как указано в примере:

var options = {
        type: 'audio',
        numberOfAudioChannels: isEdge ? 1 : 2,
        checkForInactiveTracks: true,
        bufferSize: 16384
    };

    if(isSafari || isEdge) {
        options.recorderType = StereoAudioRecorder;
    }

    if(navigator.platform && navigator.platform.toString().toLowerCase().indexOf('win') === -1) {
        options.sampleRate = 48000; // or 44100 or remove this line for default
    }

    if(isSafari) {
        options.sampleRate = 44100;
        options.bufferSize = 4096;
        options.numberOfAudioChannels = 2;
    }

    if(recorder) {
        recorder.destroy();
        recorder = null;
    }

    recorder = RecordRTC(microphone, options);

    recorder.startRecording();

В этом примере для Safari используется wav формат, но на сервер уходит запись с "треском" вместо голоса.

Собственно вопрос, кто-нибудь смог завести Media Recorder на Safari, с корректной работой?


Ответы (0 шт):