Jeszcze nie znalazłem żadnych dobrych API, aby uzyskać maksymalną rozdzielczość wideo z getUserMedia.
Ale tu dzielę mój pomysł, aby uzyskać maksymalną obsługiwana rozdzielczość video podłączonego urządzenia za pomocą Binary Search algorytm i wszystko działa świetnie.
Oto kroki do wykonania tej pracy,
- Przechowuj kilka standardowych uchwał w tablicy, zachowując rosnąco zamówienia.
- Zestaw leftIndex = 0 i rightIndex = tablica rozmiarów rozdzielczości.
- Sprawdź midIndex = (lewy + prawy)/2 rozdzielczości obsługiwane lub nie, i modyfikować w lewo i prawo w oparciu o wynik.
Tutaj dzielę się moją realizacji:
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();
}
Wystarczy zadzwonić funkcja FindMaximum_WidthHeight_ForCamera(). Po zakończeniu operacji maksymalna rozdzielczość wideo zostanie zapisana w zmiennych wybranychWidth i selectedHeight. Ja tu również dołączenie wyjścia konsoli do mojego urządzenia:
//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
Ja testowałem tej implementacji korzystając Chrome w wersji 57.0.2987.110 (64-bit) i Logitech Webcam C270, Inc.. Ale myślę, że to rozwiązanie powinno działać w każdym scenariuszu. Dziękuję Ci.
Czy widziałeś [ten błąd?] (Https://code.google.com/p/chromium/issues/detail?id=312928) – Martin
to zabawne, gdy zażądam rezolucji, która jest zbyt duża, dostaję "ConstraintNotSatisfiedError" i żaden film nie jest zwracany – Michael