2017-04-13 9 views
5

में दाखिल करने के लिए मैं बहुत ही सरल डेस्कटॉप पर कब्जा कार्यक्षमता है कि एक इलेक्ट्रॉन एप्लिकेशन है:MediaRecorder ब्लॉब एक ​​इलेक्ट्रॉन एप्लिकेशन

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

var recorder; 
var chunks = []; 
var WINDOW_TITLE = "App Title"; 

function startRecording() { 
    desktopCapturer.getSources({ types: ['window', 'screen'] }, function(error, sources) { 
     if (error) throw error; 

     for (let i = 0; i < sources.length; i++) { 
      let src = sources[i]; 
      if (src.name === WINDOW_TITLE) { 
       navigator.webkitGetUserMedia({ 
        audio: false, 
        video: { 
         mandatory: { 
          chromeMediaSource: 'desktop', 
          chromeMediaSourceId: src.id, 
          minWidth: 800, 
          maxWidth: 1280, 
          minHeight: 600, 
          maxHeight: 720 
         } 
        } 
       }, handleStream, handleUserMediaError); 
       return; 
      } 
     } 
    }); 
} 

function handleStream(stream) { 
    recorder = new MediaRecorder(stream); 
    chunks = []; 
    recorder.ondataavailable = function(event) { 
     chunks.push(event.data); 
    }; 
    recorder.start(); 
} 

function stopRecording() { 
    recorder.stop(); 
    toArrayBuffer(new Blob(chunks, {type: 'video/webm'}), function(ab) { 
     var buffer = toBuffer(ab); 
     var file = `./test.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 = 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.5 seconds and save to disk 
startRecording(); 
setTimeout(function() { stopRecording() }, 3500); 

मुझे लगता है कि MediaRecorder ब्लॉब स्रोतों को बचाने के लिए पता है, मैं एक ArrayBuffer में पढ़ने की जरूरत है, फिर फ़ाइल को सहेजने के लिए सामान्य बफर में कॉपी करें।

हालांकि, जहां यह मेरे धब्बे में धब्बे का हिस्सा संयोजन है के लिए असफल रहने जा रहा है। जब भाग एक ब्लॉब में जोड़े जाते हैं - ऐसा लगता है जैसे वे गायब हो जाते हैं। नया ब्लॉब खाली है, और बाद में कॉपी की गई हर दूसरी डेटा संरचना भी पूरी तरह खाली है।

ब्लॉब बनाने से पहले, मैं जानता हूँ कि मैं वैध ब्लॉब हिस्सा सरणी में की है।

यहाँ मात्रा की डिबग जानकारी new Blob(chunks, {.. हिस्सा निष्पादित करने से पहले, है।

console.log(chunks) 

console.log(chunks)

तो यहाँ new Blob(chunks, {type: 'video/webm'}) वस्तु की डिबग जानकारी है।

console.log(ab) 

console.log(ab)

मैं पूरी तरह से स्टंप्डया हूँ। सभी संदर्भ ट्यूटोरियल या अन्य SO उत्तर मैं मूल रूप से इस प्रवाह का पालन कर सकते हैं। मैं क्या खो रहा हूँ?

इलेक्ट्रॉन संस्करण: 1.6.2

उत्तर

1

यह समस्या सचमुच ही बिना मुझे कुछ भी बदल रहा है आज तय की। मुझे यकीन नहीं है कि मेरे सिस्टम के बारे में क्या बदला गया है (रीबूट के अलावा) लेकिन यह अब ठीक उसी तरह काम कर रहा है जैसा इसे करना चाहिए।

+0

जब मैं कोड के इस पेज, (Ctrl + F) पर "मात्रा" के लिए एक खोज करते हैं, ऐसा लगता है "stopRecording" विधि मात्रा का उपयोग करता है एक पैरामीटर के रूप में पारित किया जाना है। यदि हिस्सा इस समाधान का उपयोग करके अपना महत्व होता है मैं जाँच करेगा: http://stackoverflow.com/questions/1181575/determine-whether-an-array-contains-a-value – Programmer

+0

मैं ठीक उसी कोड और ठीक उसी व्यवहार मिल गया है जारी है, लेकिन यह "खुद" ठीक करने के लिए नहीं चाहता है, कृपया यहाँ मदद: https://stackoverflow.com/questions/49208343/saving-desktopcapturer-to-video-file-from-electron-app – BT101