2013-01-10 24 views
14

Próbuję dowiedzieć się, jaki będzie rozmiar obrazu, który otrzymuję od kamery internetowej za pomocą getUserMedia.Jak mogę uzyskać rozmiar obrazu z kamery internetowej za pomocą getUserMedia?

Teraz w moim MacBooku mam podobno aparat 720p, ale obraz, który otrzymuję, to 640x480. Zakładam, że nie zawsze tak będzie i chciałbym móc obsłużyć jak najwięcej kamer. (Dbam o więcej niż proporcje w stosunku do samego rozmiaru, po prostu chcę się upewnić, że zdjęcia nie są rozciągnięte)

Czy można to zrobić?

Dziękujemy!
Daniel

Odpowiedz

17

Powinieneś być w stanie wykorzystać videoWidth i videoHeight atrybuty, podobnie jak to:

// Check camera stream is playing by getting its width 
video.addEventListener('playing', function() { 
    if (this.videoWidth === 0) { 
     console.error('videoWidth is 0. Camera not connected?'); 
    } 
}, false); 

UPDATE: Właściwie, to działa w Operze, ale nie wydaje się być obsługiwane w Chrome dłużej i Hasn zostało zaimplementowane w Firefoksie (przynajmniej nie w przypadku strumieni wideo). Jest jednak w wersji HTML5 spec, więc mam nadzieję, że jest na mapie drogowej dla tych przeglądarek.

AKTUALIZACJA 2: To działa, ale zdarzeniem, które należy nasłuchiwać, jest "odtwarzanie", a nie "odtwarzanie" (poprawione w powyższym kodzie). Zdarzenie "play" jest uruchamiane po zwróceniu metody play(), natomiast zdarzenie "playing" jest uruchamiane, gdy odtwarzanie faktycznie się rozpoczęło. Testowane w Operze, Chrome i Firefox.

AKTUALIZACJA 3: Firefox 18 wydaje się wielokrotnie uruchamiać zdarzenie "gra", co oznacza, że ​​przeglądarka może zatrzymać się, jeśli wykonujesz dużo kodu w słuchaczu. Lepiej usunąć słuchacza po to zwolniony, tak:

var videoWidth, videoHeight; 
var getVideoSize = function() { 
    videoWidth = video.videoWidth; 
    videoHeight = video.videoHeight; 
    video.removeEventListener('playing', getVideoSize, false); 
}; 

video.addEventListener('playing', getVideoSize, false); 
+0

Tak, widziałem to, ale nie ma go w Chrome ani Firefox ... Jakieś inne pomysły? Dzięki! –

+1

Nie boję się. Teraz przestał działać w Chrome Sam szukam obejścia. Przepraszam, nie mogłem pomóc. – tagawa

+1

Gotowy! Po odrobinie eksperymentów okazuje się, że właściwość videoWidth istnieje dopiero po wystrzeleniu zdarzenia "play" (nie "play"). Zaktualizowano powyższą odpowiedź, aby to pokazać. – tagawa

1

Podłączanie do zdarzenia playing nie działa w Firefoksie (przynajmniej w Firefoksie 26,0 na Ubuntu 12.04 LTS I użytku). Zdarzenie playing jest uruchamiane raz lub dwa razy po rozpoczęciu odtwarzania wideo. videoWidth i videoHeight mają wartość 0 lub nieokreśloną, gdy zostanie wywołane zdarzenie playing. Bardziej niezawodnym sposobem wykrywania videoWidth i videoHeight jest wstrzymywanie i odtwarzanie wideo, które wydaje się działać zawsze. Poniższy fragment kodu działał dla mnie:

//Detect camera resolution using pause/play loop. 
var retryCount = 0; 
var retryLimit = 25; 
var video = $('.video')[0]; //Using jquery to get the video element. 
video.onplaying = function(e) { 
    var videoWidth = this.videoWidth; 
    var videoHeight = this.videoHeight; 
    if (!videoWidth || !videoHeight) { 
     if (retryCount < retryLimit) { 
      retryCount++; 
      window.setTimeout(function() { 
       video.pause(); 
       video.play(); 
      }, 100); 
     } 
     else { 
      video.onplaying = undefined; //Remove event handler. 
      console.log('Failed to detect camera resolution after ' + retryCount + ' retries. Giving up!'); 
     } 
    } 
    else { 
     video.onplaying = undefined; //Remove event handler. 
     console.log('Detected camera resolution in ' + retryCount + ' retries.'); 
     console.log('width:' + videoWidth + ', height:' + videoHeight); 
    } 
};