FFmpeg 명령어 구조와 샤나인코더 작동 방식 이해와 샤나인코더 영상 사이즈 변경 옵션을 통한 FFmpeg 필터의 기초 이해에서 언급했듯이, 필터를 사용할 때는 다음의 사항을 반드시 기억해야 합니다.
① 필터들은 앞에 오는 순서대로 우선적으로 처리된다.
② 필터들은 (공백 없이) 쉼표(,)로 구분한다.
③ 필터 내의 옵션들은 콜론(:)으로 구분한다.
④ 필터 내에서 "옵션=" 부분이 생략되어 설정값만 나올 경우, 설정값은 필터의 옵션 순서에 따라 자동으로 할당된다.
쉼표로 구분된 필터들은 앞 필터에서 출력(output)되는 비디오/오디오 스트림을 입력값(input)으로 받아 처리하게 됩니다. 이렇게 동일한 비디오/오디오 스트림을 순차적으로 처리하는 필터들의 고리를 필터 체인(filter chain)이라고 합니다.
그리고, 비디오 필터 체인은 -vf 명령어 뒤에, 오디오 필터 체인은 -af 명령어 뒤에 옵니다.
□ 예제를 통해 보는 로고/워터마크 제거
가장 간단한 필터 적용의 예로 로고/워터마크 제거하기를 보겠습니다.
기본적으로 로고나 워터마크가 없는 원본을 구하는 것이 가장 이상적이지만, 로고/워터마크가 있는 영상밖에 구할 수 없는 경우 로고를 최대한 지우는 필터로는 delogo가 있습니다.
영상에 텍스트 로고를 입히는 프리셋에서 예제로 만들어봤던 다음 영상이 원본이라고 가정하고, 이 영상에서 우상단에 붙은 로고를 제거해 보도록 하겠습니다.
비디오 필터에서 위치와 크기를 결정할 때는 좌표를 이용하는데, 입력되는 비디오 스트림의 왼쪽 윗부분 모서리가 기준점이 되어 좌표 x=0, y=0이 되고 수평으로는 오른쪽 방향, 수직으로는 아래쪽 방향으로 좌표를 측정합니다. 크기는 물론 픽셀 단위입니다.
원본 영상에서 로고(를 둘러싸는 직사각형)는 화면의 우상단에 5초에서 51초 정도 사이에만 나타나고, 가로 크기는 약 134픽셀, 세로로는 32픽셀 정도의 크기를 가집니다.
delogo 필터는 로고(를 둘러싸는 직사각형)의 왼쪽 윗부분 모서리의 좌표와 크기를 입력값으로 받습니다. (delogo 필터 매뉴얼)
그림에서 보듯 스크린샷으로 측정한 로고의 왼쪽 윗부분 모서리의 좌표는 가로 1,116픽셀, 세로 28픽셀(x=1116, y=28)이고, 로고의 크기는 가로 134픽셀, 세로 32픽셀이므로, 샤나인코더에서 F7 필터 설정 창을 띄운 뒤 delogo 필터를 추가해서 다음과 같이 매개변수 설정을 하면 됩니다.
- 매개변수 설정값:
x=1116:y=28:w=134:h=32:enable='between(t,5,51)'
FFmpeg의 필터 중에는 특정 조건에만 적용할 수 있는 필터들이 있는데 이러한 기능을 timeline editing이라고 합니다. 이러한 필터들은 고유의 옵션 외에 enable 옵션을 지원하여 조건을 설정할 수 있습니다.
delogo 필터는 timeline editing을 지원하는 필터입니다. 위의 설정값 중 enable='between(t,5,51)'은 '5초에서 51초 사이에만 delogo 필터를 적용하라'는 의미입니다.
(between을 따옴표로 감싼 이유는 between 안의 매개변수 구분자인 쉼표(,)가 -vf 옵션의 필터 간 구분자로 인식되지 않도록 하기 위함입니다.)
이렇게 설정된 필터는 실제 FFmpeg 명령어로는 다음과 같이 입력되는 것을 매개변수 창(F8)을 띄워 확인할 수 있습니다.
실제 이 설정을 적용해서 인코딩하면 아래와 같은 영상을 얻습니다.
□ 추가적인 내용 1
샤나인코더에서 사용할 수 있는 필터 목록은 샤나 필터 매개변수 도움말에서 찾아볼 수 있습니다.
그리고 특정 필터의 옵션 목록 및 사용 예제들은 필터 매개변수 도움말에서 찾을 수 있습니다.
□ 추가적인 내용 2
경우에 따라서는 하나의 비디오 스트림을 여러 개의 필터 체인들이 병렬적으로 처리하거나(하나의 비디오 스트림을 split하여 각각 따로 처리하는 경우), 여러 개의 비디오 스트림을 여러 개의 필터 체인들이 병렬적으로 처리하는 경우(concat 필터와 같이 여러 개의 동영상을 이어붙이기하는 경우)가 있는데, 이런 필터 체인들의 병렬적인 묶음은 필터그래프(filtergraph)라고 합니다.
필터에 따라서는 여러 개의 비디오 스트림을 입력값으로 받거나 출력값으로 내놓는 경우가 있는데, 이럴 때는 -vf 대신 -filter_complex 또는 -lavfi 명령어 뒤에 그런 필터들을 놓습니다.
샤나인코더에서는 필터그래프를 지원하긴 하지만 약간의 제약 사항이 있습니다. 자세한 내용은 이 게시물에 달린 Rina님의 댓글을 참고하시기 바랍니다.
다중 구간에서 적용하는 방법은 이 게시물의 댓글 부분을 참고하시기 바랍니다.