클라이언트 업무 및 앱 개발 업무를 위해 저는 종종 다음과 같은 필요가 있습니다. 동영상 콘텐츠를 빠르게 시각화합니다:
- 제품 관리자를 위한 미리보기 애니메이션
- 문서 또는 PRD용 데모 영상
- 소셜 미디어 게시물이나 랜딩 페이지에 적합한 가벼운 모션 그래픽
이러한 경우, MP4 파일에서 몇 개의 주요 프레임을 추출하여 반복 재생되는 WebP 애니메이션으로 변환합니다. 일반적으로 이 정도면 충분하며, 전체 영상을 업로드하는 것보다 훨씬 가볍습니다.

이 기사는 다음을 공유합니다. macOS용 원클릭 셸 스크립트 저것:
- MP4에서 6~12개의 균일한 간격의 프레임을 추출합니다.
- 크기를 720px 너비로 조정합니다.
- 반복 재생되는 WebP 애니메이션을 생성합니다.
- 자동으로 설치됩니다
ffmpeg만약 그것이 없다면
이 모든 작업은 터미널에서 단 하나의 명령으로 실행됩니다.
1. 스크립트의 기능
macOS에서 스크립트는 다음과 같습니다. extract_even_frames_webp.sh 제공합니다:
- 오토매틱
ffmpeg감지 및 설치- 확인 여부
ffmpeg이용 가능합니다 - 그렇지 않으면 (필요한 경우) Homebrew를 설치한 다음 설치합니다.
ffmpeg
- 확인 여부
- 프레임 추출조차도
- 동영상 재생 시간을 계산합니다.
- 균등하게 샘플링 6~12프레임 영상 전체에 걸쳐
- 기본값은 6프레임이지만, 프레임 수를 사용자 지정할 수 있습니다.
- WebP 애니메이션 생성
- 추출된 PNG 프레임을 하나로 결합합니다. 웹P 루핑
- 출력 너비는 720픽셀 기본적으로 (높이는 비례적으로 조정됩니다)
- 품질은 다음을 통해 조정할 수 있습니다.
-q:v
- 자동 정리
- 중간 프레임을 임시 디렉터리에 저장합니다.
- WebP 파일 생성 후 임시 디렉토리를 삭제합니다.
- 짧은 영상과 긴 영상 모두에서 작동합니다.
- 동영상 길이가 매우 짧으면 프레임 수가 자동으로 줄어듭니다.
- 긴 동영상의 경우, 프레임은 전체 재생 시간 동안 항상 균등한 간격으로 배치됩니다.
2. 내부 작동 방식
이 스크립트의 기본 논리는 다음과 같습니다.
2.1 종속성 확인
스크립트는 먼저 다음을 확인합니다. ffmpeg 설치되었습니다:
- 용도
명령어 -v ffmpeg - 찾을 수 없으면 다음을 확인합니다.
꾸미다- Homebrew가 설치되어 있지 않으면 Homebrew를 설치합니다.
- 그런 다음 사용합니다
brew install ffmpeg설치하기ffmpeg
2.2 비디오 재생 시간 가져오기
사용 ffprobe, 스크립트는 다음과 같이 읽습니다. 동영상의 총 길이(초).
이를 바탕으로 원하는 프레임 수를 고려하여 프레임 간 시간 간격을 계산합니다.
2.3 프레임을 균등하게 샘플링
각 프레임 인덱스에 대해 다음과 같습니다.
- 타임스탬프를 계산합니다 =
인덱스 × 간격 - 용도
ffmpeg -ss해당 시간 위치로 이동하려면 - 정확히 한 프레임을 추출합니다.
- 크기를 조정합니다.
스케일=720:-1따라서 너비는 720px이고 높이는 그에 비례합니다.
2.4 WebP 애니메이션 제작
모든 프레임이 PNG 파일로 저장되면 스크립트가 호출됩니다. ffmpeg 다시:
- 순서대로 읽으세요.
%03d.png) - 애니메이션 WebP 형식으로 인코딩합니다.
- 세트
-루프 0그래서 애니메이션이 무한히 반복됩니다. - 품질을 관리하세요
-q:v 70(값이 낮을수록 화질이 높고 파일 크기가 커집니다.)
2.5 정리
모든 중간 PNG 파일은 임시 디렉터리에 저장됩니다. mktemp -d.
WebP 파일이 생성된 후 해당 디렉터리는 삭제됩니다. rm -rf.
3. 전체 셸 스크립트: extract_even_frames_webp.sh
다음 스크립트를 다음과 같이 저장할 수 있습니다. extract_even_frames_webp.sh Mac에서:
#!/bin/bash
# Usage: ./extract_even_frames_webp.sh input.mp4 output.webp [frames]
# frames is optional, default 6, maximum 12
INPUT="$1"
OUTPUT="$2"
FRAMES="${3:-6}"
# Cap maximum frames at 12
if [ "$FRAMES" -gt 12 ]; then
FRAMES=12
fi
if [ -z "$INPUT" ] || [ -z "$OUTPUT" ]; then
echo "Usage: $0 input.mp4 output.webp [frames]"
exit 1
fi
# ---------------------------------
# 1️⃣ Check ffmpeg
# ---------------------------------
if ! command -v ffmpeg >/dev/null 2>&1; then
echo "⚠️ ffmpeg not found, starting installation..."
if ! command -v brew >/dev/null 2>&1; then
echo "⚠️ Homebrew not found, installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo "✅ Homebrew installed"
else
echo "✅ Homebrew already installed"
fi
brew update
brew install ffmpeg
if ! command -v ffmpeg >/dev/null 2>&1; then
echo "❌ ffmpeg installation failed, please check manually"
exit 1
fi
echo "🎉 ffmpeg installed successfully!"
else
echo "✅ ffmpeg is already installed"
fi
# ---------------------------------
# 2️⃣ Get video duration
# ---------------------------------
DURATION=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$INPUT")
if [[ -z "$DURATION" ]]; then
echo "❌ Failed to get video duration"
exit 1
fi
DURATION=${DURATION%.*} # integer seconds
# If video is shorter than requested frames, match frame count to duration
if [ "$DURATION" -lt "$FRAMES" ]; then
FRAMES=$DURATION
fi
echo "📹 Video length: ${DURATION}s, extracting $FRAMES frames evenly"
# ---------------------------------
# 3️⃣ Create temporary directory
# ---------------------------------
TMPDIR=$(mktemp -d)
# ---------------------------------
# 4️⃣ Calculate interval
# ---------------------------------
INTERVAL=$(echo "scale=6; $DURATION/$FRAMES" | bc)
echo "⏱ Frame interval: $INTERVAL seconds"
# ---------------------------------
# 5️⃣ Extract frames
# ---------------------------------
for i in $(seq 0 $(($FRAMES-1))); do
TIME=$(echo "$i * $INTERVAL" | bc)
printf -v FILENAME "%03d.png" $((i+1))
ffmpeg -ss "$TIME" -i "$INPUT" -frames:v 1 -vf "scale=720:-1" \
"$TMPDIR/$FILENAME" -hide_banner -loglevel error
done
# ---------------------------------
# 6️⃣ Generate animated WebP
# ---------------------------------
ffmpeg -y -i "$TMPDIR/%03d.png" -vcodec libwebp -lossless 0 -q:v 70 \
-loop 0 -preset picture "$OUTPUT" -hide_banner -loglevel error
# ---------------------------------
# 7️⃣ Clean up
# ---------------------------------
rm -rf "$TMPDIR"
echo "🎉 Done! Generated file: $OUTPUT"
4. macOS에서 스크립트를 사용하는 방법
- 스크립트를 저장하세요 위 내용을 다음과 같이 저장하세요.
extract_even_frames_webp.sh, 예를 들어 홈 디렉터리에 있습니다. - 실행 권한을 부여하세요
chmod +x extract_even_frames_webp.sh
- 기본 사용법
./extract_even_frames_webp.sh input.mp4 output.webp
이것은 다음과 같을 것입니다:
- 확인 또는 설치
ffmpeg - 균등한 간격으로 6개의 프레임을 추출합니다.
- 생성
output.webp720px 너비에서
- 프레임 수를 지정하십시오(6~12).
./extract_even_frames_webp.sh input.mp4 output.webp 8
이렇게 하면 기본값인 6프레임 대신 8프레임이 추출됩니다.
5. 이 워크플로가 유용한 이유
수동으로 비디오 편집기를 열거나 GUI 변환기를 클릭하는 것과 비교했을 때, 이 스크립트는 몇 가지 장점이 있습니다.
- 수동 설정 없음
- 자동으로 설치됩니다
ffmpeg(필요하다면 홈브루도 포함) - 설치 프로그램을 찾거나 명령어를 기억할 필요가 없습니다.
- 자동으로 설치됩니다
- 스마트 프레임 샘플링
- 짧은 영상의 경우 프레임 수를 자동으로 줄입니다.
- 긴 동영상의 경우, 프레임은 항상 전체 재생 시간 동안 균등한 간격으로 배치됩니다.
- 품질 및 크기 관리
-q:vWebP 품질과 파일 크기 간의 조정을 가능하게 합니다.스케일=720:-1웹 친화적인 너비와 일관된 화면 비율을 제공합니다.
- 기본적으로 반복
-루프 0WebP 애니메이션이 무한 반복되도록 만듭니다.- 문서나 웹사이트의 미리보기, 데모, 그리고 미묘한 움직임에 적합합니다.
- 디스크 사용량 정리
- 임시 PNG 프레임은 임시 폴더에 저장되었다가 사용 후 삭제됩니다.
- 시간이 지나도 남은 파일이 쌓이지 않습니다.
6. 예시: 20초 분량의 MP4 파일을 WebP 미리보기로 변환하기
만약 당신에게 그런 상황이 있다고 상상해 보세요. 20초 분량의 기능 데모 영상 그리고 실행하세요:
./extract_even_frames_webp.sh demo.mp4 demo-preview.webp 6
스크립트는 다음과 같은 기능을 수행합니다.
- 대략적인 간격을 계산하세요 3.33초
- 6프레임을 추출합니다.
0초, 3.33초, 6.66초, 10초, 13.33초, 16.66초 - 이미지 크기를 너비 720px로 조정하세요.
- 건설하다 웹P 루핑 생기
그런 다음 이 WebP 파일을 다음 위치에 드롭하면 됩니다.
- 제품 문서 또는 Feishu/Notion 문서를 경량 미리보기
- 소셜 미디어 게시물 또는 랜딩 페이지 자동 재생 모션 썸네일
- PPT 자료나 내부 데모처럼 전체 영상이 과한 경우에 사용하는 경우
7. 확장 아이디어
이 스크립트는 시작점일 뿐이며, 여러분의 작업 흐름에 맞게 쉽게 수정할 수 있습니다.
- 동적 프레임 수
- 동영상 길이에 따라 6~12프레임 중 하나를 자동으로 선택합니다.
- 예를 들어, 더 긴 클립에는 더 많은 프레임을 사용하여 더 많은 상태를 보여줄 수 있습니다.
- 맞춤 사이즈
- 변화
스케일=720:-1제품 팀에서 선호하는 어떤 너비로든 조정 가능합니다. - 또는 너비를 매개변수로 노출합니다.
./script.sh in.mp4 out.webp 8 1080
- 변화
- 일괄 처리
- 이 스크립트를 다른 루프로 감싸서 모두 처리하세요.
.mp4폴더 안의 파일들 - 여러 기능 데모를 한 번에 내보낼 때 유용합니다.
- 이 스크립트를 다른 루프로 감싸서 모두 처리하세요.
저자의 말
이 스크립트는 MP4 비디오를 용량이 작은 WebP 미리보기 이미지로 변환하는 제 실제 macOS 개발 워크플로에서 가져온 것입니다. 저는 이 스크립트를 활용하여 문서 및 소셜 미디어 게시물용 데모 애니메이션을 제작하는 데 매일 사용하고 있습니다. GPT는 이 글의 영어 버전을 번역, 구성 및 다듬는 데만 사용되었으며, 스크립트의 논리, 구현 세부 사항 및 사용 패턴은 모두 제 프로젝트 경험을 바탕으로 작성되었습니다.


