메뉴 닫기

OpenCV VideoWriter fourcc mp4v XVID H264 완벽 가이드 프레임 사이즈와 색상 공간 일치로 끊김 없이 저장하는 법

OpenCV VideoWriter fourcc mp4v XVID H264 완벽 가이드 프레임 사이즈와 색상 공간 일치로 끊김 없이 저장하는 법

📌 실전 코드와 함께 실패 없는 동영상 저장 설정을 한 번에 정리합니다

프로젝트에선 영상 처리 결과를 파일로 남기는 순간이 반드시 찾아옵니다. 그런데 저장한 파일이 재생되지 않거나 색이 뒤틀리고, 프레임이 깨지는 문제를 겪기 쉽죠. 원인은 대부분 코덱 fourcc 선택프레임 사이즈·FPS·색상 공간 불일치에 있습니다. 이 글은 파이썬 OpenCV의 VideoWriter를 기준으로 mp4v, XVID, H264를 올바르게 고르는 법과 반드시 맞춰야 할 파라미터를 순서대로 짚어줍니다. OpenCV가 기본적으로 BGR을 사용한다는 점과 저장 시 기대 색상 채널을 정확히 전달해야 한다는 핵심도 함께 정리합니다.

또한 플랫폼별로 H.264 인코딩이 바로 동작하지 않을 수 있고, 이때는 FFmpeg 또는 GStreamer 백엔드 의존성과 컨테이너 조합을 점검해야 합니다. fourcc는 단순한 문자열이 아니라 인코더와 컨테이너, 시스템 코덱 설치 상태가 함께 맞아야 의미가 있기 때문입니다. 문서에 명시된 VideoWriter 초기화 규칙과 프레임 크기 일치 원칙을 기준으로 안정적인 설정 템플릿을 제시하니, 그대로 따라 해도 재생 호환성이 높게 나옵니다. 필요한 참고 링크도 함께 덧붙여 실제 환경에서 바로 적용할 수 있도록 도와드립니다.



🔗 VideoWriter 기본 개념과 fourcc 코드

OpenCV의 VideoWriter는 이미지 프레임을 순차적으로 받아 하나의 동영상 파일로 기록하는 객체입니다.
생성 시점에 파일 경로, fourcc, FPS, 프레임 크기, 컬러 여부를 정확히 지정하면, 이후 write(frame)로 프레임을 쌓아 저장합니다.
이때 가장 중요한 원칙은 프레임 크기와 색상 공간을 일관되게 유지하는 것입니다.
초기에 지정한 (width, height)와 다른 크기의 프레임을 전달하면 저장 실패나 화면 깨짐이 발생하고, BGR과 RGB를 혼용하면 색이 틀어져 보입니다.

fourcc는 영상 코덱을 나타내는 4문자 코드로, 인코딩 방식과 호환성에 직접적인 영향을 줍니다.
학습과 실무에서 자주 쓰는 선택지는 ‘mp4v’, ‘XVID’, ‘H264’입니다.
일반적으로 .mp4 컨테이너에는 mp4v/H264가, .avi 컨테이너에는 XVID가 잘 맞습니다.
환경에 따라 코덱 가용성은 달라질 수 있으므로, 파일 확장자와 fourcc의 조합을 합리적으로 선택하고, writer.isOpened()로 개방 성공 여부를 반드시 확인하세요.

fourcc 권장 컨테이너
mp4v .mp4
XVID .avi
H264 .mp4
CODE BLOCK
import cv2

# 1) 필수 파라미터
fps = 30
size = (1280, 720)  # width, height (모든 프레임이 정확히 이 크기여야 함)

# 2) fourcc 선택: 'mp4v', 'XVID', 'H264' 중 환경과 컨테이너에 맞게 고르기
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 또는 *'XVID', *'H264'

# 3) VideoWriter 생성
writer = cv2.VideoWriter('output.mp4', fourcc, fps, size, isColor=True)

if not writer.isOpened():
    raise RuntimeError('VideoWriter 초기화 실패: fourcc/경로/권한/코덱 가용성 확인')

