2016-11-07 8 views
0

navigator.mediaDevices.getUserMedia (constraints)를 사용하면 웹캠과 마이크를 비롯한 다양한 장치 용 MediaStream 객체를 얻을 수 있으므로 사용자가 원하는 데이터를 원하는대로 처리 할 수 ​​있습니다.MediaStream 참조는 어디에 저장되어 있습니까?

getUserMedia 메서드는 약속을 반환합니다. 약속은 미디어 스트림을 반환하거나 지정된 제약 조건 (비디오, 오디오 등)에 사용할 수있는 스트림이없는 경우 거부합니다. 스트림 객체를 얻지 만 참조를 저장하지 않으면 MediaStream에 - 가비지 수집기가 제거해야합니다. 그러나 내가 관찰 한 것은 스트림이 제거되지 않는다는 것입니다. 예를 들어 웹캠 용 스트림을 얻으면 스트림에 참조가 남아 있지 않아도 계속 바쁘게 유지됩니다.

질문은 다음과 같습니다. 직접 참조를 저장하지 않으면 MediaStream 객체가 어디에 저장됩니까? 왜 가비지 컬렉터에 의해 제거되지 않습니까? 내 웹캠이 바쁜 이유는 무엇입니까?

+0

? [this fiddle] (https://jsfiddle.net/jib1/qz7qh9h7/)을 사용하면 Firefox와 Chrome에서 약 10 초 후에 카메라의 불빛이 꺼집니다. 주의가 필요한 코드가 있습니까? – jib

답변

1

MediaStream API에는 얻은 MediaStream 인스턴스에 포함 된 각 트랙을 중지해야합니다. 그렇게 할 때까지 미디어 캡처가 계속됩니다.

navigator.mediaDevices 
 
    .getUserMedia({ 
 
    audio: true, 
 
    video: true 
 
    }) 
 
    .then(function (stream) { 
 
    console.log('got stream with id ' + stream.id) 
 
    stream.getTracks().forEach(function (track) { track.stop() }) 
 
    // WebCam will not be busy anymore 
 
    }) 
 
    .catch(function (reason) { 
 
    console.error('capture failed ' + reason) 
 
    })

어떤 브라우저
+0

이 문제가 발생했을 때, getUserMedia가 호출 된 시간을 엉망으로 만든 HTML 비디오 프레임 워크 (videojs)에 몇 가지 기본 메커니즘이 있다고 생각합니다. 그렇게 말하면서, 당신의 포스트는 질문에 대답했다 :) – maxpaj