AI를 활용한 영상처리를 하는 회사 프로젝트 특성상 FFmpeg를 자주 사용한다. 기존프로젝트에는 단순 영상에 자막을 붙이는 정도의 영상가공을 했다면 이번에는 템플릿 별로 백그라운드를 다르게한다. 템플릿에 따라서 영상 2개를 오버레이하는 경우도 있고 단순 자막이 아닌 커스텀 된 자막을 넣어 숏폼을 만들었다. 요즘 숏폼 난리인데 나는 영상편집툴도 아니고코드로 영상을 만들고 있다.
누가 얼마나 사용할지 모르겠지만 자료가 많이 없어서 내가 경험한 내용을 바탕으로 FFmpeg로 텍스트를 가공하는 내용에 대해 정리해볼려고 한다!
1. FFmpeg로 글자 다루기
FFmpeg는 비디오 및 오디오 처리를 위한 강력한 도구로, 다양한 필터를 통해 미디어 파일에 효과를 적용할 수 있다. FFmpeg에 대한 전반적이 이야기는 지난 번글에 정리를 해서 생략하고 바로 글자를 다루는 방법에 대해 정리해볼려고한다.
영상에 글자를 사용하는 경우는 나같이 숏폼을 만드는 경우는 제목을 넣을 수도 있지만 주로 자막을 많이 사용한다
FFmpeg에서 글자를 다룰 때는 Subtitles 필터와 DrawText 필터가 주로 사용된다. 각각의 용도와 차이점에 대해 정리해보고 내가 겪었던 문제도 정리해보자~~
2. 자막을 다루는데 최적 Subtitles
자막을 작성해야 하니 처음에는 Subtitles 필터를 사용해 구현을 했다
Subtitles의 특징, 장점, 단점을 정리해보면
특징:
- SRT, ASS, VTT 등 다양한 자막 파일 형식을 지원. 자막 파일을 읽어 비디오에 직접 오버레이
- 자막을 비디오에 삽입할 때, 파일의 타임스탬프를 기반으로 자동으로 위치와 시간 조절 가능
- 자막 스타일 (폰트, 색상, 크기 등)을 지정
- 자막파일 경로 설정을 통해 자막파일을 읽고, force_style로 여러 스타일 속성을 설정할 수 있다
- FontSize: 글꼴 크기
- PrimaryColour: 텍스트 색상 (HEX 또는 ARGB)
- BorderStyle: 테두리 스타일. 1은 일반 테두리
- Outline: 테두리 두께
- 필터 예시
-vf "subtitles='path/to/file.ass':force_style='FontSize=24,PrimaryColour=&HFFFFFF&, BorderStyle=1, Outline=1'"
장점:
- 자막 파일을 사용하기 때문에 자막 내용을 외부에서 관리할 수 있어, 수정이나 추가가 용이
- 각 자막의 타임스탬프가 명확하게 정의되어 있어 정확한 타이밍에 자막이 표시
- 다양한 포맷을 지원하므로, 이미 존재하는 자막 파일을 쉽게 활용
단점:
- 자막 파일을 별도로 준비해야 하므로 초기 작업 필요
- 복잡한 스타일링(예: 효과, 애니메이션 등)을 적용하기 어려움
추가로 내가 경험했던 특징으로는 자막이 길어질 경우 화면에서 나가지 않도록 자동 줄바꿈도 된다. 글자크기는 포인트 단위. 다만 주로 사용하는 SRT파일의 경우 자막의 위치 조정이 안되고 무조건 아래쪽에 고정된다.(예시 이미지 참고) 또 보통사용하는 흰색글씨에 검정색배경 스타일의 경우 검정색 배경의 크기 조정이 잘되지 않는다. 좌우 여백을 주고싶었는데 아웃라인으로 위아래만 늘어남 ㅠ_ㅠ
3. Text를 직접 그리는 Drawtext 필터
Drawtext는 조금 더 위치, 색상, 크기, 테두리 및 배경 등을 세밀하게 조정할 수 있다.
특징:
- 텍스트를 직접 비디오에 그리는 방식으로, 문자열을 직접 입력하여 비디오에 삽입
- 텍스트의 위치, 크기, 색상, 폰트 등을 세부적으로 조정
- 설정값
- text: 표시할 텍스트 (필수)
- fontfile: 사용할 폰트 파일의 경로
- fontsize: 폰트 크기
- fontcolor: 폰트 색상 (HTML 색상 코드 또는 RGB 값)
- x: 텍스트의 X 좌표 위치
- y: 텍스트의 Y 좌표 위치
- borderw: 텍스트 테두리의 두께
- bordercolor: 텍스트 테두리의 색상
- box: 텍스트의 배경 박스 표시 여부 (1 또는 0)
- boxcolor: 배경 박스 색상
- enable: 텍스트 표시를 제어하는 조건
- 필터 예시
-vf "drawtext=text='Hello World':fontfile='/path/to/font.ttf':fontsize=24:fontcolor=white:x=(W-w)/2:y=(H-h)/2:borderw=2:bordercolor=black:box=1:boxcolor=black:enable='between(t,0,10)'"
장점:
- 자막 내용을 코드 내에서 직접 정의할 수 있어, 별도의 파일 없이도 사용
- 다양한 스타일과 애니메이션 효과를 적용할 수 있어, 창의적인 비디오 제작에 유리
- 텍스트 위치와 크기를 세밀하게 조정할 수 있어 디자인 유연성이 높음
단점:
- 타임스탬프를 수동으로 관리해야 하므로, 자막의 정확한 타이밍 조절이 복잡
- 텍스트가 많거나 자주 변하는 경우, 코드가 길어져 관리가 어려움
실제로 프로젝트에는 Drawtext필터를 통해 자막을 구현했다. 글자크기도 픽셀 단위로 적용할 수 있고 원하는 위치에 배치하고 효과 등을 넣어 세밀하게 조정할 수 있어 좋지만(예시 이미지 참고) 자막이 길 경우 화면을 넘어가고 자막을 한줄한줄 입력해야해서 명령어가 길어지고 처리시간이 오래걸리는 문제가 있었다. subtitles 필터는 필터 예시 1줄이면 되는데 drawtext필터는 자막한줄한줄 필터예시가 들어감.
프로젝트는 아직 진행중이다. 지금은 subtitles 필터 대신 drawtext 필터를 사용하면서 속도를 버리고 디자인을 얻었다. 근데 이게 1개의 영상만 만들면 괜찮은데 한번의 호출로 1분이하의 영상을 최대 9개까지 만들어야한다. 비동기로 처리하더라도 9개의 영상이 요청되었을 때는 속도가 아주 큰문제가 되더라. 현재는 자막을 db에서 바로 drawtext필터에 박고 있는데 이후에는 srt파일을 만들고 drawtex필터로 srt 파일을 읽는 방법을 시도해봐야겠다. 개선된다면 테스트내용을 글에 추가해보는걸로!
[reference]
- ffmpeg 필터 공식문서 : https://ffmpeg.org/ffmpeg-filters.html#subtitles-1
'개발 하나둘셋' 카테고리의 다른 글
504 Gateway Timeout 오류 해결방법: 로드밸런서 Connection idle timeout (0) | 2024.03.31 |
---|