반응형

비디오 영상처리와 인코딩은 온갖 삽질의 끝없는 반복으로 이루어진다.

그리고 그 중엔 모르는 사람이 보면 도저히 이해를 할 수 없는 작업들이 넘쳐난다.

 

VirtualDub2[각주:1]를 이용하면 무압축 RGB 포맷의 AVI 동영상을 만들 수 있다.

YUV 변환 따윈 전혀 하지 않은 그야말로 무식한 RGB raw 데이터가 저장된 비디오 파일을 손쉽게 만들 수 있는 것이다.

물론 이런 파일은 대부분의 사용자들에겐 파일 크기만 무식하게 크지 아무 쓸모도 없다.

하지만, 이 바닥에서 일을 하다보면 반드시 이런 파일을 만들어야 할 때가 틀림 없이 나타난다.

 

각설하고, VirtualDub로 이 작업을 하면 문제가 하나 있는데, 많은 입력 파일을 배치 처리하기가 어렵다는 것이다.

물론 배치 처리 기능이 있긴 한데, 결국 일일이 하나씩 배치 작업을 걸어야 한다.

작업 대상이 몇 개 안 된다면 대단히 훌륭한 기능이지만, 파일이 한 100개 쯤 된다면 뭐...

 

이럴 때는 ffmpeg을 활용하는 편이 더 낫다.

하지만, ffmpeg의 경우는 기능이 너무 많아 정확한 포맷을 지정하는 게 쉽지가 않다는 문제가 있다.

 

입력 파일

 

입력 파일은 데이터 내용을 보기 위해 그라데이션 형태의 영상을 만들기로 했다.

1920x1080의 FHD 크기의 단순한 그라데이션 이미지를 하나 만든 뒤에...

 

 

AVISynth 스크립트를 한줄 써서 읽으면 된다.

Imagesource("test.jpg", 1, 25, 25)

 

이렇게 만들면 제일 좋은 점은 생성된 AVI 파일을 열어보면 top-down인지 bottom-up인지 쉽게 볼 수 있다는 점이다.

 

VirtualDub으로 변환

 

별 거 없다.

그냥 출력 포맷(Compression)을 RGB로 설정한 뒤 저장하면 끝.

 

 

ffmpeg으로 변환

 

기본적으로 raw 포맷으로 저장하는 것은 전혀 어렵지 않다.

출력 코덱으로 rawvideo를 지정하고, 적절한 픽셀 포맷(pix_fmt)만 지정하면 된다.

 

하지만 문제는 ffmpeg이 지원하는 픽셀 포맷이 무지무지하게 많다는 것.

RGB, YUV 각각 8비트, 10비트 다 지원하고 YUV로 저장할 때는 444, 422, 420 등등 지원할만한 건 다 지원한다.

이러다보니 일반적으로 raw 포맷으로 저장하려고 할 때는 아무거나 쓰면 되지만...

VirtualDub과 동일하게 저장하려면 잘 찾아야 한다.

 

답은 의외로 간단하다. pix_fmt로 rgb24를 사용하면 된다.

ffmpeg -i test.avs -vcodec rawvideo -pix_fmt rgb24 test1.avi

 

 

그런데 이것만으로는 완벽하게 VirtualDub과 동일하게 저장할 수 없다.

VirtualDub는 위부터 아래로(top-down) 저장하는데 반해, ffmpeg는 아래에서 위로(bottom-up) 저장한다.

물론, 프로그램이 잘 알아서 읽으면 되지만, 어쨌거나 완벽하게 동일하지는 않다는 뜻.

 

VirtualDub과 동일하게 top-down으로 저장하려면 옵션을 하나 더 써야 한다.

ffmpeg -i test.avs -vcodec rawvideo -pix_fmt rgb24 -vf vflip -flipped_raw_rgb 1 test2.avi

 

이렇게 변환하면 VirtualDub의 무압축 RGB와 완벽하게 동일한 포맷으로 저장할 수 있다.

 

덧1. 이렇게 하면 디스크 용량 낭비가 많이 크므로 각 프레임을 각각의 PNG 파일로 저장하는 게 쪼금은 더 효율적일 듯

덧2. AVI용 lossless 코덱 중에 성능과 압축률 두 마리 토끼를 다 잡은 것으로 Lagarith가 있는데, 이 쪽도 꽤 괜찮음

 

 

  1. 바로 그 전설의 VirtualDub이 개발 중단된 이후 오픈된 소스를 엄청나게 업그레이드시킨 프로젝트 [본문으로]
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band