有谁知道用于检测摄像头硬件的通信标准是否与getUserMedia一起使用?
我认为它是MTP或类似的东西,虽然我希望每个浏览器/操作系统的实现都不同,但我已经搜索了两天,我找不到任何有关此问题的可靠信息.
使用浏览器Web API,我想设置适合录制音频语音(语音消息)的MediaDevices.getUserMedia 约束属性,例如设置这些参数:
这是我的代码:
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) 每当我接受在浏览器上使用摄像头的权限时,我的桌面摄像头就会亮起。我认为这是因为 navigator.mediaDevices.getUserMedia() 在成功时返回一个流,并且该流直接来自相机。
我不希望在接受许可后立即从相机流。
有没有一种方法可以让我无需“立即”使用相机来请求许可。我稍后会使用相机。
我正在使用 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) 我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) 我们可以通过将媒体流请求到屏幕或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().mediaSource是true在这两种情况下。最后,返回的数据navigator.mediaDevices.enumerateDevices()也无济于事。我只能得到无法以任何方式解释的设备和组ID(对吗?)。
是否可以getDisplayMedia事先检测是否支持通过屏幕捕获?
(注意:此问答似乎相当相似,但getUserMedia已经相当久远了)
我正在尝试获取扬声器的输出,然后使用此流做任何我想做的事情。
我试图用它来获取演讲者的流:
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。有没有办法获得扬声器输出的流?
有没有办法查明用户是否拒绝或允许访问 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 块中捕获此错误以及是否有替代方法。
用例
我的应用程序具有语音识别功能。在用户遇到寻求访问麦克风的实际“系统对话框”之前,我需要显示“预先权限弹出”。这种“预许可弹出”背后的想法是向用户提供应用程序需要访问权限的上下文。如果用户已经授予/拒绝访问权限,则不需要预先许可弹出窗口。所以我需要检查麦克风的权限状态并在需要时显示弹出窗口。
我正在尝试在 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 秒以上),通常会发生这种情况,但前五张快照也会发生这种情况。有谁知道发生了什么事以及我应该改变什么才能解决这个问题?感谢您的时间。
我正在实现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) mediadevices ×10
javascript ×9
getusermedia ×4
html ×2
webrtc ×2
audio ×1
browser ×1
domexception ×1
file-uri ×1
firefox ×1
media ×1
screenshot ×1