electron 在电子应用中从blob向磁盘写文件

rur96b6h  于 8个月前  发布在  Electron
关注(0)|答案(1)|浏览(144)

我正在创建一个Electron应用程序,其中我正在从网络摄像头和桌面记录数据,在记录会话结束时,我想将数据保存到后台的文件中。我不知道如何将数据从blob直接写入文件。有什么建议吗?下面是我目前对MediaRecord Stop事件的处理。

this.mediaRecorder.onstop = (e) => {                                      
       var blob = new Blob(this.chunks,                                      
                           { 'type' : 'video/mp4; codecs=H.264' });                                                       
       var fs = require('fs');                                               
       var fr = new FileReader();                                            
       var data = null;                                                      
       fr.onload = () => {                                                   
           data = fr.result;                                                 
           fs.writeFile("test.mp4", data, err => {                           
               if(err) {                                                     
                   return console.log(err);                                  
               }                                                             
               console.log("The file was saved!");                           
           });                                                               
       };                                                                    
       fr.readAsArrayBuffer(blob);                                           
   }

字符串

yqkkidmi

yqkkidmi1#

你可以使用FileReaderBuffer
在渲染器进程中,将事件发送到主进程,以使用缓冲区保存文件:

function saveBlob(blob) {
    let reader = new FileReader()
    reader.onload = function() {
        if (reader.readyState == 2) {
            var buffer = new Buffer(reader.result)
            ipcRenderer.send(SAVE_FILE, fileName, buffer)
            console.log(`Saving ${JSON.stringify({ fileName, size: blob.size })}`)
        }
    }
    reader.readAsArrayBuffer(blob)
}

字符串
返回确认:

ipcRenderer.on(SAVED_FILE, (event, path) => {
    console.log("Saved file " + path)
})


(SAVE_FILE和SAVED_FILE是包含事件名称的静态字符串)
并且在主过程中:

ipcMain.on(SAVE_FILE, (event, path, buffer) => {
    outputFile(path, buffer, err => {
        if (err) {
            event.sender.send(ERROR, err.message)
        } else {
            event.sender.send(SAVED_FILE, path)
        }
    })
})


outputFile来自'fs-extra'
优先考虑在主进程中处理节点操作。参见电子安全建议。
如果你不想使用主进程,你可以使用'electron-remote'创建后台进程来写文件。另外,你可以在后台进程中调用ffmpeg来压缩/编码文件成不同的格式。

相关问题