Выходной видеосигнал равен 0 байт при записи в Electron через MediaRecorder - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь записать текущий экран в Electron через ScreenCapturer, но когда я пытаюсь сохранить его на диске, я получаю файл размером 0 байт.я также получаю эту ошибку на консоли приложения:

(node:13704) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.

в веб-версии, я просто использую window.URL.createObjectURL(blob), и все готово!но в электроне, я думаю, мне нужно что-то с буфером ?!Кто-нибудь может мне объяснить, почему это происходит?Спасибо!

const {desktopCapturer} = require('electron');
const fs = require('graceful-fs');

const SECRET_KEY = 'Electron 69';
let recorder;
let blobs = [];

const startRecording = () => {
    let title = document.title;
    document.title = SECRET_KEY;

    desktopCapturer.getSources({types: ['window', 'screen']}, (error, sources) => {
        if (error) throw error;
        for (let source of sources) {
            if (source.name === SECRET_KEY) {
                document.title = title;

                navigator.mediaDevices.getUserMedia({
                    audio: false,
                    video: {
                        mandatory: {
                            chromeMediaSource: 'desktop',
                            chromeMediaSourceId: source.id,
                            minWidth: 1280,
                            maxWidth: 1280,
                            minHeight: 720,
                            maxHeight: 720
                        }
                    }
                }).then((stream) => handleStream(stream))
                    .catch((e) => handleError(e));
                return
            }
        }
    });
};

function handleStream(stream) {
    recorder = new MediaRecorder(stream);
    blobs = [];
    recorder.ondataavailable = function(event) {
        blobs.push(event.data);
    };
    recorder.start();
}

function stopRecording() {
    recorder.stop();
    toArrayBuffer(new Blob(blobs, {type: 'video/mp4'}), function(ab) {
        const buffer = toBuffer(ab);
        const file = `./record.mp4`;
        fs.writeFile(file, buffer, function(err) {
            if (err) {
                console.error('Failed to save video ' + err);
            } else {
                console.log('Saved video: ' + file);
            }
        });
    });
}

function handleError(e) {
    console.error('handleUserMediaError', e);
}

function toArrayBuffer(blob, cb) {
    let fileReader = new FileReader();
    fileReader.onload = function() {
        let arrayBuffer = this.result;
        cb(arrayBuffer);
    };
    fileReader.readAsArrayBuffer(blob);
}

function toBuffer(ab) {
    let buffer = new Buffer(ab.byteLength);
    let arr = new Uint8Array(ab);
    for (let i = 0; i < arr.byteLength; i++) {
        buffer[i] = arr[i];
    }
    return buffer;
}

// Record for 3 seconds and save to disk
startRecording();
setTimeout(function() { stopRecording() }, 3000);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...