2016-10-12 1 views

Antwort

1

Verwenden Sie die MediaStream constructor in Firefox und Chrome 56, um Tracks in einen neuen Stream zu kombinieren:

let stream = new MediaStream([videoTrack, audioTrack]); 

Die folgenden Werke für mich in Firefox (Verwenden https fiddle in Chrome, obwohl es Fehler bei der Aufzeichnung):

navigator.mediaDevices.getUserMedia({audio: true}) 
 
    .then(stream => record(new MediaStream([stream.getTracks()[0], 
 
              whiteNoise().getTracks()[0]]), 5000) 
 
    .then(recording => { 
 
     stop(stream); 
 
     video.src = link.href = URL.createObjectURL(new Blob(recording)); 
 
     link.download = "recording.webm"; 
 
     link.innerHTML = "Download recording"; 
 
     log("Playing "+ recording[0].type +" recording:"); 
 
    }) 
 
    .catch(log)) 
 
    .catch(log); 
 

 
var whiteNoise =() => { 
 
    let ctx = canvas.getContext('2d'); 
 
    ctx.fillRect(0, 0, canvas.width, canvas.height); 
 
    let p = ctx.getImageData(0, 0, canvas.width, canvas.height); 
 
    requestAnimationFrame(function draw(){ 
 
    for (var i = 0; i < p.data.length; i++) { 
 
     p.data[i++] = p.data[i++] = p.data[i++] = Math.random() * 255; 
 
    } 
 
    ctx.putImageData(p, 0, 0); 
 
    requestAnimationFrame(draw); 
 
    }); 
 
    return canvas.captureStream(60); 
 
} 
 

 
var record = (stream, ms) => { 
 
    var rec = new MediaRecorder(stream), data = []; 
 
    rec.ondataavailable = e => data.push(e.data); 
 
    rec.start(); 
 
    log(rec.state + " for "+ (ms/1000) +" seconds..."); 
 
    var stopped = new Promise((y, n) => 
 
     (rec.onstop = y, rec.onerror = e => n(e.error || e.name))); 
 
    return Promise.all([stopped, wait(ms).then(_ => rec.stop())]).then(_ => data); 
 
}; 
 

 
var stop = stream => stream.getTracks().forEach(track => track.stop()); 
 
var wait = ms => new Promise(resolve => setTimeout(resolve, ms)); 
 
var log = msg => div.innerHTML += "<br>" + msg;
<div id="div"></div><br> 
 
<canvas id="canvas" width="160" height="120" hidden></canvas> 
 
<video id="video" width="160" height="120" autoplay></video> 
 
<a id="link"></a>

+0

Sollte der richtige Weg, nicht mit 'MediaStream.addTrack' sein? (Auch wenn es [in FF nicht funktioniert] (https://bugzilla.mozilla.org/show_bug.cgi?id=1296531).) Außerdem setzt Chrome immer noch den 'MediaStream'-Konstruktor. – Kaiido

+0

@Kaiido Sie sind beide richtig. Der Konstruktor funktioniert für mich in Chrome Canary ohne das Flag chrome: // flags/# enable-experimental-web-platform-features, obwohl etwas in der Aufzeichnung fehlschlägt. Hoffe, beide Browser beheben ihre Fehler bald. – jib

+0

Ja, es ist in canary 56 vordefiniert, aber in stable 53 müssen Sie noch 'new webkitMediaStream()' aufrufen. Ich habe eine hässliche Worakround gemacht, um mit beiden Browsern am Ende [dieses Duke] (http://stackoverflow.com/questions/39302814/mediastream-capturs-canvas-and-audio-) gleichzeitig umzugehen. Und ja, es gibt immer noch eine Menge Bugs in beiden UAs ... – Kaiido

Verwandte Themen