2017-04-22 8 views
1

ウェブアプリケーションとデスクトップからデータを記録している電子アプリケーションを作成しています。記録セッションの最後に、データをバックグラウンドでファイルに保存します。私はブロブからファイルに直接データを書き込む方法を知らない。助言がありますか? 以下は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);           
    }       

答えて

3

あなたは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秒のビデオしか表示されず、1秒でビデオが完全に再生されます。しかし、もし私が何を意味しているのか分かっていれば、私はビデオを送り返すことはできません。 – silentnights

+0

はい私は同じ問題があります。なぜそれがこのようなのか分かりません。コーデックとその再生に精通している人は、それを説明することができます。私は最終的にmp4にffmpegを使って再レンダリングして、それを正しく表示します。 – Danteinus

+0

継続時間の問題はMediaRecorderの問題です。 ffmpegを使用してトランスコードする場合は、それ自体を修正する必要があります。 –

関連する問題