3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ブラウザでWebカメラの映像の録画。ダウンロードリンクが表示され、MP4形式で動画をダウンロードできます。

Last updated at Posted at 2024-10-21

image.png

Webカメラの映像の録画。ダウンロードリンクが表示され、MP4形式で動画をダウンロードできます。

説明:
Webカメラの映像取得: navigator.mediaDevices.getUserMediaを使って、ユーザーのWebカメラとマイクから映像と音声を取得しています。
録画の開始と停止: 録画はMediaRecorder APIを使用して実装されています。startButtonを押すと録画を開始し、stopButtonを押すと録画が停止します。
録画データの保存: 録画が終了すると、録画されたデータはBlob形式に変換され、それをダウンロードリンクとして提供します。
ダウンロードリンク: 録画が終了すると、ダウンロードリンクが表示され、MP4形式で動画をダウンロードできます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Webカメラ録画とダウンロード</title>
    <style>
        body {
            font-family: Arial, sans-serif; /* フォントの設定 */
            display: flex;
            flex-direction: column; /* 縦に並べる */
            align-items: center; /* 中央揃え */
            justify-content: center; /* 垂直方向の中央揃え */
            height: 100vh; /* ビューポートの高さを100% */
            margin: 0; /* デフォルトのマージンを削除 */
        }
        video {
            border: 2px solid black; /* 動画の周りに黒い枠を追加 */
        }
        button {
            margin-top: 10px; /* ボタンの上部に余白を追加 */
            padding: 10px 20px; /* ボタンの内側の余白を設定 */
            font-size: 16px; /* フォントサイズを設定 */
        }
    </style>
</head>
<body>
    <h1>Webカメラからの映像を録画してダウンロード</h1>
    <video id="video" autoplay muted playsinline></video> <!-- 録画する動画を表示する要素 -->
    <button id="startButton">録画開始</button> <!-- 録画開始ボタン -->
    <button id="stopButton" disabled>録画停止</button> <!-- 録画停止ボタン(初めは無効) -->
    <a id="downloadLink" style="display:none;">ダウンロード</a> <!-- ダウンロードリンク(初めは非表示) -->

    <script>
        const video = document.getElementById('video'); // video要素を取得
        const startButton = document.getElementById('startButton'); // 録画開始ボタンを取得
        const stopButton = document.getElementById('stopButton'); // 録画停止ボタンを取得
        const downloadLink = document.getElementById('downloadLink'); // ダウンロードリンクを取得
        
        let mediaRecorder; // MediaRecorderインスタンスを格納する変数
        let recordedChunks = []; // 録画されたデータのチャンクを格納する配列

        // Webカメラの映像と音声を取得
        navigator.mediaDevices.getUserMedia({ video: true, audio: true })
            .then(stream => {
                video.srcObject = stream; // 取得したストリームをvideo要素に設定

                mediaRecorder = new MediaRecorder(stream); // MediaRecorderインスタンスを作成

                // 録画データが利用可能になったときの処理
                mediaRecorder.ondataavailable = function(event) {
                    if (event.data.size > 0) {
                        recordedChunks.push(event.data); // データがある場合、配列に追加
                    }
                };

                // 録画が停止したときの処理
                mediaRecorder.onstop = function() {
                    const blob = new Blob(recordedChunks, { type: 'video/mp4' }); // 録画データをBlobに変換
                    const url = URL.createObjectURL(blob); // BlobをURLに変換
                    downloadLink.href = url; // ダウンロードリンクのhrefを設定
                    downloadLink.download = 'recorded_video.mp4'; // ダウンロード時のファイル名を設定
                    downloadLink.style.display = 'block'; // ダウンロードリンクを表示
                    downloadLink.textContent = 'ダウンロードはこちら'; // リンクのテキストを設定
                };
            })
            .catch(err => {
                console.error('Webカメラのアクセスに失敗しました: ', err); // エラーハンドリング
            });

        // 録画開始ボタンがクリックされたときの処理
        startButton.addEventListener('click', () => {
            recordedChunks = []; // 録画データの配列をリセット
            mediaRecorder.start(); // 録画を開始
            startButton.disabled = true; // 録画開始ボタンを無効化
            stopButton.disabled = false; // 録画停止ボタンを有効化
        });

        // 録画停止ボタンがクリックされたときの処理
        stopButton.addEventListener('click', () => {
            mediaRecorder.stop(); // 録画を停止
            startButton.disabled = false; // 録画開始ボタンを有効化
            stopButton.disabled = true; // 録画停止ボタンを無効化
        });
    </script>
</body>
</html>

3
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?