# 4) 프레임 쓰기 예시 (frame은 BGR 채널 순서)
# RGB 이미지를 사용 중이라면: frame = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)
for i in range(150):
    frame = cv2.imread('frames/frame_%04d.png' % i)  # (720p, BGR)
    if frame is None or (frame.shape[1], frame.shape[0]) != size:
        frame = cv2.resize(frame, size)  # 크기 맞추기 (권장: 처음부터 동일 크기 생성)
    writer.write(frame)

writer.release()

💡 코덱 선택 팁: 빠른 미리보기용이면 mp4v가 무난하고, AVI 호환성이 필요하면 XVID를 고려합니다.
고효율과 작은 용량이 필요하면 H264가 적합합니다.
단, 시스템에 해당 인코더가 준비되어 있어야 하니 초기화 성공 여부를 항상 점검하세요.

⚠️ 프레임 크기와 색상 공간은 프로젝트 전 구간에서 동일해야 합니다.
처음부터 BGR 기준으로 처리하고, 외부 라이브러리로 얻은 RGB 이미지는 저장 전에 cv2.cvtColor(..., cv2.COLOR_RGB2BGR)로 변환하세요.
그레이스케일만 다룬다면 isColor=False로 생성하고 단일 채널 이미지를 전달합니다.

  • 🛠️파일 확장자와 fourcc 조합 합리적으로 선택하기 (mp4v/H264→.mp4, XVID→.avi)
  • ⚙️FPS, (width, height), isColor를 생성 시점에 정확히 지정
  • 🔌writer.isOpened()로 초기화 성공 확인 후 프레임 기록
  • 🧩BGR↔RGB 혼용 방지, 필요 시 cvtColor로 변환

🛠️ 코덱 선택 가이드 mp4v XVID H264

동영상 저장에서 가장 큰 고민은 어떤 코덱을 선택해야 하느냐입니다.
OpenCV는 FFmpeg 또는 플랫폼의 기본 인코더를 호출하기 때문에, 같은 fourcc라도 실행 환경에 따라 결과가 달라질 수 있습니다.
따라서 용도에 맞는 코덱을 합리적으로 선택하는 것이 중요합니다.
일반적으로 mp4v는 범용성이 높아 초보자에게 가장 안정적이고, XVID는 AVI 컨테이너와 궁합이 좋아 Windows 호환성이 뛰어납니다.
H264는 고압축·고효율 코덱으로 용량 절약에 탁월하지만, 시스템에 따라 인코더 설치가 필요할 수 있습니다.

📌 mp4v 언제 사용할까?

mp4v는 MPEG-4 Part 2 계열 코덱으로, .mp4 확장자와 가장 흔히 쓰입니다.
대부분의 플레이어에서 바로 재생 가능하며, 인코딩 속도가 빠른 편이라 학습용이나 테스트 영상 저장에 적합합니다.
다만 최신 압축 기술은 아니므로 파일 용량은 H.264보다 다소 커질 수 있습니다.

📌 XVID의 장점

XVID는 MPEG-4 계열의 오픈소스 코덱으로, 특히 AVI 확장자와 함께 사용될 때 호환성이 좋습니다.
윈도우 환경에서 오래 전부터 표준처럼 활용되어 왔기 때문에 다양한 재생기에서 무리 없이 열립니다.
다만 모바일 기기나 최신 브라우저에서는 AVI 컨테이너 자체가 불편할 수 있어, 호환성을 최우선으로 할 경우 다른 선택지를 고려해야 합니다.

📌 H264의 특징

H.264는 가장 널리 쓰이는 고효율 압축 코덱입니다.
적은 용량으로도 높은 화질을 유지할 수 있어 스트리밍과 장기 보관 영상에 많이 쓰입니다.
그러나 OpenCV에서 H264를 사용하려면 FFmpeg 빌드 시 libx264 지원이 포함되어 있어야 하며, 운영체제별로 환경 차이가 발생할 수 있습니다.
만약 초기화에 실패한다면 다른 코덱을 우선 사용하거나 FFmpeg 설치 상태를 확인하세요.

💎 핵심 포인트:
저장할 동영상의 최종 재생 환경을 먼저 생각하고 코덱을 선택하세요. 예를 들어 브라우저 재생이 목적이라면 mp4 + H264 조합이 가장 안전합니다.

