标签: mediadevices

Navigator.MediaDevices.getUserMedia()使用了哪些相机通信标准?

有谁知道用于检测摄像头硬件的通信标准是否与getUserMedia一起使用?

我认为它是MTP或类似的东西,虽然我希望每个浏览器/操作系统的实现都不同,但我已经搜索了两天,我找不到任何有关此问题的可靠信息.

javascript webrtc mediadevices

11
推荐指数
1
解决办法
249
查看次数

MediaDevices.getUserMedia() 如何设置音频约束(采样率/位深度)?

使用浏览器Web API,我想设置适合录制音频语音(语音消息)的MediaDevices.getUserMedia 约束属性,例如设置这些参数:

  • 单核细胞增多症
  • 16位
  • 16KHz

这是我的代码:

   const mediaStreamConstraints = {
       audio: {
         channelCount: 1,
         sampleRate: 16000,
         sampleSize: 16,
         volume: 1
       },

       video: false
   }

   navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
     .catch( err => serverlog(`ERROR mediaDevices.getUserMedia: ${err}`) )
     .then( stream => {

        // audio recorded as Blob 
        // and the binary data are sent via socketio to a nodejs server
        // that store blob as a file (e.g. audio/inp/audiofile.webm)

      } )

Run Code Online (Sandbox Code Playgroud)

录制的剪辑被抓取并存储(使用MediaRecorderAPI),最终发送到 Nodejs 服务器,其中 blob 被保存为文件并进行处理(该应用程序是一个语音机器人)。

出现问题,WebM 保存的文件没有所需的参数:

$ mediainfo audio/inp/audiofile.webm
General …
Run Code Online (Sandbox Code Playgroud)

browser audio audio-recording getusermedia mediadevices

8
推荐指数
2
解决办法
1万
查看次数

在不打开相机的情况下请求相机许可

每当我接受在浏览器上使用摄像头的权限时,我的桌面摄像头就会亮起。我认为这是因为 navigator.mediaDevices.getUserMedia() 在成功时返回一个流,并且该流直接来自相机。

我不希望在接受许可后立即从相机流。

有没有一种方法可以让我无需“立即”使用相机来请求许可。我稍后会使用相机。

javascript mediadevices

7
推荐指数
1
解决办法
3126
查看次数

使用 MediaDevices API 的 getDisplayMedia() 的完整网页屏幕截图

