Get maximum video resolution with getUserMedia

后端 未结 7 1108
天命终不由人
天命终不由人 2020-12-13 18:17

I\'m trying to get highest video resolution as possible through JS navigator.getUserMedia. I know about constraints, but don\'t know how to choose right in my c

7条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-13 18:46

    I agree with homm, his approach works fine: https://jsfiddle.net/evpozdniakov/c84ksucw/

    var getUserMediaPrefixed,
        videoStream,
        videoTag;
    
    setGumPrefix();
    
    if (!getUserMediaPrefixed) {
        logMessage('Sorry, your browser doesn\'t support getUserMedia interface');
    }
    else {
        runCamera();
    }
    
    function dealWithStream(stream) {
        videoStream = stream;
    
        if (!videoTag) {
            videoTag = document.createElement('video');
            videoTag.addEventListener('resize', videoEventListener);
        }
    
        videoTag.src = window.URL.createObjectURL(stream);
        videoTag.play();
    }
    
    function handleError(e) {
        if (e.name == 'PermissionDeniedError') {
            logMessage('It looks like you\'ve denied access to the camera.');
        }
        else if (e.name == 'SourceUnavailableError') {
            logMessage('It looks like your camera is used by another application.');
        }
        else {
            logMessage('The camera is unavailable. The error message is: ' +e.message);
        }
    }
    
    function logMessage(msg) {
        var p = document.createElement('p');
    
        p.innerHTML = msg;
    
        document.getElementById('output').appendChild(p);
    }
    
    function runCamera() {
        var constraints = {
            audio: false,
            video: {
                optional: [
                    {minWidth: 320},
                    {minWidth: 640},
                    {minWidth: 800},
                    {minWidth: 900},
                    {minWidth: 1024},
                    {minWidth: 1280},
                    {minWidth: 1920},
                    {minWidth: 2560}
                ]
            }
        };
    
        navigator[getUserMediaPrefixed](constraints, dealWithStream, handleError);
    }
    
    function setGumPrefix() {
        if (navigator.getUserMedia) {
            getUserMediaPrefixed = 'getUserMedia';
        }
        else if (navigator.webkitGetUserMedia) {
            getUserMediaPrefixed = 'webkitGetUserMedia';
        }
        else if (navigator.mozGetUserMedia) {
            getUserMediaPrefixed = 'mozGetUserMedia';
        }
        else if (navigator.msGetUserMedia) {
            getUserMediaPrefixed = 'msGetUserMedia';
        }
    }
    
    function videoEventListener() {
        if (videoTag.videoWidth) {
            logMessage('Best captured video quality in your browser is ' +videoTag.videoWidth+ '×' +videoTag.videoHeight);
    
            // stop stream
            videoStream.stop();
            videoTag.src = '';
        }
    }
    

    In my case, Opera and Chrome offer max resolution 1280×720.

    Firefox gives 640×480 by default, but you can improve his resolution as well up to 1280×720. Here you go:

    enter image description here

提交回复
热议问题