Skip to content

feature request: QR code streaming #2793

@tdelabro

Description

@tdelabro

I'm following specifications building my app and those require me to us a specific, ad-hoc protocol for animated QR code.
You can find the standard here: https://developer.blockchaincommons.com/ur/

It looks something like this:

Image

but animated

The issue is that because your impl doesn't know about my standard for qrcode streaming, I have to do the following:

  async function startScaningCodes() {
    const decoder = new URDecoder();

    do {
      // Scan the part from a QRCode
      // the part should look like this:
      // ur:bytes/1-9/lpadascfadaxcywenbpljkhdcahkadaemejtswhhylkepmykhhtsytsnoyoyaxaedsuttydmmhhpktpmsrjtdkgslpgh
      const part = await scanQRCode();

      // register the new part with the decoder
      decoder.receivePart(part);

      const x = decoder.estimatedPercentComplete();
      scanResult = x.toString();
      // check if all the necessary parts have been received to successfully decode the message
    } while (!decoder.isComplete());

    // If no error has been found
    if (decoder.isSuccess()) {
      // Get the UR representation of the message
      const ur = decoder.resultUR();

      // Decode the CBOR message to a Buffer
      const decoded = ur.decodeCBOR();

      // get the original message, assuming it was a JSON object
      const originalMessage = JSON.parse(decoded.toString());
      scanResult = originalMessage;
    } else {
      // log and handle the error
      const error = decoder.resultError();
      console.log("Error found while decoding", error);
    }
  }

  async function scanQRCode() {
    try {
      const permission = await checkPermissions();
      if (permission == "granted") {
        return await uncheckedScanQrCode();
      } else {
        const permission = await requestPermissions();
        if (permission == "granted") {
          return await uncheckedScanQrCode();
        } else {
          return "Permission denied";
        }
      }
    } catch (error) {
      console.error("QR code scanning failed:", error);
      return JSON.stringify(error);
    }
  }

Which mean entering and exiting the camera context every time I get a bit of data out of it, by scanning a single QRCode.
To give you context I display 10 QR codes by second, but this code only catch one every 1.5second so it takes me about 15-20sec to get the whole data out of it.

I would like instead for the camera to on, and just stream me all the QR codes it finds when it does the frame-by-frame analysis of the video stream.

Expo offers this through the onbarcodescanned property https://docs.expo.dev/versions/latest/sdk/camera/#onbarcodescanned
You can see an example of it being used here, for an app following the same standard as mine: https://github.com/SovranBitcoin/Sovran/blob/4e7b3ccdb5237a7f99d3b4258c5dfb68bb79780b/components/layout/Camera.tsx#L172

Do you think it is doable? Is there an alteranative you can think of in the meantime? (would getUserMedia + analyzing the stream with some other works here instead)?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions