Ich habe einen Canvas-Stream mit canvas.captureStream(). Ich habe einen anderen Videostream von webrtc Videoanruf. Jetzt möchte ich Canvas-Stream mit Audio-Tracks des Videostreams mischen. Wie kann ich das tun?Wie können wir Canvas-Stream mit Audio-Stream mischen mit MediaRecorder
3
A
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>
Verwandte Themen
- 1. mit Android MediaRecorder
- 2. können wir Struts und HTML-Tag in einzelne Seite mischen
- 3. Wie können wir mit ibpy Aufträge bearbeiten?
- 4. Wie können wir MSHTML mit VBA verwenden?
- 5. Wie können wir Tastaturtasten mit Vbs simulieren?
- 6. Erfassen von Musik mit MediaRecorder
- 7. Wie können wir Kreditkartennummern mit White Spaces mit Jquery validieren?
- 8. Wie können wir UIView mit cocos2d mit Animation anzeigen?
- 9. Wie können wir mit Negation mit Coldfusion regexp?
- 10. Metadaten aus Audiostream mit AVAUDIOPLAYER abrufen
- 11. Können wir ein Java-Mitglied schmerzlos lazy laden, ähnlich wie wir es mit statischen Singletons können?
- 12. Können wir Sikuli mit PhantomJS verwenden?
- 13. Können wir Funktionsargument/Parameterwerte mit Go
- 14. Können wir ein Wörterbuch mit Generic erstellen?
- 15. Was können wir mit telnet alles tun?
- 16. Können wir Klassennamen mit alphanumerischen Zeichen haben?
- 17. Können wir URL mit Notepad ++ decodieren?
- 18. können wir CASE mit EXEC verwenden
- 19. Können wir 'malloced' Speicher mit 'löschen' freigeben?
- 20. Können wir Webmail mit unserer Anwendung integrieren?
- 21. Mischen mit GPUImagePoissonBlendFilter
- 22. Können wir wissen, ob wir mit youtube api streamen?
- 23. Wie können wir Kibana abfragen?
- 24. Können wir Xpath mit BeautifulSoup verwenden?
- 25. Können wir erstellen Log-Dateien mit Javascript
- 26. Können wir die Druckereinstellungen mit jquery ändern?
- 27. Können wir Excel-Datei mit File.Create erstellen?
- 28. Können wir überprüfen Download-Test mit Selenium
- 29. Können wir Rennen mit TakeEvery benutzen?
- 30. Können wir mailchimp mit Google-Website integrieren
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
@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
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