2020-10-14

OBS 타임랩스 녹화


0. OBS에서 타임랩스를 하는 이유

OBS오픈소스 소프트웨어라서 라이선스로부터 자유롭게 사용할 수 있다. 여느 다른 프로 그램 들은 고화질/fps를 사용하는 데에 요금을 내라던가, 아이디를 만들라던가, 무겁다던가, Windows만 지원하는 등의 문제들이 있지만, OBS에는 그런거 없다. 조금만 배워두면 얼마든지 고급 기능까지도 사용할 수 있다는 매우 강력한 장점이 있어서, 많은 스트리머들이 선택하고 있는 소프트웨어이기도 하다.

OBS는 무료임에도 불구하고 많은 조작부를 지원하고 있고, 다양한 플러그인까지 지원한다는 강력한 장점이 있어서 널리 사용되고 있는 소프트웨어이다. 하지만 단점도 있다. 초보자가 사용하기엔 다소 어려울 수도 있는 유저 인터페이스(UI), 클라우드 백업을 지원 기능이 내장되어 있지 않기 때문에 녹화된 파일을 손수 관리해줘야 한다. 단점이라고 꼬집기에도 뭔가 애매하다. 없는 단점 만들어낸 느낌.

동영상 녹화가 주 기능이다보니 타임랩스도 지원하지 않을까 싶었는데, 그건 또 안 된단다. 그래서 찾아보았다. 이 글은 레딧에서 아이디어를 얻고, OBS 포럼에서 방법을 배워서 그대로 적용한 것임을 밝힌다.

 

1. 프레임 계산법

나는 1시간 분량10초로 빠르게 표현하는 타임랩스를 만들고 싶다. 그리고 영상은 60 fps의 프레임레이트를 가진다고 가정해보자.

그렇다면 타임랩스 영상의 10초는 60 fps * 10 seconds = 600 frames가 된다. 1시간은 3600초이므로 3600 seconds / 10 seconds = 360이다. 이 값이 바로 speedup factor이다.

이 계산식이 의미하는 것은 ‘1시간 분량이 600 프레임 내에 들어가게 된다는 것이다. 이보다 더 많은 프레임을 녹화한들, 어차피 남는 프레임들은 모두 떨어져 나가므로, 애초부터 그 이상 녹화할 필요가 없다.

, 3600초당 600 frames. 그러면 600 frames / 3600 seconds = 1/6 fps이다. 이는 1초에 1/6장의 사진을 찍는 것과 같으므로, 6초당 한 프레임을 녹화하면 된다는 뜻이다.

 

2. OBS 설정 방법

OBS에서 이 fps설정하려면 설정 비디오 분수 FPS 으로 이동해 FPS 값을 수정해주어야 한다. 분모에 6, 분자에 1을 입력하면 1/6 fps를 입력할 수 있다.


이 설정으로 녹화한 비디오는 일반적인 미디어 플레이어에서 평범하게 1시간짜리 영상으로 저장되게 된다. 또한, 재생해보면 슬라이드쇼를 보듯이 6초마다 영상이 갱신되는 것을 볼 수 있다. 하지만 파일 자체의 용량은 매우 작다. 1시간을 녹화했지만 고작 600 frames에 불과하기 때문이다. 근데 왜 나의 영상은 용량이 이렇게 클까.. 그래서 이에 관한 여러 테스트를 해본 결과, 그냥 납득하고 비트레이트를 조정하기로 마음 먹었다..

 

<실험>

그러면 데이터율 제어를 CBR로 하지 않고 다른 방식으로 해보면 어떨까? 데이터율 제어에는 아래와 같은 방식이 있다.(출처)(아카이브) 자세한 내용을 다루는 블로그도 있다.

l  CBR(Constant Bit Rate): 고정 비트율. 일정한 비트레이트를 유지.

l  ABR(Available Bit Rate): 비트율. 네트워크 상태에 따라서 비트레이트를 조절.

l  VBR(Variable Bit Rate): 비트율. 정적인 곳은 적은 비트레이트를, 움직임이 격한 곳은 많은 비트레이트를 할당.

l  CRF(Constant Rate Factor): 값이 높을수록 용량이 작고 화질이 열화되며, 값이 낮을수록 용량이 크지만 화질도 좋다.

그러하니 이번에는 CBR이 아니라 VBR로 해보자.

설정은 다음과 같다:
OBS
버전: 25.0.8 (64 bit)
해상도: 3840 * 1200 (4,608,000 픽셀)
공통 FPS : 24 NTSC
비트레이트: 5000 Kbps
최대 비트레이트: 8000 Kbps
인코더: NVIDIA NVENC H.264

듀얼모니터 전체를 녹화하느라 이런 기형적인 해상도가 나왔다. 용량은 1분당 5~6MB의 기염을 토했다. 2560 * 1440 = 3,686,400 픽셀이 1분에 45~135 MB를 차지한다는 것과 비교하면, 그보다 많은 픽셀(3840 * 1200 = 4,608,000 픽셀)로 이 정도 용량이 나온다는 점은 가히 매력적인 압축력이 아닐 수 없다.


