클라이언트 업무 및 앱 개발 업무를 위해 저는 종종 다음과 같은 필요가 있습니다. 동영상 콘텐츠를 빠르게 시각화합니다:
- 제품 관리자를 위한 미리보기 애니메이션
- 문서 또는 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 다시:
- 순서대로 읽으세요.
d.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 # 사용법: ./extract_even_frames_webp.sh input.mp4 output.webp [frames] # 프레임은 선택 사항이며 기본값은 6, 최대값은 12입니다. INPUT="$1" OUTPUT="$2" FRAMES="${3:-6}" # 최대 프레임 수를 12로 제한합니다. if [ "$FRAMES" -gt 12 ]; then FRAMES=12 fi if [ -z "$INPUT" ] || [ -z "$OUTPUT" ]; then echo "사용법: $0 input.mp4 output.webp [frames]" exit 1 fi # --------------------------------- # 1️⃣ ffmpeg 확인 # --------------------------------- if ! `command -v ffmpeg >/dev/null 2>&1;`이면 `echo "⚠️ ffmpeg을 찾을 수 없습니다. 설치를 시작합니다..."`를 출력하고, `command -v brew >/dev/null 2>&1;`이면 `echo "⚠️ Homebrew를 찾을 수 없습니다. Homebrew를 설치합니다..." `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`를 출력하여 `echo "✅ Homebrew 설치 완료"를 출력하고, 그렇지 않으면 `echo "✅ Homebrew가 이미 설치되어 있습니다"를 출력합니다. `brew update`, `brew install ffmpeg`를 차례로 실행합니다. `command -v ffmpeg >/dev/null 2>&1;`이면 `echo "❌ ffmpeg 설치에 실패했습니다. 수동으로 확인하십시오."를 출력하고, 종료 코드 1을 실행합니다. 마지막으로 `echo "🎉 ffmpeg이 성공적으로 설치되었습니다!"`를 출력합니다. else echo "✅ ffmpeg이 이미 설치되어 있습니다." fi # --------------------------------- # 2️⃣ 비디오 길이 가져오기 # --------------------------------- DURATION=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$INPUT") if [[ -z "$DURATION" ]]; then echo "❌ 비디오 길이를 가져오는 데 실패했습니다." exit 1 fi DURATION=${DURATION%.*} # 정수 초 # 비디오 길이가 요청된 프레임 수보다 짧으면 프레임 수를 길이에 맞춥니다. if [ "$DURATION" -lt "$FRAMES" ]; 그런 다음 FRAMES=$DURATION fi echo "📹 비디오 길이: ${DURATION}초, $FRAMES 프레임을 균등하게 추출합니다." # --------------------------------- # 3️⃣ 임시 디렉터리 생성 # --------------------------------- TMPDIR=$(mktemp -d) # --------------------------------- # 4️⃣ 간격 계산 # --------------------------------- INTERVAL=$(echo "scale=6; $DURATION/$FRAMES" | bc) echo "⏱ 프레임 간격: $INTERVAL초" # --------------------------------- # 5️⃣ 프레임 추출 # --------------------------------- for i in $(seq 0 $(($FRAMES-1))); TIME=$(echo "$i * $INTERVAL" | bc) printf -v FILENAME "d.png" $((i+1)) ffmpeg -ss "$TIME" -i "$INPUT" -frames:v 1 -vf "scale=720:-1" \ "$TMPDIR/$FILENAME" -hide_banner -loglevel error done # --------------------------------- # 6️⃣ 애니메이션 WebP 생성 # --------------------------------- ffmpeg -y -i "$TMPDIR/d.png" -vcodec libwebp -lossless 0 -q:v 70 \ -loop 0 -preset picture "$OUTPUT" -hide_banner -loglevel error # --------------------------------- # 7️⃣ # 정리 --------------------------------- rm -rf "$TMPDIR" echo "🎉 완료! 생성된 파일: $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는 이 글의 영어 버전을 번역, 구성 및 다듬는 데만 사용되었으며, 스크립트의 논리, 구현 세부 사항 및 사용 패턴은 모두 제 프로젝트 경험을 바탕으로 작성되었습니다.


