Intro
ffmpeg ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋น๋์ค๋ฅผ ๋ด๋ณด๋ด๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
๊ณต์ ๋ฌธ์๊ฐ ์กฐ๊ธ ๋น์ฝํ๋ค๊ณ ๋๊ปด์ ธ์ ffmpeg ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ๋ ๋ฐ์ ์กฐ๊ธ ์ด๋ ค์ ๋ค ใ
ํ๋ก์ ํธ ์งํ์ฌํญ
FFmpeg
Overview | ffmpeg.wasm
For 0.11.x, visit https://ffmpegwasm-0-11-x.netlify.app
ffmpegwasm.netlify.app
์์ ๊ณต์ ์ฌ์ดํธ์ ๋๋ถ์ด ๋ฆฌ์กํธ์์ FFmpeg๋ฅผ ์ฌ์ฉํ ์์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ ๊ตฌํํ๋ค.
https://github.com/ffmpegwasm/ffmpeg.wasm/blob/main/apps/react-vite-app/src/App.tsx
๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ฉด์ ๋ฐ๋ ๋ถ๋ถ์ด ๋ง์ ํ๋ก์ ํธ ์ ๊ฐ์์์๋ ๋ค์ด๊ทธ๋ ์ด๋ํ์ฌ FFmpeg๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋ง์์ ํ๋ํ๋ ๋ถ์ํด ๋ณด์๋ค.
๋จผ์ , FFmpeg๋ฅผ ์์ฑ์ ํจ์๋ก ์ ์ธํ๋ค.
const ffmpeg = new FFmpeg();
ffmpeg ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ํ๋ก์ ํธ ๋ง์ดํธ ์ ffmpeg๋ฅผ ๋ก๋ํ๋ค.
useEffect(() => {
async function loadFFmpeg() {
await ffmpeg.load();
}
loadFFmpeg();
setFfmpegLoaded(true);
}, []);
๋ค์์ผ๋ก ํ์ผ ๋ด๋ณด๋ด๊ธฐ์ ๊ด๋ จ๋ ํจ์์ด๋ค.
writeFile์ด๋ ํจ์๋ ๋น๋์ค ํ์ผ์ ๋ก์ปฌ ํ๊ฒฝ์ ์ ์ฅํ๋ ํจ์์ด๋ค.
ํ์ผ ์ด๋ฆ๊ณผ ๊ฐ์ ธ์ฌ ํ์ผ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.
URL.createObjectURL ํจ์๋ก ๋น๋์ค ํ์ผ์ Blob URL์ ์์ฑํ๊ณ fetchFileํจ์์ ์ ๋ฌํด ๋น๋์ค ํ์ผ์ ๊ฐ์ ธ์จ๋ค.
const writeFile = async inputFileName => {
return await ffmpeg.writeFile(
inputFileName,
await fetchFile(URL.createObjectURL(videoFile))
);
};
exec ํจ์๋ก ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ํํ ์ ์๋ค.
ffmpeg -ss [์์์๊ฐ] -i input.mp4 -t [์ง์์๊ฐ] -f gif output.gif
์์ ๋ช ๋ น์ด๋ mp4 ํ์ผ์ ์ํ๋ ์๊ฐ ๋งํผ ์๋ผ gif ํ์ผ๋ก ์ ์ฅํ ์ ์๋ ffmpeg ๋ช ๋ น์ด์ด๋ค.
์ ๊ฐ๋ค์ ๋ฐฐ์ด์ ๋ด์ exec ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ค.
await ffmpeg.exec([
'-i',
`${inputFileName}`,
'-ss',
`${minTime}`,
'-t',
`${maxTime - minTime}`,
'-f',
'gif',
`${outputFileName}`,
]);
๋ณํ๋ ํ์ผ์ ์ฝ์ด์ Bolo URL๋ก ๋ณํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ,
const data = await ffmpeg.readFile(outputFileName);
const gifURL = URL.createObjectURL(
new Blob([data.buffer], { type: 'image/gif' })
);
url์ a ํ๊ทธ์ ๋ด์ ํด๋ฆญํ์ฌ ๋ค์ด๋ก๋ ๋๋๋ก ๊ตฌํํ์๋ค.
const downloadFile = dataURL => {
const link = document.createElement('a');
link.href = dataURL;
link.setAttribute('download', '');
link.click();
};
๋ง๋ฌด๋ฆฌ
์ฒ์์ ์ฝ๋๋ง ๋ณด๊ณ ffmpeg ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ดํดํ๊ธฐ ์ด๋ ค์ ๋๋ฐ ๊ณ์ ๋ณด๋ฉด์ ์ด์ฌํ ๋ถ์ํด์ ์ดํดํ๊ฒ ๋์๋ค.
๊ทธ ๋์ ๋น๋์ค ๋ด๋ณด๋ด๊ธฐ, ์์ฑ ๋ด๋ณด๋ด๊ธฐ ๋ฑ์ ๊ธฐ๋ฅ๋ ์ฝ๊ฒ ์์ฉํ์ฌ ๊ตฌํํ ์ ์์๋ค. ๋ฟ๋ฏํ๋ค ^__^