JavaScript関数を使用してWebカメラを閉じようとしています(Ajax応答を受け取った後で閉じる必要があります)が、ページを更新しないと閉じることができないようです。それを閉じるためのすべてのメソッドは、video.src = null、video.pause ...など、どのブラウザでも機能しません。ユニークな方法は、成功関数のパラメーターとして渡されたストリームを閉じることです。そのため、関数成功の外部でこのオブジェクトを使用してWebカメラを閉じる方法はありますか?
私はこの質問が以前に行われたことを知っています( getUserMediaとRTCPeerConnectionを使用してWebカメラを停止/閉じるChrome 25 ))私のニーズは異なるため、いくつかの助けが必要ですこの問題を解決するために
ありがとう!
編集:ウェブカメラを閉じようとしている私の作業コード:
navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia || navigator.msGetUserMedia;
if(navigator.getUserMedia){
var video_constraints = {
mandatory: {
maxHeight: 480,
maxWidth: 640
},
optional: []
};
var self = this;
self.navigator.getUserMedia({
audio: false,
video: video_constraints
}, self.onSuccess, onError);
}
else{
alert('An error has occurred starting the webcam stream, please revise the instructions to fix the problem');
}
function onSuccess(stream) {
var video = document.getElementById('webcam');
if(navigator.webkitGetUserMedia || navigator.mozGetUserMedia){
video.src = window.URL.createObjectURL(stream);
}
else if(navigator.msGetUserMedia){
//future implementation over internet Explorer
}
else{
video.src = stream;
}
self.localStream = stream;
video.play();
}
function onError() {
alert('There has been a problem retrieving the streams - did you allow access?');
}
function closeWebcamConnection(){
this.localStream.stop();
}
uff ..ここにコードXDを投稿するのは本当に複雑です
stop()
メソッドを実行して、LocalMediaStream
オブジェクトを停止する必要があります。同様の問題がありました。あなたがする必要があるのは:
getUserMedia()
実行のonSuccessコールバック関数でLocalMediaStream
への参照を保持します。
var localStream;
onUserMediaSuccess = function(stream) {
// attach to a video element
...
// keep a reference
localStream = stream;
};
必要に応じてLocalMediaStreamを停止します。
localStream.stop();
Asgothが示唆するようにLocalMediaStream
への参照を保存することは正しいですが、私にとってはChrome 47. localStream.stop();
でエラーが発生しました:
Uncaught TypeError: localStream.stop is not a function
私はそれを呼び出すことで動作させました:
localStream.getVideoTracks()[0].stop();
asgoth's answer への追加
localStream.stop()はChrome 45で廃止予定、Chrome 47で削除
複数の場所から.stop()を呼び出す場合は、stop関数の次のヘルパーを使用して、ロジックを1つの場所に保持できます。
var localStream;
onUserMediaSuccess = function(stream) {
// re-add the stop function
if(!stream.stop && stream.getTracks) {
stream.stop = function(){
this.getTracks().forEach(function (track) {
track.stop();
});
};
}
// attach to a video element
...
// keep a reference
localStream = stream;
};
Chrome 49)でビデオストリームトラック(前面カメラ)を閉じて別のトラック(背面カメラ)を開くときに問題が発生しました。MediaStream.stop()
がバージョン45以降廃止され、MediaStreamTrack.stop()
に置き換えられました。詳細については、Sam DuttonがGoogleの開発者サイトで posting を参照してください。
これはChromeのバグのある領域のようで、動作は常に変化しています。これは、http(httpsではない)で接続している場合にのみ機能するようです。
var myStream;
function successCallback( stream ) {
...
myStream = stream; // used to close the stream later
}
function closeStream(){
myStream.stop();
myStream = null;
}
不思議な理由で、これはSSL(https)では機能しません(Chrome、Ver 27 Devで確認))
ブラウザのタブにある赤い記号を取り除き、両方を無効にするために、これらのエラーの1つを受け取ったときにvideoおよびaudioストリーム
Uncaught TypeError: localStream.stop is not a function
Uncaught TypeError: _webRTCStream.stop is not a function // TokBox, OpenTok
見つかったトラックを繰り返し処理して、すべてを停止します。
if (_webRTCStream.stop) {
_webRTCStream.stop() // idk what this does, left here for legacy reasons..?
} else {
_webRTCStream.getTracks().forEach(function(track) { track.stop() })
}
注:_webRTCStream
はlocalStream
と同じです。使用しているライブラリによって異なります。