¡Hola todos!
Actualmente, estoy trabajando en la implementación de un escáner de código qr para mi aplicación web. Después de algunas pruebas en varios dispositivos, me di cuenta de que tengo que establecer la restricción focusMode para obtener una cámara que tenga la capacidad de enfocar automáticamente el entorno.
Puedo seleccionar directamente la cámara en mi dispositivo de depuración configurando directamente el ID del dispositivo en las restricciones como esta:
let stream = await navigator.mediaDevices.getUserMedia({ video: { deviceId: "332d34c91861f97ba8f0e11f446da4566a1803539764dd67c1dfe036ef32fd97" } }); Al que puedo llamar stream.getVideoTracks()[0].getCapabilities() para obtener las capacidades.
{ aspectRatio: {max: 4000, min: 0.0003333333333333333}, colorTemperature: {max: 7000, min: 2850, step: 50}, deviceId: "332d34c91861f97ba8f0e11f446da4566a1803539764dd67c1dfe036ef32fd97", exposureCompensation: {max: 2, min: -2, step: 0.10000000149011612}, exposureMode: (2) ["continuous", "manual"], exposureTime: {max: 1250, min: 0, step: 0}, facingMode: ["environment"], focusMode: (3) ["manual", "single-shot", "continuous"], frameRate: {max: 30, min: 0}, groupId: "40f2953f5fae495c7471348c844e919762a3213019b271664d220d0aa617313c", height: {max: 3000, min: 1}, iso: {max: 4000, min: 20, step: 1}, resizeMode: (2) ["none", "crop-and-scale"], torch: true, whiteBalanceMode: (2) ["continuous", "manual"], width: {max: 4000, min: 1} }Copiado del registro de la consola de Chromium.
Así que probé las siguientes restricciones a través de la depuración remota Brave (basada en Chromium) en mi Samsung Galaxy A51, de las cuales ninguna funcionó:
let stream = await navigator.mediaDevices.getUserMedia({ video: { focusMode: {exact: ["continuous"]} } }); let stream = await navigator.mediaDevices.getUserMedia({ video: { focusMode: "continuous" } }); let stream = await navigator.mediaDevices.getUserMedia({ video: { focusMode: ["continuous"] } }); let stream = await navigator.mediaDevices.getUserMedia({ video: { advanced: [{focusMode: "continuous"}] } }); let stream = await navigator.mediaDevices.getUserMedia({ video: { advanced: [{focusMode: ["continuous"]}] } }); let stream = await navigator.mediaDevices.getUserMedia({ video: { advanced: [{focusMode: {exact: "continuous"}}] } });No sé si la estructura es correcta y no estoy muy seguro de cómo averiguarlo.
¿Alguien sabe cómo usar la restricción focusMode para obtener un dispositivo que tenga un modo de enfoque continuo?
De: documentación
El proceso funciona así (usando MediaStreamTrack como ejemplo):
Si es necesario, llame a MediaDevices.getSupportedConstraints() para obtener la lista de restricciones admitidas, que le indica qué propiedades restringibles conoce el navegador. Esto no siempre es necesario, ya que los que no se conocen se ignorarán cuando los especifique, pero si tiene alguno que no puede prescindir, puede comenzar comprobando para asegurarse de que esté en la lista. .
Una vez que el script sabe si la propiedad o las propiedades que desea usar son compatibles, puede verificar las capacidades de la API y su implementación examinando el objeto devuelto por el método getCapabilities() de la pista; este objeto enumera cada restricción admitida y los valores o rango de valores admitidos.
Finalmente, se llama al método applyConstraints() de la pista para configurar la API como se desee especificando los valores o rangos de valores que desea usar para cualquiera de las propiedades restringibles sobre las que tiene preferencia.
El método getConstraints() de la pista devuelve el conjunto de restricciones pasadas en la llamada más reciente a applyConstraints(). Es posible que esto no represente el estado actual real de la pista, debido a las propiedades cuyos valores solicitados tuvieron que ajustarse y porque los valores predeterminados de la plataforma son no está representado. Para obtener una representación completa de la configuración actual de la pista, use getSettings().
En Media Stream API, tanto MediaStream como MediaStreamTrack tienen propiedades restringibles.
Probablemente su modo de focusMode sea una configuración predeterminada, que su teléfono descubra por sí mismo. Por lo tanto, debe usar getSettings() para devolver el valor real.
¿Qué está .getSettings() ?