1. ホーム
  2. Web制作
  3. html5

HTML5で実現する写真・カメラ機能

2022-01-31 10:31:31

<スパン オープニング

クロームアプリのクラウドカメラアプリを制作しています。写真撮影、動画撮影、写真保存、ファイルアップロードなど、コアとなる機能を含んでいます。メディアストリーミングに関連する多くのHTML5 APIを含んでおり、この記事を書く目的は、知識を要約して整理すること、そして最も重要なことは、関連するニーズを持つ読者に何らかの指針を提供することです。

注:この記事は、あまり理論的な知識ではなく、実際の実務に基づいたものです。

写真を撮る

HTML5 の getUserMedia API は、ハードウェア デバイスのメディア(カメラ、ビデオ、オーディオ、ジオロケーションなど)にアクセスするためのインターフェースをユーザーに提供し、これに基づいて開発者は、ブラウザ プラグインに依存せずにハードウェア メディア デバイスにアクセスすることができます。

ブラウザの互換性は以下の通りです。

上の画像からわかるように、主要なブラウザであるFirefox、Chrome、Safari、Operaなどを完全にサポートしています。

1. ビデオストリームを取得し、videoタグで再生する。

<video id="video" autoplay></video>
    
    --------------------------------------------------------------
    
    const videoConstraints = { width: 1366, height: 768 };
    const videoNode = document.querySelector('#video');
    let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });
    videoNode.srcObject = stream;
    videoNode.play();

2. 複数のカメラデバイス、切り替えはどうする?

// enumerateDevices to get all media devices
    const mediaDevices = await navigator.mediaDevices.enumerateDevices();
    // filter to get camera devices by device instanceking property videoinput
    const videoDevices = mediaDevices.filter(item => item.kind === 'videoinput') || [];
    // Get the front camera
    const videoDeviceId = videoDevices[0].deviceId;
    const videoConstraints = { deviceId: { exact: videoDeviceId }, width: 1366, height: 768 };
    let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });
    // Get the rear camera
    const videoDeviceId = videoDevices[1].deviceId;
    const videoConstraints = { deviceId: { exact: videoDeviceId }, width: 1366, height: 768 };
    let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });
    
    // In this order...

3. 写真を撮って保存する

// Capture the video stream via canvas and generate a base64 image
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');
    canvas.width = 1366;
    canvas.height = 768;
    context.drawImage(videoNode, 0, 0, canvas.width, canvas.height);
    download(canvas.toDataURL('image/jpeg'));
    // Download the image
    function download (src) {
        if (!src) return;
        const a = document.createElement('a');
        a.setAttribute('download', new Date());
        a.href = src;
        a.click();
    }

4. カメラデバイスをオフにする

let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });
    // turn off the camera after 3s
    setTimeout(function () {
        stream.getTracks().forEach(track => track.stop());
        stream = null;
    }, 3000);

これで簡易カメラ写真機能は完成です

カメラ

ビデオ撮影の基本的なプロセスは、ビデオストリームを記録し、オーディオ/ビデオファイルとして保存することです。HTML5 MediaRecorderオブジェクトは、マルチメディアの記録とビデオ撮影の機能を提供します。

ブラウザの互換性は以下の通りです。

上の画像が示すように、ブラウザは getUserMedia よりも MediaRecorder の方がはるかに互換性が低く、現在 Chrome と Firefox だけが MediaRecorder をよりよくサポートしています。

==注意:カメラプレビュープレーヤーのビデオタグはミュートにしてください(エコーによるきついノイズを除去するため)。

const videoConstraints = { width: 1366, height: 768 };
    let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });
    let mediaRecorder = new MediaRecorder(stream);
    let mediaRecorderChunks = []; // record data streams
   
    mediaRecorder.ondataavailable = (e) => {
        mediaRecorderChunks.push(e.data);
    };
    
    mediaRecorder.onstop = (e) => {
        // Create an instance of the file binary data via a Blob object.
        let recorderFile = new Blob(mediaRecorderChunks, { 'type' : mediaRecorder.mimeType });
        mediaRecorderChunks = [];
        const file = new File([this.recordFile], (new Date).toISOString().replace(/:|\. /g, '-') + '.mp4', {
            type: 'video/mp4'
        });
        download(URL.createObjectURL(file));
        // Download the video
        function download (src) {
            if (!src) return;
            const a = document.createElement('a');
            a.setAttribute('download', new Date());
            a.href = src;
            a.click();
        }
    };
    
    mediaRecorder.stop(); // stop recording, trigger onstop event

概要

以上のハンズオンで、読者の皆さんは、写真を撮る、ビデオを撮る、ファイルを保存する、といったカメラの基本機能をマスターされたと思います。このアプリケーションは個人制作ではないので、ソースコードは公開されていませんので、興味のある方は一度試してみてはいかがでしょうか。