Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

363
Vistas
Camera stream not loading on all devices with maximum quality requirements (HTML/Angular)

I'm developing an application in Angular to capture a photo with the maximum possible quality depending on the device's camera.

Currently, I have this code:

HTML:

<video #video id="video" autoplay muted playsinline></video>

Angular TS:

_requestCameraStream(width: number, height: number, secondTry: boolean) {
    if (navigator.mediaDevices.getUserMedia)
    {
      navigator.mediaDevices
        .getUserMedia({
          video: {
            facingMode: 'environment',
            width: { ideal: width },
            height: { ideal: height },
            frameRate: { ideal: 30 },
          },
        })
        .then(stream => {
          console.log('_getUserMedia -> stream loaded');
          this.loadStream(stream);
        })
        .catch(err => {
          console.log(err);

          if (!secondTry)
          {
            console.log('Started second try');
            this._requestCameraStream(2560, 1440, true);
          }
          else
          {
            this.router.navigateByUrl('id-document/camera-error');
          }
        });
    }
  }

  private loadStream(stream: MediaStream) {
    const videoDevices = stream.getVideoTracks();
            
    this.lastStream = stream;
    this.video!.nativeElement.srcObject = stream;
    this.video!.nativeElement.play();
    this.ref.detectChanges();
  }

Basically I check if the device has a camera available and try to load it with the width and height values that the function receives. On the first try I call the function as follows:

this._requestCameraStream(4096, 2160, false);

If the stream fails to load (probably because the camera does not support 4k quality) then it tries again with the values this._requestCameraStream(2560, 1440, true);

This is actually working pretty well on most devices, but on a Galaxy Note 10 Plus, the stream does not load, but if I click the button to take the picture, the camera does capture the image in 4k quality.

I suspect that the camera has a higher resolution than the screen, so the camera can capture a 4k image, but the screen can't load a 4k video as a preview. The problem is: the system does not trigger any warning or errors that I could capture. It is as if the preview loaded successfully.

How can I detect and treat this error? Or maybe, is there any other way that I can request the camera to capture a maximum quality image with the preview loading correctly?

about 4 years ago · Santiago Gelvez
2 Respuestas
Responde la pregunta

0

You can try defining a range of resolutions instead of trying only two

async _requestCameraStream() {
    if (!navigator.mediaDevices.getUserMedia) return;
    try {
        const stream = await navigator.mediaDevices
            .getUserMedia({
                              video: {
                                  facingMode: {
                                     exact: "environment"
                                  },
                                  width: { min: 2288, ideal: 4096, max: 4096 },
                                  height: { min: 1080, ideal: 2160, max: 2160 },
                                  frameRate: { ideal: 30 },
                              },
                          });
        if(stream) {
            console.log('_getUserMedia -> stream loaded');
            this.loadStream(stream);
        }
    }catch (err) {
        console.log(err);
        this.router.navigateByUrl('id-document/camera-error');
    }
}
about 4 years ago · Santiago Gelvez Denunciar

0

I think your current approach is correct to capture the maximum quality image. I have used a similar approach in one of my projects. I think the problem is with the video playback. There is an autoplay policy in the browser it behaves differently in a different browser. This browser policy does not allow to play video content without any user intervention. Check this URL, https://developer.chrome.com/blog/autoplay/

I think you should add a muted attribute in the video element and would be better if you ask the user to click before capturing the camera stream. May be this does not solve the problem which you are facing but this problem will be there in some browsers like iPhone. Apple devices do not allow any video content without user intervention.

Regards, omi

about 4 years ago · Santiago Gelvez Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda