【问题标题】:Displaying MediaStream with Knockout使用 Knockout 显示 MediaStream
【发布时间】:2017-05-28 15:24:22
【问题描述】:

我正在处理媒体流 - https://developer.mozilla.org/en-US/docs/Web/API/MediaStream

我正在尝试以下方法:

<video data-bind="attr: {src: displayedDeviceSession().stream()}"></video>

但是视频没有显示。我看到了这个:

<video data-bind="attr: {src: displayedDeviceSession().stream()}" src="[object MediaStream]"></video>

我也试过 srcObject 属性无济于事(https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject)。是否可以利用挖空显示动态媒体流?

【问题讨论】:

    标签: knockout.js webrtc


    【解决方案1】:

    使用计算来显示视频流

     <video id="displayedDeviceSessionVideo"></video>
    

    这被添加到流属性所在的模型中:

    self.stream = ko.observable();
    
    self.streamWatch = ko.computed(function () {
        var video = document.getElementById("displayedDeviceSessionVideo");
        if (self.stream() != null) {
            // Start Stream
            video.srcObject = self.stream();
    
        } else {
           // Stop
        }
    }, self);
    

    我相信你所做的是正确的,但复杂的内联html,因此在js模型本身中使用knockout的力量。

    如果视频最初没有渲染,那么为什么不使用&lt;video onloadstart="loadStream()"&gt;

    function loadStream() {
        var video = document.getElementById("displayedDeviceSessionVideo");
        if (viewModel.stream() != null) {
            // Start Stream
            video.srcObject = viewModel.stream();
    
        } else {
           // Stop
        }
    }
    

    当浏览器开始寻找指定的音频/视频时,会发生 loadstart 事件。这是加载过程开始的时候。

    重构代码,使其在一处并计算后仍会在更改时更新流。

    尚未对此进行测试,但理论上这也应该有效,因此所有淘汰赛:

     <video data-bind="event: { onloadstart: loadStream }">
    

    型号:

    self.stream = ko.observable();
    
    self.loadStream = function () {
        var video = document.getElementById("displayedDeviceSessionVideo");
        if (self.stream() != null) {
            // Start Stream
            video.srcObject = self.stream();
         } else {
           // Stop
         }
    }
    
    self.streamWatch = ko.computed(function () {
        var stream = self.stream();
        self.loadStream();
    }, self);
    

    【讨论】:

    • 这种方法唯一让我担心的是视频元素在流更新时是否不可见。我希望有一些方法可以绑定元素以避免这种情况......这里需要自定义绑定吗?
    • 你写这个很有趣,我最后有一个额外的位说,这取决于元素在那里等。你可以添加额外的逻辑,即。流.valueHasMutated()。但只有在动态添加视频元素或其包装在淘汰赛ifs 中时才需要这个?
    • 是的 - 我有模板加载动态呈现包含我的 video 元素的 html。将 hasMutated 绑定到我所有的 observables 并将其引入我的模板逻辑是一种解决方案,但并不是我对它感到兴奋(维护、可读性、优雅等)。
    • 是的,我也不会对此感到兴奋,请参阅编辑。
    • 我最终使用了data-bind="template: {afterRender: loadStream}"
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 2015-05-07
    • 2016-03-27
    • 1970-01-01
    • 2013-06-23
    • 2012-06-24
    • 2014-08-08
    • 2016-07-11
    相关资源
    最近更新 更多