(출처: Android Authority)

 

여하튼 녹화된 파일의 용량 문제는 여기에서 정리하고, 녹화된 영상에서 타임랩스를 만드는 과정에 대해 좀 더 알아봐야겠다.

</실험>

 

3. 주의사항

녹화를 중단하는 데에 시간이 오래 걸리는 이유

녹화 중단을 클릭했더니 녹화를 중단합니다….’라고 뜨기만 하고 중단이 되지 않는다. 이 현상은 OBS가 매 20 frames를 녹화한 다음에서야 정지할 수 있기 때문이다. 예를 들어 위의 설정에서 정지 버튼을 누르는 경우엔, 19 frames가 남아 19 * 6 = 114초가 지나서야 완전하게 OBS가 녹화를 중단한다. 강제로 종료하려 하면 파일이 손상될 수 있으니 주의해야 한다.

소스 속성 변경에도 시간이 소요되는 이유

또한 fps 값을 입력해주면 OBS의 미리보기 기능에서도 1/6 fps로 작동한다. 6초마다 이미지 하나를 보는 것과 같이 출력되게 된다. 소스 설정도 슬라이드쇼와 비슷하며, 소스 속성의 변경 사항을 저장하는 데에도 또한 6초가 소요될 수 있다.

 

4. ffmpeg로 타임랩스 만들기

녹화가 끝난 다음에는 비디오 편집기로 fps 값을 바꿔주어 frame rate를 우리가 자주 사용하는 정도로 끌어올린다. 여기에서 사용되는 프로그램이 ffmpeg이다. 아마 라즈베리파이로 영상 처리를 해본 사람이라면 한 번쯤은 꼭 들어봤을 프로그램이다. 그래픽 유저 인터페이스(GUI)가 없고 오직 CLI (Command-line interface)에서 작동하므로, 이 기회에 명령어 입력창과 친해져보자.

 

설치 방법과 기본적인 사용법은 아래의 블로그를 참조하는 것으로 대신한다.

l  컴맹이 알려주는 ffmpeg 사용법

l  윈도우 10에서 ffmpeg 사용하기

 

여기에선 윈도우 기준으로 설명하겠지만, ffmpegcross-platform software기 때문에 타 OS에서도 동일하게 작동하므로 부담 갖지 않아도 된다.




사용한 명령어는 아래와 같다.

ffmpeg -i "input.mkv" -filter:v "setpts=PTS/360" -an -r 60 timelapse.mkv

위의 사진에서 일부 숫자가 다르긴 하지만, 이는 개인의 사용 목적에 따라 변경할 수 있다. setpts filter에서 presentation timestamp (PTS)를 매 1/360 프레임마다 넣을 수 있다. 이 옵션으로 영상이 360배 빠르게 재생되는 것이다. 이는 위에서 계산한 speedup factor를 여기에 입력한다.

-an 옵션은 오디오 트랙을 드랍(drop)하는 옵션이다.

-r 60 옵션은 출력될 영상이 60 fps임을 의미한다.

 

예시로 사용해본 원본파일은 10 fps, VBR, 30분 분량(18000 프레임)이며, 60%의 프레임이 담기고 40%의 프레임이 드랍 되었음을 알 수 있었다. 이전 영상은 120MB였으나 타임랩스 영상은 30MB에 그쳤다. 그래서 PTS 값을 6으로(, 6배 빠르게) 조절하였더니 프레임 드랍 없이 18,000 프레임이 모두 담긴 영상을 얻을 수 있었다. 시간은 30분에서 5(1/6)으로 단축됐고, 용량은 40MB였다.

다만, 아카이빙 용도로 사용하기엔 무리가 있을 것 같다. 30분짜리 영상을 인코딩하는 데에 18분이 걸렸다. 용량이 1/3배로 줄어들긴 했지만, 소모되는 CPU time이 너무 커서 메리트는 딱히 없다. 저장용량에 민감할 정도의 작업이 필요한 경우라면 녹화된 영상을 ffmpeg에 자동으로 input하는 스케줄러를 구성하는 편도 나쁘지 않을 것 같다(예를 들자면 CCTV 영상).

 

5. 추가 내용 (우분투에서 ffmpeg 사용)

똑같은 과정을 우분투 ffmpeg version 3.4.8에서 실행해보았다. 멀쩡하게 잘 실행되지만 를 만날 수도 있다.

Past duration 0.899986 too large

이는 inputoutputframe rate가 다를 때 동기화에서 생기는 일종의 동기화 에러라서 추가적인 명령어를 통해 없애줄 수 있긴 하지만, 무시해도 영상은 제대로 생성되므로 걱정하지 않아도 된다. 더 자세한 분석이 듣고 싶다면 을 참조하면 된다.


댓글 없음:

댓글 쓰기