CODE BLOCK
# 코덱별 VideoWriter 예시
import cv2

fps = 30
size = (640, 480)

# mp4v
writer_mp4v = cv2.VideoWriter('test_mp4v.mp4',
    cv2.VideoWriter_fourcc(*'mp4v'), fps, size)

# XVID
writer_xvid = cv2.VideoWriter('test_xvid.avi',
    cv2.VideoWriter_fourcc(*'XVID'), fps, size)

# H264 (환경에 따라 실패할 수 있음)
writer_h264 = cv2.VideoWriter('test_h264.mp4',
    cv2.VideoWriter_fourcc(*'H264'), fps, size)

⚠️ H264는 환경 의존성이 높아, Windows에서는 잘 작동해도 macOS나 Linux에선 실패할 수 있습니다.
FFmpeg를 직접 설치하고 ffmpeg -codecs 명령으로 지원 여부를 확인하세요.



⚙️ 프레임 크기 FPS 색상 공간 맞추기

OpenCV에서 동영상을 저장할 때는 단순히 fourcc만 올바르게 선택한다고 끝이 아닙니다.
프레임 크기, FPS, 색상 공간이 초기 설정과 입력되는 모든 프레임에서 반드시 일치해야 합니다.
이 규칙을 어기면 영상이 깨지거나 저장 자체가 실패할 수 있습니다.
특히 frame.shape이 지정한 크기와 다를 경우 자동으로 맞춰주지 않으므로, 개발자가 직접 resize를 수행해야 합니다.

📌 프레임 크기 일치

VideoWriter 생성 시 지정한 (width, height)는 절대 기준입니다.
입력 프레임이 이 크기와 다르면 오류가 발생하거나 결과가 재생 불가 상태로 저장됩니다.
가장 좋은 방법은 애초에 프레임을 동일한 크기로 준비하는 것입니다.
불가피할 경우 cv2.resize를 이용해 정확히 맞춰야 합니다.

📌 FPS 설정

FPS는 초당 프레임 수를 의미하며, 동영상의 재생 속도와 직결됩니다.
원본 영상의 FPS를 유지하려면 cap.get(cv2.CAP_PROP_FPS)로 값을 읽어와 그대로 사용하면 됩니다.
FPS를 임의로 변경하면 영상이 빨라지거나 느려져 의도하지 않은 결과가 나올 수 있습니다.

📌 색상 공간 일관성

OpenCV는 기본적으로 BGR 색상 공간을 사용합니다.
따라서 VideoWriter는 입력 프레임도 BGR 순서로 받는다고 가정합니다.
외부 라이브러리에서 가져온 RGB 이미지를 그대로 저장하면 색이 왜곡되어 나타납니다.
이 경우 반드시 cv2.cvtColor(img, cv2.COLOR_RGB2BGR)로 변환해야 합니다.
흑백 이미지만 저장하려면 isColor=False를 지정하고 단일 채널 이미지를 전달합니다.

CODE BLOCK
import cv2

cap = cv2.VideoCapture("input.mp4")

# 원본 영상의 속성 읽기
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
writer = cv2.VideoWriter("output.mp4", fourcc, fps, (width, height), isColor=True)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # RGB 데이터라면 BGR로 변환 필요
    # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

    writer.write(frame)

cap.release()
writer.release()

💎 핵심 포인트:
프레임 크기, FPS, 색상 공간은 프로젝트 전 과정에서 반드시 동일해야 하며, 조금이라도 다르면 영상이 재생되지 않거나 색이 왜곡됩니다.

  • 📏모든 프레임은 지정된 (width, height)와 동일해야 함
  • ⏱️FPS는 원본 영상의 값 또는 목표 재생 속도에 맞춰 설정
  • 🎨BGR과 RGB 혼동 금지, 필요 시 cvtColor 사용

🔌 파일 저장 경로와 컨테이너 설정

코덱과 프레임 설정이 올바르더라도, 파일 경로와 컨테이너 확장자가 맞지 않으면 저장에 실패하거나 영상이 재생되지 않는 문제가 생깁니다.
특히 Windows에서는 경로 인코딩 문제로 한글 디렉터리에 저장 시 오류가 발생하기도 하며, Linux와 macOS에서는 권한 문제가 자주 발생합니다.
따라서 저장 경로는 되도록 영문 경로를 사용하고, 쓰기 권한이 있는 위치를 지정하는 것이 안정적입니다.

