728x90
    
    
  가끔 클라이언트 사이드에서 영상을 선택하고, 썸네일을 만들어야 하는 상황이 있다.
<input>으로 영상을 선택 후, 원하는 시간의 썸네일을 만드는 예제입니다.
import React, {useState, useEffect, useRef, } from 'react';
import "./styles.css";
export default function App() {
  const [OriginalVideo, setOriginalVideo] = useState(""); //비디오 파일 저장하는 변수
  const [MaxVideoTime, setMaxVideoTime] = useState(0); //비디오 총 시잔 저장하는 변수
  const Cnt = useRef(0);
  const onLoadFile = (e) =>{
      setOriginalVideo(e.target.files);
  }
  let letsGetThumnail= (Time) =>{
    
    if(MaxVideoTime<=Time){ //최대 시간대를 지나면 막는 조건문
      Cnt.current = MaxVideoTime;
    }else if(0>=Time){ //최소 시간대를 지나면 막는 조건문
      Cnt.current = 0;
    }else{
      Cnt.current = Time;
    }
    let videoTag = document.getElementById("videoTag");
    console.log(Cnt.current);
    
    videoTag.currentTime = Cnt.current; //최근 재생된 시간 설정
   
    let canvas = document.getElementById('canvas');
    let ctx = canvas.getContext('2d');
    setTimeout(()=>{ //바로 출력하면 비디오가 불러오기 전이라 동작이 안됨. 잠깐의 기다림 후 캔버스에 해당 이미지를 그림.
      ctx.drawImage(videoTag, 0, 0 , 128, 72);
    },300);
  }
  useEffect(() => {
    if(OriginalVideo!==""){
      let videoTag = document.getElementById("videoTag");
      let videourl = URL.createObjectURL(OriginalVideo[0]);
      videoTag.setAttribute("src", videourl);
      videoTag.addEventListener( "loadedmetadata", function () {
        setMaxVideoTime(videoTag.duration); // 비디오 총 시긴 구하고 저장하기
        videoTag.play();
        letsGetThumnail(0);
      
       }, false); 
    }
  }, [OriginalVideo]);
  return (
    <div className="App">
      <h1>영상  썸네일</h1>
      <div style={{display:"flex", justifyContent:"center",marginBottom:"20px"}}>
        <video id="videoTag" muted style={{objectFit:"fill", }} width={128} height={72}></video>
        <canvas id="canvas" idth={128} height={72}></canvas>
      </div>
      <input type="file" id="VideoUp" name="upload[]" onChange={onLoadFile} ></input>
      <button onClick={() => letsGetThumnail(Cnt.current + 1)}>
        값 더하기
      </button>
      <button onClick={() => letsGetThumnail(Cnt.current - 1)}>
        값 빼기
      </button>
    </div>
  );
}'React' 카테고리의 다른 글
| [React]컴포넌트 생성 및 재사용하기 (0) | 2023.07.20 | 
|---|---|
| [React] video 태그(동영상) 관련 함수 활용 (0) | 2023.03.05 | 
| [리액트] PC 웹캠으로 사진 촬영 (2) | 2023.01.26 | 
| [리액트] map 반복문으로 만든 자식 컴포넌트의 함수 작동 (useRef 배열) (0) | 2023.01.12 | 
| [리액트] 이미지 넣기 (0) | 2022.12.19 |