레이블이 편집인 게시물을 표시합니다. 모든 게시물 표시
레이블이 편집인 게시물을 표시합니다. 모든 게시물 표시

2010년 1월 31일 일요일

여러 개로 분리된 동영상을 다시 합치면 싱크문제가 생기는 이유

동영상 관련 지식을 가진 분들껜 상식적인 얘기지만, 지인들과 얘기하다보니 의외로 모르는 분들이 많아 간단히 정리.

2개 이상으로 분리된 동영상을 다시 합쳐보면 수많은 어려움이 존재한다.
우선, 동영상 포맷에 따라 적절한 도구를 찾는 것부터 난관이 크다.

펼치기..



그런데, 어찌저찌 잘 합쳐지더라도 오디오와 싱크가 맞지 않기가 십상이다.
싱크문제를 이해하려면 우선 오디오와 비디오의 압축 방식을 조금 이해해야할 필요가 있다.

비디오/오디오 모두 압축을 할 때 일정 단위로 묶어서 압축한다.

펼치기..



그리고, 일단 압축이 되고 나면 이 비디오/오디오 그룹은 다시 분리될 수 없다.
(물론, 긴 시간을 들여 다시 인코딩하면 분리는 가능하다)
이렇게 압축된 그룹 하나하나는 zip파일과 유사한 방식으로 저장되기 때문이다.

프레임 단위로 저장하는 비디오의 경우 그룹 뒤쪽 일부를 잘라내는 기능은 있지만, 오디오의 경우 얄짤없다.
오디오는 프레임 단위 이하로는 분리될 수 있는 방법이 없다.

그런데, 아래와 같은 비디오/오디오 스트림이 있다고 해보자.

그림1. 원래의 A/V 스트림


이 파일의 크기가 너무 커서 파일을 둘로 나누려고 한다.
그런데, 이 파일을 아래와 같이 둘로 나누면 아무런 문제가 없다.
손실되는 데이터도 없고, 나중에 다시 합쳐도 깔끔한 결과물을 볼 수 있다.

그림2. 이상적으로 분리된 A/V 스트림


하지만, 실제로 그렇게 운좋은 상황을 만나기는 쉽지 않다.
보통은 아래와 같은 상황을 만나게 되며, 이런 상황이 되면 골치가 아프다.
동영상을 자르는 프로그램이 굉장히 똑똑하고, 다시 합칠 것이란 것을 안다면 이론상으론 아래와 같이 저장할 수 있다.

그림3. 현실세계에서의 A/V 스트림 분리 #1


하지만, 현실은 언제나 시궁창...
보통 동영상을 자르면 아래와 같은 형태로 저장한다.

그림4. 현실세계에서의 A/V 스트림 분리 #2


이 경우 두 동영상을 잘라붙이면 아래와 같은 결과가 된다.
그야말로 안습의 동영상이 탄생하는 것이다.

그림5. 다시 합쳐진 안습의 동영상


실제로 그림 4과 같은 경우를 만나면 이미 잘려진 오디오를 다시 만들어낼 방법은 없다.
이 경우 두 동영상을 다시 합치려면 비디오의 길이를 약간 잘라줘야 한다.

그림6. 일부 비디오를 희생시켜 다시 합친 결과


이러니 비디오 편집은 삽질의 연속일 수 밖에 없다...


덧1. 잘라붙였을 때 200ms 이하의 간격이라면 A/V 싱크 문제가 그리 부각되지 않는다.
이런 경우는 걍 합치고 마는 것이 속편하다.

덧2. 오디오의 경우 그림에 나온 블럭 하나가 실제의 프레임을 의미하지는 않는다.
오디오 블럭 하나에 프레임이 여러개씩 들어간다.
따라서, 길이를 맞추기 위해 오디오를 자르는 경우도 있다.

2008년 9월 26일 금요일

AVISynth와 dgavcdec를 이용한 H.264 동영상 편집


요즘 동영상 파일을 보면 기존에 널리 사용되던 MPEG4(DivX, XviD 등등)를 H.264(x264, avc1 등등)가 대체하는 분위기입니다.
그리고, 파일 컨테이너도 AVI를 MKV가 대체해가고 있고 말이죠.
(사실, AVI는 대용량 파일을 저장하기에 나쁜 포맷은 아닙니다만, AVI 파서들의 수준이 워낙 들쭉날쭉이라...)

그런데, H.264 동영상의 내용을 편집하려고해도 virtualdub 등의 S/W에서 열기가 쉽지 않습니다.
H.264의 vfw(Video for Windows) 디코더가 없기 때문입니다. (있는데 제가 모르는 것일까요?)

H.264 동영상을 편집하려면, AVI, MKV 등의 컨테이너에서 H.264 raw file을 추출한 뒤에 DGAVCDec를 통해 읽어야 합니다.
좀 더 상세한 절차는 아래와 같습니다.


1. H.264 raw file 추출

필요도구 및 다운로드: AVI-Mux GUI


MKV, AVI 등의 파일을 AVI-Mux GUI에서 읽어들인 후 extract binary를 선택해서 H.264 raw file을 추출합니다.
확장자는 자동으로 raw가 붙게 됩니다.


2. AVI Synth 설치

다운로드: AVISynth

(이 프로그램은 블로그용 대형 AnimatedGIF 만드는 방법에서도 잠시 다루었습니다)
AVISynth는 프레임서버라고 불리며, 다양한 소스 파일들을 편집 프로그램에서 AVI 파일로 착각하게 하는데 주로 사용됩니다.

H.264 디코더가 AVISynth의 플러그인 형태로 만들어져 있기 때문에 사용됩니다.
그냥 다운받아 설치하면 되며, 유해 프로그램 및 한가한 아가씨 프로그램은 단 하나도 설치되지 않는 안전한 프로그램입니다.


3. DGAVCDec 소개

다운로드: DGAVCDec


Donald Graft란 분이 만든 AVISynth용 플러그인입니다. (이 분이 만든 플러그인은 워낙에 많아 다 언급하기도 어렵습니다)
크게는 두 부분으로 나뉘는데, H.264 raw file에서 인덱스를 생성해주는 DGAVCIndex.exe와 실제 디코딩을 해주는 DGAVCDecode.dll입니다.

우선, DGAVCIndex.exe를 실행시켜 1번에서 추출한 H.264 파일을 연 뒤 file → save project 를 실행하면 인덱스 파일(*.dga)이 생성됩니다.

다음으로 AVISynth 스크립트를 만들어야 하는데, 아래와 같이 만들면 됩니다.

loadplugin("dgavcdec100a35\DGAVCDecode.dll")
avcsource("TDK.dga")
주의할 점은 DGAVCDecode.dll과 libavcodec.dll이 같은 폴더에 저장되어 있어야 한다는 점입니다.
(어짜피 같이 배포되기 때문에 다른 폴더에 저장되기도 어렵습니다)


4. 만들어진 avs를 virtualdub에서 편집

다운로드: virtualdub

이렇게 만들어진 avs는 virtualdub에서 마치 보통의 AVI 파일처럼 읽힙니다.
또, 취향에 따라서 MeGUI 등의 별도의 인코딩 프론트엔드를 사용할 수도 있습니다.

정말 쉽죠? 이제부터 H.264 편집으로 고고씽~