我正在尝试从动态创建的视频元素中捕获流。当我获取视频元素并尝试 videoElement.captureStream() 时,Firefox 返回 videoElement.captureStream 不是函数,但相同的代码可以在 Chrome 上运行。问题似乎 Firefox 在动态创建视频元素方面存在问题。我尝试突变观察者来检测新添加的视频元素并访问 captureStream 方法,但没有成功我发布了下面的代码示例(我正在为 WebRTC 使用adapter.js https://webrtc.github.io/adapter/adapter-latest.js )
(function (win) {
var listeners = [],
doc = win.document,
MutationObserver = win.MutationObserver || win.WebKitMutationObserver,
observer;
function ready(selector, fn) {
listeners.push({
selector: selector,
fn: fn
});
if (!observer) {
observer = new MutationObserver(check);
observer.observe(doc.documentElement, {
childList: true,
subtree: true
});
}
check();
}
function check() {
for (var i = 0, len = listeners.length, listener, elements; i < len; i++) {
listener = listeners[i];
elements = doc.querySelectorAll(listener.selector);
for (var j = 0, jLen = elements.length, element; j < jLen; j++) {
element = elements[j];
if (!element.ready) {
element.ready = true;
listener.fn.call(element, element);
}
}
}
}
win.ready = ready;
})(this);
ready('.jw-video',function(element){
var stream = null;
element.addEventListener('play',function(e){
//with firefox here e.target.captureStream or element.captureStream returns error
stream = e.target.captureStream();
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.onerror = function(error){
console.log("media recorder error:",error);
}
mediaRecorder.start();
mediaRecorder.ondataavailable = function(evt){
console.log("mediaRecorderData");
var blob = evt.data;
var fileReader = new FileReader();
var arraybuffer;
fileReader.onload = function(){
arraybuffer = fileReader.result;
console.log("arraybuffer");
console.log(arraybuffer);
chunks.push(arraybuffer);
sendChunks(chunks);
};
fileReader.readAsArrayBuffer(blob);
}
window.setInterval(function(){
mediaRecorder.requestData();
},3000);
});
});
有谁知道如何访问新添加的视频元素的 captureStream 方法(该方法适用于 Chrome 和 Firefox)或另一种捕获流并将其从 JWPlayer 转换为 arraybuffer 的方法?
最佳答案
不,问题很简单,Firefox 仍然带有前缀 HTMLMediaElement#captureStream
.
因此您需要调用 video.mozCaptureStream()
,甚至对于内嵌视频元素也是如此。
console.log(`In document :
captureStream : ${inDoc.captureStream}
mozCaptureStream : ${inDoc.mozCaptureStream}
`)
var dyn = document.createElement('video');
console.log(`Dynamic :
captureStream : ${dyn.captureStream}
mozCaptureStream : ${dyn.mozCaptureStream}
`)
<video id="inDoc">
所以为了同时支持 chrome 和 FF :
let stream = video.mozCaptureStream ? video.mozCaptureStream() : video.captureStream();
关于javascript - 动态创建的视频元素上的 captureStream(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45363524/