📌 컨테이너와 코덱 매칭

컨테이너는 영상과 음성을 감싸는 껍데기이며, 확장자로 구분됩니다.
가장 일반적인 조합은 .mp4 + mp4v/H264, .avi + XVID입니다.
컨테이너와 코덱을 잘못 조합하면 저장은 되더라도 일부 재생기에서 호환되지 않습니다.
예를 들어 H264를 .avi에 저장하면 플레이어 호환성이 크게 떨어질 수 있습니다.

📌 경로 설정 주의사항

파일 경로를 지정할 때는 절대경로 또는 실행 경로 기준 상대경로를 명확히 지정해야 합니다.
특히 Jupyter Notebook 같은 환경에서는 현재 작업 디렉터리가 다를 수 있으니, os.getcwd()로 확인하는 것이 좋습니다.
또한 경로에 공백이나 특수문자가 포함되면 저장 실패 가능성이 있으므로 가급적 단순한 경로를 사용하는 것이 안전합니다.

CODE BLOCK
import cv2, os

# 저장 경로 설정 (영문 경로 권장)
save_path = os.path.join("output_videos", "result.mp4")
os.makedirs(os.path.dirname(save_path), exist_ok=True)

fps = 30
size = (640, 480)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

writer = cv2.VideoWriter(save_path, fourcc, fps, size, isColor=True)

if not writer.isOpened():
    raise RuntimeError("VideoWriter 초기화 실패: 컨테이너/코덱/경로 확인 필요")

# 프레임 쓰기 예시
# writer.write(frame)
writer.release()

💡 경로 문제를 피하려면 프로젝트 디렉터리 내에 output_videos 폴더를 만들어 관리하는 것이 좋습니다.
이렇게 하면 운영체제별 권한 이슈와 경로 혼동을 줄일 수 있습니다.

⚠️ 컨테이너와 코덱이 맞지 않으면 일부 플레이어에서 재생되지 않습니다.
특히 H264는 .mp4 확장자와 함께 사용하는 것이 안전합니다.

  • 📂경로는 되도록 영문 디렉터리 사용
  • 🧩컨테이너와 fourcc 조합 확인 (mp4v/H264 → .mp4, XVID → .avi)
  • 🔑저장 위치에 쓰기 권한 있는지 확인
  • 🎬잘못된 확장자 사용 금지 (예: H264 + .avi)



💡 에러 트러블슈팅과 품질 최적화

VideoWriter를 사용할 때 자주 발생하는 문제는 크게 두 가지입니다.
하나는 파일이 아예 저장되지 않거나 0KB로 생성되는 경우, 또 하나는 영상이 저장되지만 재생이 불가능하거나 색이 깨져 보이는 경우입니다.
이 문제는 대부분 fourcc, 프레임 크기, FPS, 색상 공간이 올바르게 설정되지 않았을 때 발생합니다.

📌 흔한 에러 상황과 해결법

  • 🚫출력 파일이 비어 있음 → fourcc와 확장자 조합을 점검하고 writer.isOpened() 확인
  • 🎨영상 색이 왜곡됨 → RGB/BGR 변환 누락 여부 점검
  • 📏프레임 크기 불일치 에러 → cv2.resize로 맞춰 전달
  • 🔊소리가 없는 영상 저장 → OpenCV는 음성 처리를 지원하지 않음, FFmpeg로 후처리 필요

📌 품질 최적화 팁

저장 품질은 주로 코덱과 비트레이트에 따라 결정됩니다.
OpenCV 기본 VideoWriter는 비트레이트를 직접 제어하기 어렵지만, fourcc 선택과 FPS, 해상도를 통해 간접적으로 품질을 조절할 수 있습니다.
고해상도 + 고FPS 조합은 화질을 개선하지만 파일 크기가 급격히 커집니다.
필요한 경우 FFmpeg를 직접 호출하여 비트레이트 옵션을 지정하는 것이 가장 확실한 방법입니다.

