๊ฐœ๋ฐœ ๊ณต๋ถ€/๋ฐ๋ธŒ์ฝ”์Šค TIL

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240309 - ReactJS ๋น„๋””์˜ค ์—๋””ํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ (3)

๊ฐ€์šค์ด 2024. 3. 10. 13:02

Intro


์˜ค๋Š˜์€ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ video-react์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ์ ์šฉํ•˜์˜€๋‹ค.

์ผ์š”์ผ์—๋Š” ์—ด์‹ฌํžˆ ๋†€์•„์•ผํ•ด์„œ ํ† ์š”์ผ์— ํ”„๋กœ์ ํŠธ์— ์‹ ๊ฒฝ์„ ๋งŽ์ด ์ผ๋‹ค. ใ…Žใ…Ž

 

 

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์‚ฌํ•ญ


video-react

 

Video-React - React Video Component

Installation NPM Install video-react and peer dependencies via NPM npm install --save video-react react react-dom redux Basic example The basic player Play Video PlayNon-Fullscreen import css in your app or add video-react styles in your page import "node_

video-react.js.org

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

npm install --save video-react

 

 

video-react์˜ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ์ธ Player๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ ์™ธ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ BigPlayButton, LoadingSpinner, ControlBar ๋“ฑ์„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

 

 

  • Player: video-react ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ
  • BigPlayButton: ๋น„๋””์˜ค ์ดˆ๊ธฐ ์žฌ์ƒ ๋ฒ„ํŠผ
  • LoadingSpinner: ๋น„๋””์˜ค๊ฐ€ ๋กœ๋”ฉ๋˜๊ธฐ ์ „ ์Šคํ”ผ๋„ˆ
  • ControlBar: ๋ณผ๋ฅจ, ํƒ์ƒ‰, ์žฌ์ƒ ์ผ์‹œ ์ค‘์ง€/์žฌ๊ฐœ ๋“ฑ ๋น„๋””์˜ค ์ œ์–ด ์ปดํฌ๋„ŒํŠธ

 

 

Player๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด subscribeToStateChange ํ•จ์ˆ˜๋กœ ํ”Œ๋ ˆ์ด์–ด ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • VideoPlayer.js
import React, { useContext, useEffect, useState } from 'react';
import { Player, BigPlayButton, LoadingSpinner, ControlBar } from 'video-react';
import { VideoFileContext } from '../App';

const VideoPlayer = ({ onPlayerChange, onPlayerStateChange }) => {
  const videoFile = useContext(VideoFileContext);
  const [player, setPlayer] = useState();
  const [playerState, setPlayerState] = useState();
  const [source, setSource] = useState();

  useEffect(() => {
    setSource(URL.createObjectURL(videoFile));
  }, [videoFile]);

  useEffect(() => {
    if (playerState) onPlayerStateChange(playerState);
  }, [playerState]);

  useEffect(() => {
    onPlayerChange(player);

    if (player) {
      // ํ”Œ๋ ˆ์ด์–ด ์ƒํƒœ ๋ณ€๊ฒฝ ๊ตฌ๋…
      player.subscribeToStateChange(setPlayerState);
    }
  }, [player]);

  return (
    <div className={'video-player'}>
      <Player ref={player => setPlayer(player)} src={source} startTime={0}>
        <source src={source} />
        <BigPlayButton position="center" />
        <LoadingSpinner />
        <ControlBar disableCompletely></ControlBar>
      </Player>
    </div>
  );
};

export default VideoPlayer;

 

๋น„๋””์˜ค ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋„ player๊ณผ playerState์˜ ๊ฐ’์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ props๋กœ ๋ฐ›์•„์™”๋‹ค.

 

 

 

 

๋งˆ๋ฌด๋ฆฌ


๋„ˆ๋ฌด ์‰ฝ๊ฒŒ ๋น„๋””์˜ค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•Œ๊ฒŒ ๋˜์–ด ์ข‹์•˜๋‹ค.

์•ž์œผ๋กœ๋„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ๋„ ์˜ฌ๋ผ๊ฐ„ ๊ฒƒ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ–ˆ๋‹ค.

'๊ฐœ๋ฐœ ๊ณต๋ถ€ > ๋ฐ๋ธŒ์ฝ”์Šค TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240312, 240313 - ReactJS ๋น„๋””์˜ค ์—๋””ํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ ๋งˆ๋ฌด๋ฆฌ...  (0) 2024.03.13
[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240311 - ReactJS ๋น„๋””์˜ค ์—๋””ํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ (4)  (0) 2024.03.11
[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240307, 240308 - ReactJS ๋น„๋””์˜ค ์—๋””ํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ (2)  (0) 2024.03.09
[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240306 - ReactJS ๋น„๋””์˜ค ์—๋””ํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ (1)  (0) 2024.03.07
[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240305 - ๋งŒ๋“  ํ™”๋ฉด ๋ฐฐํฌํ•ด๋ณด๊ธฐ (Vercel)  (0) 2024.03.05