【问题标题】:WebRTC - Browser doesn't ask for mic access permission for local html fileWebRTC - 浏览器不要求本地 html 文件的麦克风访问权限
【发布时间】:2013-01-14 12:20:55
【问题描述】:

我有一些简单的 webRTC 代码,它使用 getUserMedia 来访问用户的麦克风。现在,当我在浏览器中加载该 html 文件(保存在本地主机)时,浏览器不会请求麦克风访问权限,因此无法访问。

但是当我在 w3schools.com 编辑器中运行相同的 html 时,它会请求麦克风访问权限,并且在允许它访问我的麦克风时,它工作正常...

为什么会出现这种奇怪的行为?

【问题讨论】:

  • E只是为了仔细检查-您是在本地服务器上运行它吗?可以加点代码吗?

标签: webrtc getusermedia


【解决方案1】:

当您直接从文件系统(file:// 前缀)打开 html 文件时,Chrome 将自动阻止 getUserMedia 权限。您必须在本地运行服务器。

我像这样启动了一个 sinatra 服务器:

# server.rb
require 'sinatra'

get '/' do
  File.read('index.html')
end

那就先给吧。

$ gem install sinatra
$ ruby server.rb

http://localhost:4567

【讨论】:

    【解决方案2】:

    出于安全考虑,Chrome 不会打开用户媒体,例如执行file:/* 文档时的网络摄像头。

    您可以通过使用 --disable-web-security 命令行选项启动 chrome 来覆盖安全策略。

    为了测试,还要检查--use-fake-device-for-media-stream 选项。

    注意在指定命令行选项时,请确保没有运行 chrome/chromium 进程。 P.S 试一试,创建一个包含 test.html 的文件

    <!DOCTYPE HTML>
    <video autoplay/>
    <script>
      navigator.webkitGetUserMedia({audio:true,video:true},
        function(stream){
          document.querySelector('video').src =
            URL.createObjectURL(stream);
        });
    </script>
    

    然后杀死所有 chrome 实例并像这样启动 chrome:

     chrome.exe --use-fake-device-for-media-stream --disable-web-security test.html
    

    【讨论】:

      【解决方案3】:

      此行为是由 Chrome 安全设置引起的。

      如果您安装了 PHP,并且不想设置 Apache 或其他更高级的 Web 服务器,可能最简单的方法就是以这种方式运行内部 PHP Web 服务器(假设您的 Web 文件位于 /home/user/网络/):

      php -S 127.0.0.1:3000 -t /home/user/web/

      下面是参数说明:

      -S &lt;addr&gt;:&lt;port&gt; Run with built-in web server.

      -t &lt;docroot&gt; Specify document root &lt;docroot&gt; for built-in web server.

      运行服务器后,启动浏览器并打开此 URL(假设您的测试文件名为 webrtc.html):

      http://127.0.0.1:3000/webrtc.html

      【讨论】:

        【解决方案4】:

        只是一些故障排除建议:

        • 检查 chrome://settings/content(向下滚动到“媒体”),看看您是否不小心选择了始终允许或始终拒绝该站点。 (我在 Chrome 26[dev] 上;这可能位于 Chrome 24 上的其他位置。)

        • 还可以尝试重新启动浏览器 - 根据我的经验,这部分 Chrome 仍然存在相当大的问题,有时重新启动可以修复它。

        • 并确保您的 getUserMedia() 调用中有错误处理程序 - 那里可能有一些其他信息。

        【讨论】:

          【解决方案5】:

          您是否通过类似 file:// 的方式加载文件?似乎 chromium 根本不提供对这些文件的访问权限,并且完全忽略了该请求。我自己试了一下,将文件上传到开发服务器后它工作正常。

          即使将其设置为始终允许,它仍然不适用于 file://。

          【讨论】:

            【解决方案6】:

            如果不使用本地服务器,您将无法在本地运行使用 getUsermedia API 的 HTML5。使用 WampServer 并将您的 HTML5 文件放在 www 文件夹中。

            【讨论】:

              【解决方案7】:

              此答案适用于 chrome

              在 Chrome 中,您可以使用 --allow-file-access-from-files 标志来允许从本地文件访问网络摄像头。

              苹果机

              在 Mac 上,您可以打开终端并输入:

              /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files /path/to/file.html
              

              用你的路径改变/path/to/file.html

              Windows

              在 Windows 中,您可以创建快捷方式。右键谷歌浏览器并在菜单中选择:Copy To -&gt; Desktop (shortcut),然后右键点击快捷方式并点击properties添加标志:

              "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files C:\path\to\file.html
              

              希望这个答案有帮助!

              【讨论】:

                猜你喜欢
                • 2017-12-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-03-06
                • 2018-03-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多