CODE BLOCK
# FFmpeg로 비트레이트 조정 예시 (터미널 명령)
ffmpeg -i output.mp4 -b:v 4M -bufsize 4M optimized_output.mp4

💬 OpenCV VideoWriter는 영상 저장 기능에 집중되어 있어 음성 트랙이나 고급 인코딩 옵션은 직접 지원하지 않습니다. 영상 + 음성을 모두 다루거나 정밀한 압축률 제어가 필요하다면 FFmpeg 같은 전문 툴을 병행하는 것이 가장 좋습니다.

💡 TIP: 저장 전 writer.isOpened() 확인은 필수입니다. 초기화에 실패했는데도 프레임을 계속 write하면 0KB짜리 손상된 파일만 남습니다.

자주 묻는 질문 FAQ

VideoWriter로 저장했는데 파일 크기가 0KB입니다
fourcc와 확장자 조합이 맞지 않거나, 프레임 크기와 FPS 설정이 잘못된 경우 발생합니다. writer.isOpened()로 초기화 성공 여부를 꼭 확인하세요.
H264로 저장했는데 재생이 안 돼요
H264는 환경에 따라 지원 여부가 달라집니다. FFmpeg 설치와 libx264 지원 여부를 확인하고, 안 될 경우 mp4v 같은 다른 코덱을 먼저 사용하세요.
영상 색상이 이상하게 저장되는 이유는 무엇인가요?
OpenCV는 BGR을 기본으로 사용합니다. RGB 데이터를 그대로 저장하면 색이 틀어져 보이므로 cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) 변환 후 저장해야 합니다.
프레임 크기가 다른 이미지를 섞어 저장할 수 있나요?
불가능합니다. VideoWriter는 모든 프레임이 동일한 크기여야 합니다. 크기가 다른 프레임은 cv2.resize로 맞춘 후 저장해야 합니다.
OpenCV VideoWriter로 소리까지 함께 저장할 수 있나요?
불가능합니다. OpenCV는 영상 처리에 집중된 라이브러리라 오디오 스트림 저장 기능이 없습니다. 소리가 필요하다면 FFmpeg로 후처리하세요.
AVI와 MP4 중 어떤 걸 선택해야 할까요?
호환성을 우선한다면 MP4가 가장 안전합니다. AVI는 XVID와 함께 쓸 때 안정적이지만, 최신 브라우저 환경에서는 MP4 + H264 조합이 권장됩니다.
FPS 값을 잘못 지정하면 어떤 문제가 생기나요?
FPS가 실제보다 낮으면 영상이 느리게, 높으면 빠르게 재생됩니다. 원본 영상의 FPS를 읽어 그대로 설정하는 것이 가장 안전합니다.
저장한 파일이 특정 플레이어에서만 열려요
컨테이너와 코덱의 조합 문제일 가능성이 큽니다. VLC, mpv 같은 범용 플레이어로 확인해보고, 호환성을 위해 MP4 + mp4v/H264 조합을 추천합니다.

📌 OpenCV VideoWriter 활용 정리

OpenCV의 VideoWriter는 영상 처리 결과를 저장할 때 필수적인 도구이지만, 정확한 설정 없이는 쉽게 오류가 발생합니다.
fourcc 선택에서는 mp4v, XVID, H264 각각의 특징과 컨테이너 조합을 이해하는 것이 중요하며, 프레임 크기·FPS·색상 공간은 반드시 일관성을 유지해야 합니다.
경로와 확장자를 올바르게 설정하고, writer.isOpened() 확인을 습관화하면 저장 실패를 크게 줄일 수 있습니다.
또한 OpenCV는 음성 저장을 지원하지 않으므로, 오디오가 필요하다면 FFmpeg 같은 외부 툴과 병행하는 것이 최적의 방법입니다.
이번 글의 가이드를 참고해 코덱과 설정을 체계적으로 관리하면, 플랫폼과 환경에 구애받지 않고 안정적으로 영상을 저장할 수 있습니다.


🏷️ 관련 태그 : OpenCV, 파이썬영상처리, VideoWriter, fourcc코덱, mp4v, XVID, H264, 프레임크기, 색상공간, FFmpeg