我正在使用 navigator.mediaDevices.getDisplayMedia 来获取屏幕截图,但它只捕获页面的可见部分,但还有更多内容隐藏在滚动区域中并且被错过。那么是否可以捕获整个页面呢?

   function getDisplayMedia(options) {
        if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
            return navigator.mediaDevices.getDisplayMedia(options)
        }
        if (navigator.getDisplayMedia) {
            return navigator.getDisplayMedia(options)
        }
        if (navigator.webkitGetDisplayMedia) {
            return navigator.webkitGetDisplayMedia(options)
        }
        if (navigator.mozGetDisplayMedia) {
            return navigator.mozGetDisplayMedia(options)
        }
        throw new Error('getDisplayMedia is not defined')
    }

    async function takeScreenshotStream() {
        const width = screen.width * (window.devicePixelRatio || 1)
        const height = screen.height * (window.devicePixelRatio || 1)

        const errors = [];
        let stream;
        const mediaStreamConstraints = {
            audio: false,
            video: {
                width,
                height,
                frameRate: 1,
            },
        };

        try …
Run Code Online (Sandbox Code Playgroud)

javascript screenshot mediadevices get-display-media

7
推荐指数
0
解决办法
1899
查看次数

MediaDevices.enumerateDevices() 通过文件协议访问时未显示所有媒体设备?

index.html列出所有媒体设备是

<!DOCTYPE html>
<html>

<body>
    <script>
        (async () => {
            await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
            let devices = await navigator.mediaDevices.enumerateDevices();
            console.log(devices);
        })();
    </script>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

当我index.html通过文件协议访问它时,file:///some-path/index.html我只看到很少的设备也没有标签。

[
    {
        "deviceId": "",
        "kind": "audioinput",
        "label": "",
        "groupId": "a71e32bec65bc4788683c156cfbc3c005bce4535b980209e4a455973bd93f36a"
    },
    {
        "deviceId": "",
        "kind": "videoinput",
        "label": "",
        "groupId": "03e0a9c9e71757f81bef3f3a74c4a56785b2d3d103a7de883101e509c233977f"
    },
    {
        "deviceId": "",
        "kind": "audiooutput",
        "label": "",
        "groupId": "a71e32bec65bc4788683c156cfbc3c005bce4535b980209e4a455973bd93f36a"
    }
]
Run Code Online (Sandbox Code Playgroud)

index.html但是当我通过http 协议访问它时,我看到了http://localhost/index.html所有设备

[
    {
        "deviceId": "default",
        "kind": …
Run Code Online (Sandbox Code Playgroud)

html javascript file-uri webrtc mediadevices

7
推荐指数
1
解决办法
1613
查看次数

检查是否通过`getDisplayMedia`捕获浏览器/平台支持的屏幕

我们可以通过将媒体流请求到屏幕或Windows navigator.mediaDevices.getDisplayMedia()。但是,这立即提示用户决定要使用哪种捕获。我需要检查浏览器/平台是否支持屏幕捕获。

当然,可以检查'getDisplayMedia' in navigator.mediaDevices,但这只是告诉我们浏览器是否支持该API。特别是在FF和Android上的Chrome上,已定义了API并且可以调用该API getDisplayMedia(),但它总是立即返回NotAllowedError错误(这是可以预期的:根据caniuse的说法,移动浏览器尚不支持getDisplayMedia。)

接下来,我尝试检查navigator.mediaDevices.getSupportedConstraints()。但是,我的移动FF返回与桌面FF完全相同的对象。尤其navigator.mediaDevices.getSupportedConstraints().mediaSourcetrue在这两种情况下。最后,返回的数据navigator.mediaDevices.enumerateDevices()也无济于事。我只能得到无法以任何方式解释的设备和组ID(对吗?)。

是否可以getDisplayMedia事先检测是否支持通过屏幕捕获?

注意此问答似乎相当相似,但getUserMedia已经相当久远了)

javascript getusermedia mediadevices get-display-media

6
推荐指数
1
解决办法
79
查看次数

如何获取扬声器输出的媒体流以通过网络传输或记录它?

我正在尝试获取扬声器的输出,然后使用此流做任何我想做的事情。

我试图用它来获取演讲者的流:

var mySpeakerStream = new MediaStream();
navigator.mediaDevices.getUserMedia({audio: {deviceId : {exact: mySpeakerId} } }).then(s => {        
        myStream.addTrack(s.getAudioTracks()[0]);
}).catch( console.log('failed') );
Run Code Online (Sandbox Code Playgroud)

我希望得到扬声器,但我没有,然后我意识到 getUserMedia 方法只返回输入设备的 MediaStream。有没有办法获得扬声器输出的流?

javascript media mediadevices

5
推荐指数
2
解决办法
2025
查看次数

如何在 FireFox 中检查访问麦克风的权限是否已被用户拒绝

有没有办法查明用户是否拒绝或允许访问 Firefox 中的媒体设备(例如:麦克风、相机)?。在 Chrome 中,我可以使用 navigator.permissions.query 进行检查,但这在 Firefox 中失败并显示“TypeError”。

navigator.permissions.query({name:"microphone"}).then(function(promise) {
   if ( promise && promise.state ) {
      console.log(promise.state); //"granted", "prompt" or "rejected"
    }
});
//in Firefox, It throws the error "TypeError: 'name' member of PermissionDescriptor '' is not a valid value for enumeration PermissionName"
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我无法使用 try catch 块捕获上述错误。所以我想知道为什么我无法在 try catch 块中捕获此错误以及是否有替代方法。

用例

我的应用程序具有语音识别功能。在用户遇到寻求访问麦克风的实际“系统对话框”之前,我需要显示“预先权限弹出”。这种“预许可弹出”背后的想法是向用户提供应用程序需要访问权限的上下文。如果用户已经授予/拒绝访问权限,则不需要预先许可弹出窗口。所以我需要检查麦克风的权限状态并在需要时显示弹出窗口。

html javascript firefox getusermedia mediadevices

5
推荐指数
1
解决办法
1988
查看次数

Javascript DOMException:关联的 Track 处于无效状态

我正在尝试在 nodeJS 服务器上创建照片捕获 Web 应用程序,并且我正在使用下面的javascript代码。

const btn = document.querySelector('#btn');

btn.addEventListener('click', (event) => {
 navigator.mediaDevices.getUserMedia({video: true})
  .then(gotMedia)
  .catch(error => console.error('getUserMedia() error:', error));

  event.preventDefault()
})
Run Code Online (Sandbox Code Playgroud)

而gotMedia函数是这样的:

function gotMedia(mediaStream) {
    const mediaStreamTrack = mediaStream.getVideoTracks()[0];
    const imageCapture = new ImageCapture(mediaStreamTrack);
    console.log(imageCapture);

    const canvas = document.querySelector('canvas');
    // ...
    imageCapture.grabFrame()
    .then(imageBitmap => {
        canvas.width = imageBitmap.width;
        canvas.height = imageBitmap.height;
        canvas.getContext('2d').drawImage(imageBitmap, 0, 0);
    })
    .catch(error => console.error('grabFrame() error:', error));
}
Run Code Online (Sandbox Code Playgroud)

一切正常,图像捕捉正常,但是当我一张又一张地快速拍摄照片时,出现错误,提示:

grabFrame() 错误:DOMException:关联的 Track 处于无效状态。

当我拍摄太多照片时(例如快速单击约 20 秒以上),通常会发生这种情况,但前五张快照也会发生这种情况。有谁知道发生了什么事以及我应该改变什么才能解决这个问题?感谢您的时间。

javascript domexception mediadevices

5
推荐指数
2
解决办法
4965
查看次数

视频 mediaDevices.getUserMedia 缩放在 iOS 中不起作用

我正在实现zxing-js来扫描二维码。我的任务是在使用相机时启用变焦。它在 Android 设备上的 Chrome 中运行良好,但当我尝试在 iOS 上使用它时,它不起作用。

下面是我的代码:

navigator.mediaDevices.getUserMedia(environment).then(async mediaStream => {
    document.querySelector('video').srcObject = mediaStream;

    await sleep(1000);

    const track = mediaStream.getVideoTracks()[0];
    const capabilities = track.getCapabilities();
    const settings = track.getSettings();

    const input = document.querySelector('input[type="range"]');

    // Check whether zoom is supported or not.
    if (!('zoom' in capabilities)) {
        return $(log).html('Zoom is not supported by ' + track.label);
    }

    // Map zoom to a slider element.
    input.min = capabilities.zoom.min;
    input.max = capabilities.zoom.max;
    input.step = capabilities.zoom.step;
    input.value = settings.zoom;
    input.oninput = function(event) …
Run Code Online (Sandbox Code Playgroud)

javascript getusermedia mediadevices

5
推荐指数
1
解决办法
3984
查看次数