국내 HDTV 녹화물은 대부분 1920x1080 60i 포맷입니다.
아주 가끔 영화 같은 경우는 풀다운 플래그와 함께 1920x1080 24p로 송출되기도 하지만 거의 대부분은 60i입니다.
이런 60i영상은 디인터레이스를 거쳐서 프로그레시브 방식으로 인코딩되는 것이 보통이지만 인터레이스 방식으로 인코딩하는 것도 물론 가능합니다.
인터레이스 영상을 다시 인터레이스로 인코딩할 때의 장점이라면..
중간중간 여러가지 소스가 섞여있어도 VFR을 사용할 필요가 없고 H.264 레벨 4.1에서도 1920x1080 60p로 감상이 가능하다는 것 정도가 있겠네요.
물론 단점도 있는데 x264의 경우는 인터레이스 방식의 압축 효율이 프로그레시브 방식에 비해서 약간 떨어진다고 합니다.
그리고 인터레이스 영상은 재생이 까다롭고 인코딩 속도도 조금 느린 편이죠.
아무튼 인터레이스 방식으로 인코딩하려고 할 떄 avs 스크립트 작성하는 방법을 정리해 보겠습니다.
먼저 1920x1080 60i 영상을 1280x720 60i와 같이 낮은 해상도로 리사이즈하고 여러가지 필터들도 적용하는 방법입니다.
(낮은 해상도로 리사이즈하지 않더라도 디노이즈나 샤픈 같은 필터를 적용하려면 이 방법을 사용해야 합니다.)
avsp에서 인터레이스 소스를 불러오면 보통은 weave()가 적용된 상태로 보여집니다.
이 상태에서 바로 리사이즈를 해버리면 서로 독립적이라고 할 수 있는 두 필드들의 정보가 섞여버리게 되죠.
각각의 필드들이 가지고 있는 정보를 그대로 유지하면서 리사이즈하기 위해서는 필드를 서로 분리해 놓고 리사이즈 한 후에 다시 합치거나
BOB 디인터레이스를 통해 60p로 만들어 놓고 그 상태에서 리사이즈 한 후에 각각의 필드를 다시 추출해서 합치는 방법이 있습니다.
이 중 필드를 서로 분리해 놓고 리사이즈해서 다시 합치는 방법은 디노이즈나 샤픈 같은 필터를 적용하기에도 부적당하고 품질도 떨어지기 때문에
yadif(mode=1) 같은 BOB 디인터레이스를 이용하는 방법을 설명드리겠습니다.
우선 60i의 원본 소스를 BOB 디인터레이스를 이용해서 60p로 바꿔줍니다.
여기에서 잘 생각해보면 60i 소스의 필드들이 모두 프레임으로 바뀌었기 때문에 60p 영상의 첫 번째 프레임이 60i 소스의 첫 번째 필드(탑 필드)에
해당한다는 것을 알 수 있습니다. 그리고 60p 영상의 두 번째 프레임은 60i 소스의 두 번째 필드(바텀 필드)에 해당하겠죠.
(필드 오더에 따라서 첫 번째와 두 번째는 바뀌기도 하지만 여기에서는 TFF로 가정하겠습니다.)
60i를 60p로 바꾼 상태에서는 하나의 프레임이 하나의 필드에 대응한다는 점이 중요합니다.
이렇게 60p로 바뀐 상태에서 리사이즈도 하고 이것저것 필터들도 사용해서 원하는대로 편집합니다.
프로그레시브 상태이기 때문에 별다른 문제없이 대부분의 필터들을 적용할 수 있습니다.
다음은 필터가 적용된 60p 영상을 다시 60i로 돌려놓는 작업입니다.
먼저 separatefields()를 사용해서 60p 영상의 프레임들을 필드로 분리합니다.
그러면 120i 영상이 만들어지겠죠?
이 120i 영상의 첫 번째와 두 번째 필드는 최초 60i 소스의 첫 번째 필드(탑 필드)를 프레임으로 바꾸고 다시 필드로 나눠서 만들어진 것들입니다.
즉 120i 영상의 첫 번째 필드(탑 필드)가 최초 60i 소스의 첫 번째 필드(탑 필드)에 해당하는 것이죠.
마찬가지로 120i 영상의 세 번째와 네 번째 필드는 최초 60i 소스의 두 번째 필드(바텀 필드)를 프레임으로 바꾸고 다시 필드로 나눠서 만들어진 것들니까
120i 영상의 네 번째 필드(바텀 필드)가 최초 60i 소스의 두 번째 필드(바텀 필드)에 해당합니다.
이렇게 120i 영상의 필드를 4개씩 묶어놓고 생각해보면 첫 번째와 네 번째 필드가 최초 60i 소스의 탑, 바텀 필드에 해당한다는 것을 알 수 있습니다.
따라서 120i 영상에 selectevery(4, 0, 3)을 사용하면 최초 60i 소스의 탑, 바텀 필드에 해당하는 필드들을 추출할 수 있습니다.
(BFF인 경우에는 selectevery(4, 1, 2)를 사용해야겠죠.)
selectevery(x, y, z)는 y, z에 x를 계속해서 더해가면서 그 숫자에 해당하는 프레임이나 필드들을 추출해주는 필터입니다.
즉 y, z, y+x, z+x, y+x+x, z+x+x, y+x+x+x, z+x+x+x ... 이런식으로 추출하니까 selectevery(4, 0, 3)은 0, 3, 4, 7, 8, 11 ... 이런식으로 추출하겠죠.
selectevery(3, 0, 0, 2, 1) 처럼 0, 0, 2, 1, 3, 3, 5, 4 ... 이런식으로 추출하는 것도 가능합니다.
위와 같은 방법으로 120i 영상에서 추출된 탑, 바텀 필드를 weave()로 묶어주면 다시 60i 영상으로 돌아옵니다.
지금까지 설명드린 과정을 스크립트로 정리하면 아래와 같습니다.
MPEG2Source("60i.d2v")
yadif(mode=1)
spline36resize(1280,720) # 이렇게 60p 상태에서 리사이즈 뿐만 아니라 각종 필터들을 적용하면 됩니다.
separatefields()
selectevery(4,0,3)
weave()
설명은 참 길게 했지만..스크립트는 간단하죠.
저렇게 avs를 작성해서 인터레이스 방식으로 인코딩하면 60i 영상이 만들어집니다.
x264에서는 --tff 또는 --bff 옵션을 사용해서 인터레이스 인코딩이 가능합니다.
x264 외에도 MPEG-2 나 VC-1 등 인터레이스 인코딩을 지원하는 표준의 인코더를 사용해서 인코딩하면 되겠습니다.
위의 스크립트를 이용해서 제가 인코딩한 샘플 영상도 첨부해봅니다.
각각 H.264(x264), MPEG-2(x262), VC-1(wmcmd)으로 인코딩한 인터레이스(60i) 영상입니다.
BOB 디인터레이스를 적용해서 보면 60p로 부드럽게 재생되는 걸 확인할 수 있습니다.
이번에는 24p에서 60i로 풀다운하는 방법입니다.
일반 사용자가 굳이 프로그레시브 영상을 인터레이스로 바꿔야하는 경우는..뭐 거의 없지만 간단한 내용이라서 함께 적어봅니다.
우선 24p 영상을 필드로 나눠야겠죠. 여기에서도 separatefields()를 사용해서 48i 영상으로 만들어줍니다.
그런 다음 몇몇 필드를 중복시켜서 60i로 만들어야 하는데 어떤 필드를 중복시키는지에 따라서 풀다운 방식도 달라지죠.
아래는 가장 일반적인 3:2 풀다운입니다.
AVISource("24p.avi")
separatefields()
selectevery(8, 0, 1, 0, 3, 2, 5, 4, 5, 6, 7)
weave()
selectevery() 필터만 잘 사용하면 얼마든지 응용도 가능합니다.
예를 들어 2:3:3:2 풀다운은 다음과 같이 작성하면 되겠죠.
AVISource("24p.avi")
separatefields()
selectevery(8, 0, 1, 2, 3, 2, 5, 4, 5, 6, 7)
weave()
'Avisynth' 카테고리의 다른 글
DSS2(): DirectShowSource2 소스 필터 (3) | 2013.02.21 |
---|---|
Avisynth의 멀티스레딩을 지원하는 Sorathread 필터 (17) | 2013.01.06 |
30p로 촬영된 60i 영상 디인터레이스 (11) | 2012.12.17 |
프레임 더블링 스크립트 InterFrame (4) | 2012.12.15 |
3D 영상에 2D 자막을 입혀주는 AVS 스크립트 (28) | 2012.12.09 |