BIBLIOGRAPHY
#Related-Notes
howto
gif-to-mp4.sh
2024-12-30
@user ๋ฆฌ๋ ์ค์์ ์ฌ์ฉํ gif to mp4 ์ ์คํฌ๋ฆฝํธ ๋ง๋ค์ด์ค.
@assistant ๋ฌผ๋ก ์
๋๋ค. ์๋๋ gif
ํ์ผ์ =mp4=๋ก ๋ณํํ๋ ๊ฐ๋จํ ์ ์คํฌ๋ฆฝํธ์
๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ =ffmpeg=๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํํฉ๋๋ค. =ffmpeg=๊ฐ ์ค์น๋์ด ์์ง ์๋ค๋ฉด ๋จผ์ ์ค์นํด์ผ ํฉ๋๋ค.
#!/bin/bash
# ffmpeg๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธ
if ! command -v ffmpeg &> /dev/null
then
echo "ffmpeg๊ฐ ์ค์น๋์ด ์์ง ์์ต๋๋ค. ์ค์น ํ ๋ค์ ์๋ํ์ธ์."
exit 1
fi
# ์ธ์๋ก gif ํ์ผ ์ด๋ฆ์ ๋ฐ์
if [ "$#" -ne 1 ]; then
echo "์ฌ์ฉ๋ฒ: $0 <gif ํ์ผ ์ด๋ฆ>"
exit 1
fi
gif_file="$1"
# ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธ
if [ ! -f "$gif_file" ]; then
echo "ํ์ผ $gif_file ์ด(๊ฐ) ์กด์ฌํ์ง ์์ต๋๋ค."
exit 1
fi
# ์ถ๋ ฅ ํ์ผ ์ด๋ฆ ์ค์
mp4_file="${gif_file%.gif}.mp4"
# gif๋ฅผ mp4๋ก ๋ณํ
ffmpeg -i "$gif_file" -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" "$mp4_file"
if [ $? -eq 0 ]; then
echo "๋ณํ ์๋ฃ: $mp4_file"
else
echo "๋ณํ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."
fi
์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด:
- ์์ ์ฝ๋๋ฅผ
gif_to_mp4.sh
๊ฐ์ ์ด๋ฆ์ผ๋ก ํ์ผ์ ์ ์ฅํฉ๋๋ค. chmod +x gif_to_mp4.sh
๋ช ๋ น์ด๋ก ์คํ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.- ํฐ๋ฏธ๋์์
gif_to_mp4.sh your_gif_file.gif
ํ์์ผ๋ก ์คํํฉ๋๋ค.
์ด ์คํฌ๋ฆฝํธ๋ ์
๋ ฅ๋ gif
ํ์ผ์ =mp4=๋ก ๋ณํํ๊ณ , ๋ณํ๋ ํ์ผ์ ์ด๋ฆ์ ์๋ ํ์ผ ์ด๋ฆ์์ ํ์ฅ์๋ง =mp4=๋ก ๋ณ๊ฒฝํ์ฌ ์ ์ฅํฉ๋๋ค. =ffmpeg=์ ์ต์
์ ํตํด ๋น๋์ค์ ํฌ๊ธฐ๋ฅผ 2์ ๋ฐฐ์๋ก ์กฐ์ ํ์ฌ ํธํ์ฑ์ ๋์์ต๋๋ค.
@user ๋น๋์ค ํฌ๊ธฐ๋ฅผ 2์ ๋ฐฐ์๋ก ์กฐ์ ํ๋ ์ด์ ๋?
@assistant ๋น๋์ค ํฌ๊ธฐ๋ฅผ 2์ ๋ฐฐ์๋ก ์กฐ์ ํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
H.264/AVC ์ธ์ฝ๋ฉ ํธํ์ฑ: H.264/AVC (Advanced Video Coding)์ ๊ฐ์ ๋ง์ ๋น๋์ค ์ฝ๋ฑ์ 2์ ๋ฐฐ์๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ ๋น๋์ค ํ๋ ์์ ๋ ํจ์จ์ ์ผ๋ก ์ธ์ฝ๋ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋น๋์ค ์์ถ ์๊ณ ๋ฆฌ์ฆ์ด 2์ ๋ฐฐ์ ํฌ๊ธฐ์์ ๋ ์ ์๋ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: 2์ ๋ฐฐ์ ํฌ๊ธฐ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ์ฒ๋ฆฌ์์ ๋ ํจ์จ์ ์ ๋๋ค. CPU์ GPU๋ 2์ ๋ฐฐ์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ด ๋ ์์ธก ๊ฐ๋ฅํด์ง๋๋ค.
-
ํ๋์จ์ด ๊ฐ์: ๋ง์ ๊ทธ๋ํฝ ์นด๋์ ํ๋์จ์ด ๊ฐ์ ์ฅ์น๋ค์ 2์ ๋ฐฐ์ ํฌ๊ธฐ์ ๋น๋์ค๋ฅผ ๋ ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ํ๋์จ์ด๊ฐ ์ด๋ฌํ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
๋น๋์ค ์ฌ์ ํธํ์ฑ: ์ผ๋ถ ํ๋ ์ด์ด๋ ๋์ฝ๋๋ 2์ ๋ฐฐ์๊ฐ ์๋ ๋น๋์ค ํฌ๊ธฐ์์ ์ฑ๋ฅ ์ ํ๋ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ๊ฒช์ ์ ์์ต๋๋ค. 2์ ๋ฐฐ์๋ก ์กฐ์ ํ๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค.
-
ํ์ผ ํฌ๊ธฐ ์ต์ ํ: 2์ ๋ฐฐ์๋ก ์กฐ์ ํ๋ฉด ๋น๋์ค ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค. ์ด๋ ๋น๋์ค ์ธ์ฝ๋ฉ ๊ณผ์ ์์ ๋ถํ์ํ ํจ๋ฉ์ด๋ ๋ฐ์ดํฐ ์์ค์ ์ค์ฌ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฐ๋ผ์, ๋น๋์ค ํฌ๊ธฐ๋ฅผ 2์ ๋ฐฐ์๋ก ์กฐ์ ํ๋ ๊ฒ์ ๋น๋์ค์ ํ์ง์ ์ ์งํ๋ฉด์๋ ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ, ์ฌ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ , ํธํ์ฑ์ ๋์ด๋ ์ค์ํ ๋จ๊ณ์ ๋๋ค.
@user ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฒฝ๋ก๋ฅผ ์ธ์๋ก ๋ฐ์์, ๊ฒฝ๋ก์ ์๋ ๋ชจ๋ gif๋ฅผ mp4๋ก ๋ณ๊ฒฝํ๋๋ก ๋ณ๊ฒฝํด์ค. ์ด๋, ์ด๋ฏธ ๋ณ๊ฒฝํ mp4 ํ์ผ์ด ์๋ค๋ฉด ๋ค์ gif๋ก ๋์ด๊ฐ๋ฉด ๋ผ.
@assistant ๋ฌผ๋ก ์
๋๋ค. ์๋๋ ๊ฒฝ๋ก๋ฅผ ์ธ์๋ก ๋ฐ์ ํด๋น ๊ฒฝ๋ก์ ์๋ ๋ชจ๋ gif
ํ์ผ์ =mp4=๋ก ๋ณํํ๋ ์คํฌ๋ฆฝํธ์
๋๋ค. ์ด๋ฏธ ๋ณํ๋ ํ์ผ์ด ์์ผ๋ฉด ๊ฑด๋๋๋๋ค.
#!/bin/bash
# ffmpeg๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธ
if ! command -v ffmpeg &> /dev/null
then
echo "ffmpeg๊ฐ ์ค์น๋์ด ์์ง ์์ต๋๋ค. ์ค์น ํ ๋ค์ ์๋ํ์ธ์."
exit 1
fi
# ์ธ์๋ก ๊ฒฝ๋ก๋ฅผ ๋ฐ์
if [ "$#" -ne 1 ]; then
echo "์ฌ์ฉ๋ฒ: $0 <๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก>"
exit 1
fi
directory="$1"
# ๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํ๋์ง ํ์ธ
if [ ! -d "$directory" ]; then
echo "๋๋ ํ ๋ฆฌ $directory ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค."
exit 1
fi
# ๋๋ ํ ๋ฆฌ ๋ด์ ๋ชจ๋ gif ํ์ผ์ ์ฐพ๊ณ ๋ณํ
for gif_file in "$directory"/*.gif; do
if [ -f "$gif_file" ]; then
# ์ถ๋ ฅ ํ์ผ ์ด๋ฆ ์ค์
mp4_file="${gif_file%.gif}.mp4"
# ์ด๋ฏธ ๋ณํ๋ ํ์ผ์ด ์๋์ง ํ์ธ
if [ ! -f "$mp4_file" ]; then
# gif๋ฅผ mp4๋ก ๋ณํ
ffmpeg -i "$gif_file" -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)/2:trunc(ih/2)/2" "$mp4_file"
if [ $? -eq 0 ]; then
echo "๋ณํ ์๋ฃ: $mp4 ์์ฑ: $gif_file"
fi
else
echo "์ด๋ฏธ ๋ณํ๋ ํ์ผ์ด ์์ต๋๋ค: $mp4_file"
fi
fi
done
์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด:
- ์์ ์ฝ๋๋ฅผ
gif_to_mp4_dir.sh
๊ฐ์ ์ด๋ฆ์ผ๋ก_to_mp4_dir.sh= ๋ช ๋ น์ด๋ก ์คํ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค. - ํฐ๋ฏธ๋์์ =gif
@user ffmpeg ๋์ ์ ๋ก๊ทธ๋ฅผ ์๋ณด์ด๊ฒ ํ๋ ค๋ฉด?assistant ffmpeg=์ ๋ก๊ทธ ์ถ๋ ฅ์ ์จ๊ธฐ๋ ค๋ฉด, =-loglevel
์ต์
์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ ๋ ๋ฒจ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ๋ก๊ทธ๋ฅผ ์์ ํ ์จ๊ธฐ๋ ค๋ฉด -loglevel quiet
์ต์
์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์๋๋ ๋ก๊ทธ ์ถ๋ ฅ์ ์จ๊ธด ์คํฌ๋ฆฝํธ์ ์์
๋๋ค:
#+begin_src sh #!/bin/bash
ffmpeg๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธ
if ! command -v ffmpeg &> /dev/null
@user
@user ์ธ์คํ๊ทธ๋จ ๊ณต์ ์ ์ต์ ํํด์ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๊ฒฝํด์ค๋?
@assistant ์ธ์คํ๊ทธ๋จ์ ๊ณต์ ํ๊ธฐ์ ์ต์ ํ๋ ๋น๋์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์กฐ์ ์ ๊ฐํ ์ ์์ต๋๋ค. ์ธ์คํ๊ทธ๋จ์ ํน์ ๋น๋์ค ํ์๊ณผ ํด์๋, ๋น์จ ๋ฑ์ ์ ํธํฉ๋๋ค. ์๋๋ ์ธ์คํ๊ทธ๋จ์ ์ต์ ํ๋ gif
ํ์ผ์ =mp4=๋ก ๋ณํํ๋ ์คํฌ๋ฆฝํธ์
๋๋ค:
#!/bin/bash
# ffmpeg๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธ
if ! command -v ffmpeg &> /dev/null
then
echo "ffmpeg๊ฐ ์ค์น๋์ด ์์ง ์์ต๋๋ค. ์ค์น ํ ๋ค์ ์๋ํ์ธ์."
exit 1
fi
# ์ธ์๋ก gif ํ์ผ ์ด๋ฆ์ ๋ฐ์
if [ "$#" -ne 1 ]; then
echo "์ฌ์ฉ๋ฒ: $0 <gif ํ์ผ ์ด๋ฆ>"
exit 1
fi
gif_file="$1"
# ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธ
if [ ! -f "$gif_file" ]; then
echo "ํ์ผ $gif_file ์ด(๊ฐ) ์กด์ฌํ์ง ์์ต๋๋ค."
exit 1
fi
# ์ถ๋ ฅ ํ์ผ ์ด๋ฆ ์ค์
mp4_file="${gif_file%.gif}_instagram.mp4"
# ์ธ์คํ๊ทธ๋จ์ ์ต์ ํ๋ ๋น๋์ค ์ค์
# - ์ธ์คํ๊ทธ๋จ์ 1:1, 4:5, 9:16 ๋น์จ์ ๋น๋์ค๋ฅผ ์ ํธํฉ๋๋ค.
# - ํด์๋๋ ์ต๋ 1080x1350, 1080x1920, 1080x1080 ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# - ๋น๋์ค ๋นํธ๋ ์ดํธ๋ 3.5Mbps ์ด์์ ๊ถ์ฅํฉ๋๋ค.
# - ์ค๋์ค ๋นํธ๋ ์ดํธ๋ 128kbps ์ด์์ ๊ถ์ฅํฉ๋๋ค.
# - ํ๋ ์ ๋ ์ดํธ๋ ์ต๋ 30fps๋ฅผ ๊ถ์ฅํฉ๋๋ค.
ffmpeg -i "$gif_file" \
-vf "scale=1080:1080:force_original_aspect_ratio=decrease,pad=1080:1080:(ow-iw)/2:(oh-ih)/2,setsar=1" \
-c:v libx264 -preset slow -crf 22 -b:v 3500k \
-c:a aac -b:a 128k \
-movflags +faststart \
-r 30 \
"$mp4_file"
if [ $? -eq 0 ]; then
echo "์ธ์คํ๊ทธ๋จ์ ์ต์ ํ๋ ๋น๋์ค ๋ณํ ์๋ฃ: $mp4_file"
else
echo "๋ณํ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."
fi
์ด ์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ํฌํจํฉ๋๋ค:
- ๋น๋์ค ํด์๋: 1080x1080์ผ๋ก ์ค์ ํ์ฌ ์ธ์คํ๊ทธ๋จ์ 1:1 ๋น์จ์ ๋ง์ถฅ๋๋ค. ์๋ณธ ๋น๋์ค์ ๋น์จ์ด 1:1์ด ์๋ ๊ฒฝ์ฐ, ๋น๋์ค๋ฅผ ์๋ฅด์ง ์๊ณ ์๋ ๋น์จ์ ์ ์งํ๋ฉด์ 1080x1080 ํฌ๊ธฐ๋ก ํจ๋ฉ์ ์ถ๊ฐํฉ๋๋ค.
- ๋น๋์ค ์ธ์ฝ๋ฉ:
libx264
์ฝ๋ฑ์ ์ฌ์ฉํ๊ณ , =-preset slow=๋ก ํ์ง์ ๋์ด๊ณ , =-crf 22=๋ก ๋น๋์ค ํ์ง์ ์ค์ ํฉ๋๋ค. =-b:v 3500k=๋ก ๋น๋์ค ๋นํธ๋ ์ดํธ๋ฅผ ์ค์ ํ์ฌ ์ธ์คํ๊ทธ๋จ ๊ถ์ฅ ๋นํธ๋ ์ดํธ๋ฅผ ๋ง์ถฅ๋๋ค. - ์ค๋์ค ์ธ์ฝ๋ฉ:
aac
์ฝ๋ฑ์ ์ฌ์ฉํ๊ณ , =-b:a 128k=๋ก ์ค๋์ค ๋นํธ๋ ์ดํธ๋ฅผ ์ค์ ํฉ๋๋ค. - ํ๋ ์ ๋ ์ดํธ: =-r 30=์ผ๋ก ํ๋ ์ ๋ ์ดํธ๋ฅผ 30fps๋ก ์ค์ ํฉ๋๋ค.
- ํ์ผ ์ด๋ฆ: ์๋ณธ ํ์ผ ์ด๋ฆ์ =_instagram=์ ์ถ๊ฐํ์ฌ ์ธ์คํ๊ทธ๋จ์ฉ ํ์ผ์์ ๋ช ํํ ํฉ๋๋ค.
์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์คํ๊ทธ๋จ์ ์ต์ ํ๋ ๋น๋์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ธ์คํ๊ทธ๋จ์ ์๊ตฌ ์ฌํญ์ ์๊ฐ์ด ์ง๋๋ฉด์ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก, ์ต์ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@user