Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

350
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!