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 |