getUserMedia
ユーザーのマイクにアクセスするために使用する単純な webRTC コードがあります。そのhtmlファイル(ローカルホストに保存)をブラウザにロードすると、ブラウザはマイクアクセス許可を要求しないため、アクセスに失敗します。
しかし、w3schools.com エディター内で同じ html を実行すると、マイクへのアクセス許可が求められ、マイクへのアクセスを許可すると、正常に動作します...
この奇妙な動作はなぜですか?
getUserMedia
ユーザーのマイクにアクセスするために使用する単純な webRTC コードがあります。そのhtmlファイル(ローカルホストに保存)をブラウザにロードすると、ブラウザはマイクアクセス許可を要求しないため、アクセスに失敗します。
しかし、w3schools.com エディター内で同じ html を実行すると、マイクへのアクセス許可が求められ、マイクへのアクセスを許可すると、正常に動作します...
この奇妙な動作はなぜですか?
ファイルシステム (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
セキュリティのため、Chrome はドキュメントを実行するときに WebCam などのユーザー メディアを開きませんfile:/*
。
--disable-web-security
ただし、コマンド ライン オプションを使用して chrome を起動すると、セキュリティ ポリシーをオーバーライドできます。
テストのために、--use-fake-device-for-media-stream
オプションも確認してください。
注: コマンド ライン オプションを指定するときは、chrome/chromium プロセスが実行されていないことを確認してください。
PStest.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
この動作は、Chrome のセキュリティ設定が原因です。
PHP がインストールされていて、Apache やその他のより高度な Web サーバーをセットアップしたくない場合、おそらく最も簡単な方法は、内部 PHP Web サーバーをこの方法で実行することです (Web ファイルが /home/user/web/ にあると仮定します)。 :
php -S 127.0.0.1:3000 -t /home/user/web/
パラメータの説明は次のとおりです。
-S <addr>:<port> Run with built-in web server.
-t <docroot> Specify document root <docroot> for built-in web server.
サーバーを実行したら、ブラウザを起動して次の URL を開きます (テスト ファイルの名前が webrtc.html であると仮定します)。
http://127.0.0.1:3000/webrtc.html
いくつかのトラブルシューティングの提案:
chrome://settings/content をチェックして ([メディア] まで下にスクロール)、そのサイトを誤って常に許可または常に拒否するように選択していないかどうかを確認します。(私は Chrome 26[dev] を使用しています。これは Chrome 24 の別の場所にある可能性があります。)
また、ブラウザを再起動してみてください。私の経験では、この Chrome のビットはまだかなりバグが多く、再起動すると修正されることがあります。
getUserMedia() 呼び出しにエラー ハンドラがあることを確認してください。そこに追加情報があるかもしれません。
file:// のような方法でファイルをロードしていますか? クロムはこれらのファイルへのアクセスをまったく許可せず、リクエストを完全に無視しているようです。自分で試してみたところ、ファイルを開発サーバーにアップロードした後、正常に機能しました。
常に許可するように設定しても、file:// では機能しません。
ローカル サーバーを使用せずに、getUsermedia API を使用する HTML5 をローカルで実行することはできません。WampServer を使用して、HTML5 ファイルを www フォルダー内に配置します。
この答えはクロム用です
Chrome では、--allow-file-access-from-files
フラグを使用して、ローカル ファイルからの Web カメラ アクセスを許可できます。
マック
Mac では、ターミナルを開いて次のように入力できます。
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files /path/to/file.html
/path/to/file.html
あなたのパスで変更
ウィンドウズ
Windows では、ショートカットを作成できます。Google Chrome を右クリックし、メニューで [:] を選択しCopy To -> Desktop (shortcut)
、ショートカットを右クリックして [properties
フラグの追加] をクリックします。
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files C:\path\to\file.html
この回答がお役に立てば幸いです。