javascript - 动态创建的视频元素上的 captureStream()

标签 javascript firefox webrtc html5-video capturestream

我正在尝试从动态创建的视频元素中捕获流。当我获取视频元素并尝试 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/

相关文章:

javascript - 在 webRTC 中切换摄像头

javascript - 无法在 Firefox 中使 HTML5 视频标签静音

javascript - mapbox-gl:在弹出窗口中显示反向地理编码结果?

javascript - 如何创建一个尽可能低的变量?

javascript - this.href 不返回 href

html - 为什么 valign ="bottom"在 firefox 中不起作用,而在 IE 和 Chrome 中起作用?

firefox - 我无法使用木偶驱动程序和Selenium 3在FireFox 48的下拉列表中选择选项

html - 只有一些图像没有在 Firefox 中显示

javascript - 仅使用 RxJs 重新实现 redux observable?

webrtc - 我需要 TURN 服务器吗?