본문 바로가기
JavaScript

[JavaScript] 동영상 재생하기

by teamnova 2024. 11. 16.
728x90

안녕하세요.

안녕하세요! 오늘은 JavaScript를 사용자가 자신의 컴퓨터에서 동영상 파일을 선택하고, 웹 브라우저에서 직접 미리보기로 재생할 수 있는 기능을 구현해 보겠습니다.

 

주요 기능을 정리하면 다음과 같습니다.

  1. 사용자가 파일을 선택하면 동영상을 미리보기로 재생
  2. 파일 크기 제한: 50MB 이하의 동영상만 업로드 가능
  3. 파일 정보 표시: 파일 이름, 크기, 형식을 화면에 출력
  4. 드래그 앤 드롭을 통한 파일 업로드 지원
  5. 다중 파일 선택 기능으로 여러 동영상을 한 번에 미리보기

1. HTML 코드 작성 : index.html

먼저 기본적인 HTML 구조를 작성합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>동영상 미리보기</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>동영상 미리보기</h1>
    <div id="dropArea">
        <p>여기로 파일을 드래그하거나 클릭하여 동영상을 선택하세요.</p>
        <input type="file" id="fileInput" accept="video/*" multiple>
    </div>
    <div id="videoList"></div>
    <script src="script.js" defer></script>
</body>
</html>

 

  • <input type="file" accept="video/*" multiple>: 사용자가 동영상 파일만 선택할 수 있도록 제한합니다.
  • <video> 태그는 동영상 재생을 위한 HTML5 요소입니다.

2. 스타일 적용하기 : style.css

body {
    font-family: Arial, sans-serif;
    display: flex;
    flex-direction: column;
    align-items: center;
    margin-top: 30px;
    background-color: #f8f8f8;
    padding: 20px;
}

h1 {
    color: #333;
    margin-bottom: 20px;
}

#dropArea {
    border: 3px dashed #6c63ff;
    padding: 20px;
    width: 80%;
    max-width: 600px;
    text-align: center;
    background-color: #ffffff;
    cursor: pointer;
}

#dropArea.dragover {
    background-color: #e0e0e0;
}

.video-container {
    margin-top: 20px;
    text-align: center;
}

video {
    width: 100%;
    max-width: 600px;
    margin-top: 10px;
}

.video-info {
    font-size: 0.9em;
    color: #666;
    margin-top: 5px;
}

 

  • dropArea는 파일을 드래그 앤 드롭할 수 있는 영역입니다.
  • .video-container는 동영상과 파일 정보를 표시하는 스타일입니다.

3. JavaScript 코드 작성하기 : script.js

이제 본격적으로 JavaScript를 활용해 파일 선택 및 드래그 앤 드롭 기능을 구현해 보겠습니다.

document.addEventListener('DOMContentLoaded', () => {
    const dropArea = document.getElementById('dropArea');
    const fileInput = document.getElementById('fileInput');
    const videoList = document.getElementById('videoList');

    // 최대 파일 크기 제한: 500MB
    const MAX_FILE_SIZE = 500 * 1024 * 1024;

    // 파일 선택 버튼 클릭 시 파일 선택창 열기
    dropArea.addEventListener('click', () => fileInput.click());

    // 파일 선택 시 처리
    fileInput.addEventListener('change', (event) => handleFiles(event.target));

    // 드래그 앤 드롭 이벤트 설정
    dropArea.addEventListener('dragover', (event) => {
        event.preventDefault();
        dropArea.classList.add('dragover');
    });

    dropArea.addEventListener('dragleave', () => dropArea.classList.remove('dragover'));

    dropArea.addEventListener('drop', (event) => {
        event.preventDefault();
        dropArea.classList.remove('dragover');
        handleFiles(event.dataTransfer);
    });

    function handleFiles(input) {
        const files = input.files;

        for (const file of files) {
            if (file.size > MAX_FILE_SIZE) {
                alert(`파일 "${file.name}"이(가) 너무 큽니다. 최대 500MB 이하로 업로드해주세요.`);
                continue;
            }

            if (!file.type.startsWith('video/')) {
                alert('동영상 파일만 업로드할 수 있습니다.');
                continue;
            }

            displayVideo(file);
        }
    }

    function displayVideo(file) {
        const fileURL = URL.createObjectURL(file);
        const videoContainer = document.createElement('div');
        videoContainer.className = 'video-container';

        const videoElement = document.createElement('video');
        videoElement.src = fileURL;
        videoElement.controls = true;
        videoElement.style.maxHeight = '400px';
        videoElement.style.marginTop = '20px';

        const videoInfo = document.createElement('div');
        videoInfo.className = 'video-info';
        videoInfo.textContent = `파일명: ${file.name} | 크기: ${(file.size / 1024 / 1024).toFixed(2)}MB | 형식: ${file.type}`;

        videoContainer.appendChild(videoElement);
        videoContainer.appendChild(videoInfo);
        videoList.appendChild(videoContainer);
    }
});

 

  • 파일 크기 제한: MAX_FILE_SIZE를 500MB로 설정했습니다.
  • 동영상 미리보기: 파일을 선택하거나 드래그 앤 드롭하면, <video> 태그를 동적으로 생성해 미리보기로 재생합니다.
  • 파일 정보 표시: 동영상 파일의 이름, 크기, 형식을 화면에 표시합니다.