JavaScript로 사진 찍고 싶어요(8·)
                                            
                                                
                                                
                                                
                                                
                                                
                                                 15003 단어  JavaScript
                    
사운드와 이미지를 캡처한 Media Capture and Streams API로 스냅샷을 찍어봤다.
소스 코드
자바의 준비
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>MediaDevices.getUserMedia()</title>
</head>
<body>
<button onclick="startVideo()">ビデオ開始!</button>
<button onclick="stopVideo()">ビデオ終了!</button>
<button onclick="snapshot()">写真撮影!</button>
<h2>JavaScriptでカメラ表示(・8・)</h2>
<video autoplay width="320" height="240"></video>
<h2>スナップショット!</h2>
<img/>
<canvas style="display: none" width="320" height="240"></canvas>
<script src="app.js"></script>
</body>
</html>
그러고 보면 비디오 요소가 없는 autooplay는 영상이 재생되지만 멋있어진다.왜 그랬을까
비디오 캡처
ビデオ開始!ボタンで走るやつ
function startVideo() {
    console.info('入出力デバイスを確認してビデオを開始するよ!');
    Promise.resolve()
        .then(function () {
            return navigator.mediaDevices.enumerateDevices();
        })
        .then(function (mediaDeviceInfoList) {
            console.log('使える入出力デバイスs->', mediaDeviceInfoList);
            var videoDevices = mediaDeviceInfoList.filter(function (deviceInfo) {
                return deviceInfo.kind == 'videoinput';
            });
            if (videoDevices.length < 1) {
                throw new Error('ビデオの入力デバイスがない、、、、、。');
            }
            return navigator.mediaDevices.getUserMedia({
                audio: false,
                video: {
                    deviceId: videoDevices[0].deviceId
                }
            });
        })
        .then(function (mediaStream) {
            console.log('取得したMediaStream->', mediaStream);
            videoStreamInUse = mediaStream;
            document.querySelector('video').src = window.URL.createObjectURL(mediaStream);
            // 対応していればこっちの方が良い
            // document.querySelector('video').srcObject = mediaStream;
        })
        .catch(function (error) {
            console.error('ビデオの設定に失敗、、、、', error);
        });
}
navigator.mediaDevices.enumerateDevices()과navigator.mediaDevices.getUserMedia()하면 Promise가 반환되므로 Promise를 사용하세요.resolve().then()......then () 형식으로 순서대로enumerateDevices()
MediaDeviceInfo(정렬)의 속성kind로 돌아가기
deviceInfo.kind == 'videoinput';의...getUserMedia()
매개변수에 지정된 Stream을 가져옵니다.
{ audio: true, video: false }
{ audio: false, video: { width: 1280, height: 720 } }
이번에 ↑에서 가져온 deviceId를 들고
video: {deviceId: hogehoge } 형식으로 설비를 지정한다.사실 프런트, 뒤에 각각 카메라의 단말기가 있는 상황에서
{ audio: true, video: { facingMode: { exact: "environment" } } }
{ audio: true, video: { facingMode: "environment" } }
비디오 중지
의외로 스마트폰으로 포착되면 따뜻해지기 때문에 정지된 처리도 적어본다.말은 그렇지만 여기 녀석들은 여전히 그렇다
//ビデオ停止!ボタンで走るやつ
function stopVideo() {
    console.info('ビデオを止めるよ!');
    videoStreamInUse.getVideoTracks()[0].stop();
    if (videoStreamInUse.active) {
        console.error('停止できかた、、、', videoStreamInUse);
    } else {
        console.log('停止できたよ!', videoStreamInUse);
    }
}
스냅샷 캡처
비디오 라벨의 내용
CanvasRenderingContext2D.drawImage()이 canvas 요소에 유입될 수 있기 때문에 이것과 HTMLCanvasElement.toDataURL()를 결합하여 라벨로 데이터 URI 형식의 이미지를 표시합니다.
function snapshot() {
    console.info('スナップショットをとるよ!');
    var videoElement = document.querySelector('video');
    var canvasElement = document.querySelector('canvas');
    var context = canvasElement.getContext('2d');
    context.drawImage(videoElement, 0, 0, videoElement.width, videoElement.height);
    document.querySelector('img').src = canvasElement.toDataURL('image/webp');
}
 
 잘 됐다!(・8・)
 
                Reference
이 문제에 관하여(JavaScript로 사진 찍고 싶어요(8·)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TatsuyaYamamoto/items/98d791ef1bb7658a9395텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)