Я пытаюсь записать текущий экран в 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);