파이썬(Python)/opencv

[Python]OpenCV 동영상 저장하기, 코덱 종류와 사용방법(Video, fourcc, codec)

끄적끄적아무거나 2022. 3. 18. 18:09
반응형

 

목차

     

     

     

     

    파이썬 코덱 종류와 사용방법

     

    파이썬 OpenCV에서 비디오 파일을 다루다 보면 코덱(Codec) 사용을 종종하게 됩니다. 코덱(Codec)이란 영상 파일의 Encode와 Decode를 처리함으로써 우리가 화면에서 보거나 파일로 저장하는 작업을 도와 줍니다

     

    이번 포스트에서는 코덱(Codec)을 사용해서 영상 파일을 저장하는 코드를 작성할 것입니다. 주로 사용하는 코덱은 아래와 같습니다.

     

    • MJPG
    • DIVX
    • H264

     

    H264의 경우 웹브라우져(Web browser) 용 비디오 코덱으로 많이 사용 됩니다. 그 외 각종 코덱은 텍스트의 링크를 통해 확인하실 수 있습니다. 

     

    코덱을 Python에서 사용하는 방법은 간단하게 아래와 같은 방법으로 진행하시면 됩니다. 

     

    	codec = "DIVX"
    	fourcc = cv2.VideoWriter_fourcc(*codec)

     

    fourcc 에 DIVX 코덱 정보를 입력합니다. * (별표) 는 string의 주소를 읽어서 내부 값을 하나씩 불러와 줍니다. 

     

     

     

     

    다음으로 중요한 내용은 어떤 종류의 코덱을 사용해서 동영상(video) 파일을 처리 하냐 입니다. 

     

    사실 코덱으로 영상 파일을 저장했는데 아래와 같은 에러 메세지가 발생하면서 처리가 안되는 경우들이 종종 있습니다. 

     

    에러 메세지>>

    OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 13 and format 'mp4 / MP4 (MPEG-4 Part 14)'
    OpenCV: FFMPEG: fallback to use tag 0x00000020/' ???'

     

     

    사실 코덱 선택에 정답은 없습니다. 예로 MJPG codec을 사용해서 mp4 파일을 mpg 파일로 변경하는 작업에서 동작을 안하고 avi 파일로 변경하는 데는 동작 했습니다. 한마디로 코덱이 정상 동작을 하지 않는다면 다른 코덱 조합들을 선택해서 하나씩 실행해보는 것이 오히려 효과적입니다

     

     

     

     

    코덱 사용해서 OpenCV 동영상 저장하기

     

    코덱에 대한 설명은 이것으로 정리하고 앞서 포스트에서 비디오 파일 재생하는 것에 대한 예제를 구현 했는데 해당 예제를 조금 변형해서 동영상 파일(video file) 저장(save)하는 코드를 구현 해보겠습니다. 

     

    예제 코드>>

    import cv2 
    
    Vid = cv2.VideoCapture('car.mp4')
    
    if Vid.isOpened():
    	fps = Vid.get(cv2.CAP_PROP_FPS)
    	f_count = Vid.get(cv2.CAP_PROP_FRAME_COUNT)
    	f_width = round(Vid.get(cv2.CAP_PROP_FRAME_WIDTH))
    	f_height = round(Vid.get(cv2.CAP_PROP_FRAME_HEIGHT))
    	
    	print('Frames per second : ', fps,'FPS')
    	print('Frame count : ', f_count)
    	print('Frame width : ', f_width)
    	print('Frame height : ', f_height)
    
    	codec = "DIVX"
    	fourcc = cv2.VideoWriter_fourcc(*codec)
    	encoded_avi = cv2.VideoWriter("car_en.avi", fourcc, fps, (f_width, f_height))
    
    while Vid.isOpened():
    	ret, frame = Vid.read()
    	if ret:
    		key = cv2.waitKey(10)
    		
    		encoded_avi.write(frame)
    		if key == ord('q'):
    			break
    	else:
    		break
    
    Vid.release()
    cv2.destroyAllWindows()

    3번 라인: 미리 준비한 mp4 파일을 코드와 동일 폴더에 올리고 Vid 객체로 저장합니다.

    5~18번 라인: 영상 파일을 정상적으로 불러오면 영상파일의 정보를 읽고 코덱 설정한 객체를 준비합니다.

    16~18번 라인: DIVX 코덱으로 encoded_avi 객체를 준비 합니다. 

    20~29번 라인: car.mp4에서 읽은 frame을 encoded_avi에 저장하는 작업을 반복합니다.

     

     

    결과>>

     

    위와 같이 car_en.avi 파일이 생겼습니다. 영상을 재생 결과 정상 출력됨을 확인하였습니다.

    반응형