由于不建议使用Buffer(),因此将DesktopCapturer保存到Electron中的文件中

时间:2019-11-29 02:19:05

标签: javascript electron

您好,我已经阅读并尝试了以下线程:Saving desktopCapturer to video file in Electron

这是我到目前为止所拥有的:

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

function startRecording(){
    desktopCapturer.getSources({ types: ['window', 'screen'] }).then(async sources => {
    for (const source of sources) {
        if (source.name === 'Entire Screen') {
            try {
                const stream = await navigator.mediaDevices.getUserMedia({
                audio: false,
                video: {
                    mandatory: {
                    chromeMediaSource: 'desktop',
                    chromeMediaSourceId: source.id,
                    minWidth: 1280,
                    maxWidth: 1280,
                    minHeight: 720,
                    maxHeight: 720
                    }
                }
                })
                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();
    console.log(blobs);
    toArrayBuffer(new Blob(blobs, {type: 'video/webm'}), function(ab) {
        var buffer = toBuffer(ab);
        var file = `./videos/example.webm`;
        fs.writeFile(file, buffer, function(err) {
            if (err) {
                console.error('Failed to save video ' + err);
            } else {
                console.log('Saved video: ' + file);
            }
        });
    });
}

function handleUserMediaError(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 =  Buffer.alloc(ab.byteLength);
    let arr = new Uint8Array(ab);
    for (let i = 0; i < arr.byteLength; i++) {
        buffer[i] = arr[i];
    }
    return buffer;
}

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

我只想将录制的视频保存到文件中。 保存后文件最终为空。我一直被困在这一段时间,并希望得到任何建议。谢谢

1 个答案:

答案 0 :(得分:0)

很高兴我偶然发现了这个线程:Saving desktopCapturer to video file from Electron app

并将我的stopRecording()函数更改为:

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

}

,它似乎正在工作。酷!