Enable rear camera with HTML5

前端 未结 5 1685
失恋的感觉
失恋的感觉 2020-11-28 03:02

I\'m working on a project with MVC ASP.Net 4 HTML5 (default browser is google-chrome v29.0.1547.57) I can interact with these tools and take photographs but only with front

相关标签:
5条回答
  • 2020-11-28 03:04
            //----------------------------------------------------------------------
            //  Here we list all media devices, in order to choose between
            //  the front and the back camera.
            //      videoDevices[0] : Front Camera
            //      videoDevices[1] : Back Camera
            //  I used an array to save the devices ID 
            //  which i get using devices.forEach()
            //  Then set the video resolution.
            //----------------------------------------------------------------------
            navigator.mediaDevices.enumerateDevices()
            .then(devices => {
              var videoDevices = [0,0];
              var videoDeviceIndex = 0;
              devices.forEach(function(device) {
                console.log(device.kind + ": " + device.label +
                  " id = " + device.deviceId);
                if (device.kind == "videoinput") {  
                  videoDevices[videoDeviceIndex++] =  device.deviceId;    
                }
              });
    
    
              var constraints =  {width: { min: 1024, ideal: 1280, max: 1920 },
              height: { min: 776, ideal: 720, max: 1080 },
              deviceId: { exact: videoDevices[1]  } 
            };
            return navigator.mediaDevices.getUserMedia({ video: constraints });
    
          })
            .then(stream => {
              if (window.webkitURL) {
                video.src = window.webkitURL.createObjectURL(stream);
                localMediaStream = stream;
              } else if (video.mozSrcObject !== undefined) {
                video.mozSrcObject = stream;
              } else if (video.srcObject !== undefined) {
                video.srcObject = stream;
              } else {
                video.src = stream;
              }})
            .catch(e => console.error(e));
    
    0 讨论(0)
  • 2020-11-28 03:08

    A demo can be found at https://webrtc.github.io/samples/src/content/devices/input-output/. This will allow access to both the front and rear camera.

    Many demos that you will find rely on the deprecated function:

    MediaStreamTrack.getSources() 
    

    As of Chrome 45 and FireFox 39, you will need to use the function:

    MediaDevices.enumerateDevices()
    

    Example:

    if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
      console.log("enumerateDevices() not supported.");
      return;
    }
    
    // List cameras and microphones.
    
    navigator.mediaDevices.enumerateDevices()
      .then(function(devices) {
        devices.forEach(function(device) {
          console.log(device.kind + ": " + device.label +
            " id = " + device.deviceId);
        });
      })
      .catch(function(e) {
        console.log(e.name + ": " + e.message);
      });

    Further documentation can be found here: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices

    0 讨论(0)
  • 2020-11-28 03:14

    In Chrome on my Samsung S8 I can use "facingMode"="environment" to take video from the 'rear camera'. The default seems to be "user" (the 'front' camera)

    in TypeScript:

        const video = document.getElementById("video");
        const constraints = {
            advanced: [{
                facingMode: "environment"
            }]
        };
        navigator.mediaDevices
            .getUserMedia({
                video: constraints
            })
            .then((stream) => {
                video.src = window.URL.createObjectURL(stream);
                video.play();
            });
    

    ref: MediaTrackConstraints/facingMode

    0 讨论(0)
  • 2020-11-28 03:16

    Check out https://simpl.info/getusermedia/sources/ that shows how you can select sources using

    MediaStreamTrack.getSources(gotSources);
    

    You can then select the source and pass it in as optional into getUserMedia

    var constraints = {
      audio: {
        optional: [{sourceId: audioSource}]
      },
      video: {
        optional: [{sourceId: videoSource}]
      }
    };
    navigator.getUserMedia(constraints, successCallback, errorCallback);
    

    It is now fully available in Stable Chrome and mobile (As of v30)

    0 讨论(0)
  • 2020-11-28 03:29

    Last time i developped that code, soo here is the version which i use : you call directly the function whichCamera in your code and you specefic which camera "user","environment" or "computer"'if you are runing in a computer)

    `//----------------------------------------------------------------------
    //  whichCamera(Type)
    //    For smartphone or tablet :
    //     Start the type={user,environment} camera.
    //    For computer it's simple :
    //      type = "computer".
    //----------------------------------------------------------------------
    var streamSrc, cameraType;
    function whichCamera(type){
    
      var cameraFacing;
      cameraType = type;
      if( type == "user")
        cameraFacing = 0;
      else if( type == "environment")
        cameraFacing = 1;
      else if( type == "computer"){
        cameraFacing = 2;
      }
      console.log(type+" index : "+cameraFacing);
    
      //  Here we list all media devices, in order to choose between
      //  the front and the rear camera.
      //      videoDevices[0] : user Camera
      //      videoDevices[1] : environment Camera
      //  Then set the video resolution.
      navigator.mediaDevices.enumerateDevices()
      .then(devices => {
        var videoDevices, videoDeviceIndex, constraints;
        //  Initialize the array wich will contain all video resources IDs.
        //  Most of devices have two video resources (Front & Rear Camera).
        videoDevices = [0,0];
        //  Simple index to browse the videa resources array (videoDevices).
        videoDeviceIndex = 0;
        //  devices.forEach(), this function will detect all media resources (Audio, Video) of the device
        //  where we run the application.
        devices.forEach(function(device) {
          console.log(device.kind + ": " + device.label +
            " id = " + device.deviceId);
          // If the kind of the media resource is video,
          if (device.kind == "videoinput") {
            //  then we save it on the array videoDevices.
            videoDevices[videoDeviceIndex++] =  device.deviceId;
            console.log(device.deviceId+" = "+videoDevices[videoDeviceIndex-1]);
          }
        });
        console.log("Camera facing ="+cameraFacing+" ID = "+videoDevices[videoDeviceIndex-1]);
    
        // Here we specified which camera we start,
        //  videoDevices[0] : Front Camera
        //  videoDevices[1] : Back Camera
        if( cameraFacing != "computer"){
          constraints = { deviceId: { exact: videoDevices[cameraFacing]  }};
          return navigator.mediaDevices.getUserMedia({ video:
                                                              constraints,
                                                              width: { min: 1280, ideal: 1600, max: 1920 },
                                                              height: { min: 720, ideal: 1200, max: 1080 }
                                                      }
                                                    );
        }else
          return navigator.mediaDevices.getUserMedia({ video: true });
        })
        //  Then we retrieve the link to the video stream.
        .then(stream => {
          if (window.webkitURL) {
            video.src = window.webkitURL.createObjectURL(stream);
            localMediaStream = stream;
            console.log(localMediaStream +" = "+ stream)
          } else if (video.mozSrcObject !== undefined) {
            video.mozSrcObject = stream;
            console.log(video.mozSrcObject +" = "+ stream)
          } else if (video.srcObject !== undefined) {
            video.srcObject = stream;
            console.log(video.srcObject +" = "+ stream)
          } else {
            video.src = stream;
            console.log(video.src +" = "+ stream)
          }
          streamSrc = stream;
        })
        .catch(e => console.error(e));
    
    }
    
    0 讨论(0)
提交回复
热议问题