将文件写入磁盘blob在电子应用程序

问题描述:

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

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);           
    }       

可以使用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将文件压缩/编码为不同的格式。

+0

对不起,有点晚了。但是直到今天还没有时间来尝试你的解决方案。它运作良好,谢谢。 我在输出文件中只有一个问题。当我尝试使用任何视频播放器播放时,它不会正确显示视频的长度,它只会显示1秒的视频,即使1秒结束,它也会继续播放视频。但如果你知道我的意思,我不能转发,如果视频倒退。 – silentnights

+0

是的,我有同样的问题。我不确定为什么这样。有人熟悉编解码器及其播放可以解释它。我最终使用ffmpeg将其重新渲染为mp4,然后将其正确显示。 – Danteinus

+0

持续时间问题是MediaRecorder的问题。如果您使用ffmpeg进行转码,它应该自行更正。 –