Get maximum video resolution with getUserMedia

后端 未结 7 1057
天命终不由人
天命终不由人 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条回答
  • 2020-12-13 18:58

    Still I haven't found any good API to get maximum video resolution with getUserMedia.

    But here I am sharing my idea to get maximum supported video resolution of the connected device using Binary Search algorithm and it's working great.

    Here are the steps to do this job,

    • Store some standard resolutions in an Array, maintaining ascending order .
    • Set leftIndex = 0 and rightIndex = size of resolution array.
    • Check midIndex = (left+right)/2 resolution supported or not, and modify left and right based on the result.

    Here I am sharing my implementation:

    var ResolutionsToCheck = [
                    {width: 160, height:120},
                    {width: 320, height:180},
                    {width: 320, height:240},
                    {width: 640, height:360},
                    {width: 640, height:480},
                    {width: 768, height:576},
                    {width: 1024, height:576},
                    {width: 1280, height:720},
                    {width: 1280, height:768},
                    {width: 1280, height:800},
                    {width: 1280, height:900},
                    {width: 1280, height:1000},
                    {width: 1920, height:1080},
                    {width: 1920, height:1200},
                    {width: 2560, height:1440},
                    {width: 3840, height:2160},
                    {width: 4096, height:2160}
                ];
    
    var left = 0;
    var right = ResolutionsToCheck.length;
    var selectedWidth;
    var selectedHeight;
    var mid;
    
    function FindMaximum_WidthHeight_ForCamera()
    {
        console.log("left:right = ", left, ":", right);
        if(left > right)
        {
            console.log("Selected Height:Width = ", selectedWidth, ":", selectedHeight);
            return;
        }
    
        mid = Math.floor((left + right) / 2);
    
        var temporaryConstraints = {
            "audio": true,
            "video": {
                "mandatory": {
                "minWidth": ResolutionsToCheck[mid].width,
                "minHeight": ResolutionsToCheck[mid].height,
                "maxWidth": ResolutionsToCheck[mid].width,
                "maxHeight": ResolutionsToCheck[mid].height
                },
            "optional": []
            }
        }
    
        navigator.mediaDevices.getUserMedia(temporaryConstraints).then(checkSuccess).catch(checkError);
    }
    
    function checkSuccess(stream)
    {
        console.log("Success for --> " , mid , " ", ResolutionsToCheck[mid]);
        selectedWidth = ResolutionsToCheck[mid].width;
        selectedHeight = ResolutionsToCheck[mid].height;
    
        left = mid+1;
    
        for (let track of stream.getTracks()) 
        { 
            track.stop()
        }
    
        FindMaximum_WidthHeight_ForCamera();
    }
    function checkError(error)
    {
        console.log("Failed for --> " + mid , " ", ResolutionsToCheck[mid],  " ", error);
        right = mid-1;
    
        FindMaximum_WidthHeight_ForCamera();
    }
    

    Just call function FindMaximum_WidthHeight_ForCamera(). When operation will be completed then maximum video resolution will be stored in selectedWidth and selectedHeight variables. Here I am also attaching console output for my device:

    //Console Output
    left:right =  0 : 17
    Success for -->  8   Objectheight: 768width: 1280__proto__: Object
    left:right =  9 : 17
    Failed for --> 13   Objectheight: 1200width: 1920__proto__: Object   NavigatorUserMediaError
    left:right =  9 : 12
    Success for -->  10   Objectheight: 900width: 1280__proto__: Object
    left:right =  11 : 12
    Failed for --> 11   Objectheight: 1000width: 1280__proto__: Object   NavigatorUserMediaError
    left:right =  11 : 10
    Selected Height:Width =  1280 : 900
    

    I have tested this implementation using Chrome Version 57.0.2987.110 (64-bit) and Logitech, Inc. Webcam C270. But I think this solution should work in each scenario. Thank You.

    0 讨论(0)
提交回复
热议问题