将对navigator.mediaDevices.getUserMedia的支持添加到Dart

问题描述 投票:0回答:1

Dart SDK尚不支持MediaDevices类中的某些方法,包括getUserMedia https://github.com/dart-lang/sdk/issues/35253。对于Chrome和Firefox之类的浏览器,这样做还可以,因为仍然可以直接在window.navigator对象上找到基于早期基于回调的getUserMedia实现。但是使用Safari(我认为它是最近才实现此功能的),仅支持返回诺言的较新MediaDevices变体。

我正在努力弄清楚如何将此方法添加到Dart的现有MediaDevices类中,以便它可以调用本机javascript函数,处理所产生的Promise并将成功传递的结果转换回Dart MediaStream对象。

[这里有一篇老文章似乎很有希望,但是我无法使该示例现在成功运行,并且怀疑它与Dart 2+无关,或者与Dart类已经存在无关(这就是我得到的错误的意思。 )。 Dart JS Interop 0.6.0 and JS Promises - resolving

我最接近成功的是回到Dart较旧的JsObject互操作方法。我可以调用getUserMedia方法并接收一个Promise对象,但是当前它总是失败,并显示一个错误,指出我必须请求音频或视频。因此我的参数语法或如何将其转换为JS都有问题:

JsObject jsObj = context['navigator']['mediaDevices'];
JsObject promise = jsObj.callMethod("getUserMedia", 
    [{'audio': true, 'video': false}]);
promise.callMethod('then', [
    (_){ 
        completer.complete(true); 
        print('success...'); 
    }, 
    (e){ 
        completer.complete(false); 
        print('fail...'); 
    }
]);

但是,即使我超越了这一点,我仍然看不到如何将结果转换回Dart MediaStream对象。有人知道这样的信息可用于填写缺少的SDK片段吗?

dart safari getusermedia
1个回答
0
投票

这是一种解决方法。我没有让Dart与navigator.mediaDevices.getUserMedia正确连接,而是将getUserMedia的回调实现添加到了导航器对象(如果尚不存在)(即Safari)。它依次在mediaDevices对象上调用基于promise的版本。

<script>
    if (navigator.getUserMedia == undefined && navigator.mediaDevices.getUserMedia){
        navigator.getUserMedia = function(constraints, success, error){
            navigator.mediaDevices.getUserMedia({audio: true, video: false})
            .then((mediaStream) => {
                success(mediaStream);
            })
            .catch((err) => {
                error(err);
            });
        };
    }
</script>
© www.soinside.com 2019 - 2024. All rights reserved.