Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

352
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda