问题标签 [mediadevices]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 检测设备限制的解除
使用getUserMedia让用户选择麦克风。此外,我使用enumerateDevices创建一个带有设备的选择,以便用户可以从 UI 更改设备。
我在 Firefox 上,还没有检查其他浏览器的表现,但至少对于 FF,我还没有找到解决方案。
如果用户在被询问时选择不允许访问,则在用户删除限制之前不要再次询问[1] :
问题是是否有办法检测用户何时取消限制?
场景通常是:
- 用户加载页面并被要求选择输入设备
用户拒绝
/li>用户取消限制(如上图)
/li>
(显然)没有办法通过 Java 脚本从客户端重置块,但是有没有办法检测到用户撤销了块?(或者有吗?听起来像是可以被利用来保持循环访问请求的东西。)
可以做一个循环,在页面的整个生命周期内不断尝试,但希望避免这种情况。正在为此寻找活动。
在这方面,ondevicechange不会在删除块时触发事件 - 这在某种程度上是合乎逻辑的,因为可用设备没有变化,以某种方式:P。
[ 1 ]那就是:一个人可以问,但结果是:
MediaStreamError
消息:在当前上下文中,用户代理或平台不允许该请求。
名称: NotAllowedError </p>
webrtc - 我可以将 IP 网络摄像机模拟为 Chromium 检测到的媒体设备吗?
我有一个基于 Chromium 浏览器的 WebRTC 解决方案,它使用本地设备摄像头。然而,这些摄像机安装在很远的地方,无法通过 USB 连接到任何 PC。它们可以通过以太网电缆连接到 LAN。
有没有办法将相机模拟为本地媒体设备,以便 navigator.mediaDevices.enumerateDevices 识别它们?我可以更改代码或使用任何 API 来检测 IP 摄像机吗?任何指针都会非常有帮助。
我尝试了以下选项:
1. 在 Windows 设置中添加设备。没有工作,因为它需要特定的 Windows Insider 更新。
2. IP Camera Adapter、ManyCam、iSpy 不工作,因为它们都支持 HTTP。我的高清摄像机只支持 RTMP 协议。
javascript - 如何检测具有视频和音频约束的 getUserMedia 是否有音频?
我想检测,在 JavaScript 的视频标签中显示媒体流时是否有任何音频。我为将网络摄像头流显示到视频标签所做的工作如下,现在我想检测用户是否说了什么?我怎么能检测到呢?谁能帮我解决这个问题?
javascript - Android Chrome 使用 JavaScript 从前置摄像头切换到后置摄像头
我无法正确弄清楚这一点,或者是否可以切换相机。
我曾尝试在第二次调用 getUserMedia 之前停止视频轨道,希望停止视频轨道会关闭前置摄像头,以便后置摄像头可以打开,但它只是不起作用。
我还需要做些什么才能在手机上切换摄像头吗?这甚至可能吗?
safari - safari 13.1 navigator.mediaDevices.enumerateDevices() 仅返回音频设备
我在桌面 Safari 13.1 版本上遇到问题。如果我在网络检查器中打开控制台(使用带有网络摄像头和麦克风的常规 macbook)并在任何类型的网站上执行此命令:
navigator.mediaDevices.enumerateDevices()
第一次它会在 Promise 结果中返回一个视频输入和一个音频输入。第二次它只会返回 2 个音频输入。视频输入消失。
不幸的是,我在检查解决方案上的可用设备时多次调用此方法。
知道为什么会发生这种情况吗?即使我不止一次调用它,我如何才能获得有关设备的准确信息? 在这里查看结果
javascript - 如何以秒为单位(在 js 程序中)查找 webm(opus)音频文件的持续时间?
在 javascript 网页上,我使用 HTML5 Media API 生成音频消息,然后通过 socketio 将其发送到 nodejs 服务器,该服务器将文件保存在磁盘上。这一切都有效。
Javascript块,客户端:
服务器端我成功保存了 webm/opus 文件:
使用 vlc 播放器,我看到以秒为单位的持续时间几乎是 28 秒。
让我们检查一下 mediainfo / ffmpeg:
使用mediainfo
:
使用ffmpeg
:
我的问题是:
如何在节点服务器日志文件上跟踪服务器端 webm 音频文件的长度(以秒为单位)?
我需要有文件的近似持续时间(以秒为单位)。可能使用 nodejs 函数。
运行时的一个糟糕/粗略的解决方案可能是凭经验将文件的字节长度与以秒为单位的长度进行映射……例如,对于特定的编码/格式:1000 字节 ~= 1 秒。
有什么更好的方法来测量音频文件的持续时间,可能在 nodejs 代码中?
javascript - 视频 mediaDevices.getUserMedia 缩放在 iOS 中不起作用
我正在实现zxing-js来扫描二维码。我的任务是在使用相机时启用缩放。它在 Android 设备上的 Chrome 中运行良好,但是当我尝试在 iOS 上使用它时它不起作用。
下面是我的代码:
当我检查capabilities
使用 iOS 设备时,该zoom
属性不在列表中。关于如何解决这个问题的任何想法?
太感谢了!
audio - MediaDevices.getUserMedia() 如何设置音频约束(采样率/位深度)?
使用浏览器 Web API,我想设置MediaDevices.getUserMedia
约束属性,适合录制音频语音(语音消息),例如设置这些参数:
- 单核细胞增多症
- 16位
- 16KHz
这是我的代码:
录制的剪辑被抓取并存储(使用MediaRecorder
API),最终发送到 nodejs 服务器,在那里将 blob 保存为文件并进行处理(应用程序是语音机器人)。
出了点问题,WebM 保存的文件没有所需的参数:
例如
但是约束意味着不同的值:
Audio(audioUrl(blob)).play()
同样,用 anew 播放的blob也不播放。诡异的。但是,如果约束只是:
我检查了浏览器控制台,没有看到任何navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
API 调用错误。
顺便说一句,我在这里遵循了指导方针:
- https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
- https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
请注意,我的用户代理是:(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
我使用的是最后一个 Brave 浏览器版本)。
在我看来,浏览器不允许的任何音频约束设置:
- 破坏了音频斑点,
- 没有引发错误异常(我同时捕获了
navigator.mediaDevices.getUserMedia()
和new MediaRecorder(...)
。这不是最后一个错误吗?
我的问题是:
有什么方法可以根据要求获得采样率/位深度?
或者音频格式是“硬编码”/由浏览器实现决定的?
顺便说一句,音频参数格式的原因是因为我想最小化音频 blob 大小以最小化浏览器客户端和服务器之间的 websocket 通信中的带宽,优化语音(语音消息)的音频 blob 交换
javascript - Safari 上的音频输出设备数组的长度为 0
我正在开发一个利用 Amazon Chime 的视频会议应用程序。我已经关注了Amazon Chime SDK JS的 npm 页面,并设法获得了服务器响应并初始化了 meetingSession。但是,问题是当我尝试获取音频输出设备数组时,它在 Safari 上是长度为零的数组,而在 Chrome 和 Firefox 等浏览器中,它工作得很好,并且我得到了一个非零长度的数组。我该如何解决这个问题?
到目前为止,这是我编写的代码:
当我在控制台中记录上述数组的长度时,audioOutputDevices
数组的长度在 Safari 中为零,而在其他浏览器中则为非零。
javascript - 您的浏览器不支持 navigator.getUserMedia 接口
我尝试将已弃用的 navigator.getUserMedia() 更改为 navigator.mediaDevices.getUserMedia() 但似乎没有任何效果。界面显示我的浏览器不支持 navigator.getUserMedia() 这样做的想法是让我的浏览器提示我的网络摄像头,但它似乎不起作用。有什么帮助吗?
[这是输出][1] [1]:https://i.stack.imgur.com/s2QMx.png