FFmpeg 영상 편집 녹화 지연, 영상 길이 감소, CPU 100% 문제 해결 방법
실시간 영상 녹화 서버에서 FFmpeg 를 사용하여 영상 편집(녹화) 중, 녹화 지연 문제 발생했습니다. 동일한 시간에 녹화된 영상의 길이가 일부 컴퓨터에서 더 적게 나왔습니다. 해당 이슈가 발생한 상황, 원인에 대해서 분석하고 해결한 과정에 대해 살펴보겠습니다.
문제 상황
- 실시간 동영상을 녹화하기 위한 여러 서버가 존재
- Spring Boot & Kotlin 기반 서버 동작 중
- 각 서버는 FFmpeg 를 사용하여 입력된 동영상 파일을 녹화하는 기능을 수행
- 각 서버의 스펙이 서버마다 다소 상이(동일 하드웨어나 동일 인스턴스를 사용하지 않음)
정보
FFmpeg는 마이클 니더마이어(Michael Niedermayer)의 주도하에 개발되고 있는 모든 동영상, 음악, 사진 포맷들의 디코딩과 인코딩을 목표로 만들어지고 있는 오픈 소스 프로젝트입니다. 자세히는 다음과 같은 역할을 하는 프로그램입니다.
- 오픈 소스: FFmpeg은 오픈 소스 비디오 및 오디오 처리 도구로, 누구나 무료로 사용하고 수정할 수 있습니다.
- 멀티플랫폼: FFmpeg은 Windows, macOS, Linux 및 기타 다양한 운영 체제에서 동작합니다.
- 다양한 포맷 지원: FFmpeg은 수백 가지 포맷을 지원합니다. 이는 비디오, 오디오, 이미지 및 기타 멀티미디어 데이터의 인코딩, 디코딩, 변환 및 스트리밍을 가능하게 합니다.
- 비디오 및 오디오 인코딩/디코딩: FFmpeg은 거의 모든 주요 비디오 및 오디오 코덱을 지원합니다. 이는 사용자가 다양한 형식의 비디오 및 오디오 파일을 인코딩하고 디코딩할 수 있음을 의미합니다.
- 스트리밍: FFmpeg은 실시간으로 비디오 및 오디오를 스트리밍하는 기능을 제공합니다. 이는 미디어 서버를 구축하거나 온라인 스트리밍 플랫폼에 콘텐츠를 제공하는 데 사용될 수 있습니다.
- 필터 및 효과: FFmpeg은 다양한 비디오 및 오디오 필터를 제공하여 콘텐츠를 편집하고 향상시 킬 수 있습니다. 예를 들어, 크기 조정, 자르기, 회전, 색상 보정 및 노이즈 제거와 같은 작업을 수행할 수 있습니다.
- 명령 줄 인터페이스: FFmpeg은 명령 줄 인터페이스를 통해 사용됩니다. 이는 간단한 명령을 사용하여 다양한 멀티미디어 작업을 수행할 수 있으며, 자동화 및 배치 처리에 이상적입니다.
- 라이브러리 형태: FFmpeg은 라이브러리 형태로도 제공되어 다른 응용 프로그램에서 멀티미디어 기능을 사용할 수 있습니다. 이는 비디오 편집 소프트웨어, 미디어 플레이어, 스트리밍 서버 등에서 사용될 수 있습니다.
문제
- 특정 서버에서 동영상 인코딩이 녹화한 길이보다 더 짧게 나타나는 현상 발생
- 문제 확인을 위해 다양한 원인을 살펴보다가 서버 사양과 CPU, Graphic, Memory 같은 시스템 자원 사용 상태 확인
- 문제가 발생한 환경의 서버와 정상 동작 서버간의 시스템 자원 사용률이 상이한 것을 확인
- 정상 : CPU 사용량이 크게 변화가 없으며, 그래픽카드 사용량이 0% 대에서 30~40% 대로 상승한다.
- 비정상 : CPU 를 지속적으로 100% 사용하고 있으며, 그래픽카드 사용량이 증가하지 않는다.
- 각 환경을 비교하면 하기와 같은 차이를 가짐
- 정상 : Nvidia 의 외장 Graphic Card 가 탑재된 환경. 기존 개발도 이 환경에서 확인
- 비정상 : Intel 내장 Graphic 만 탑재된 서버
- 정해진 시간 동안 그래픽카드를 활용하지 않고 CPU 로 100% 동영상 처리를 하는 시스템에서는 지정된 시간 내에 처리를 다 하지 못해 영상이 짧아지는 것으로 추정
- 코드 상, 정해진 시간 동안 녹화 기능을 동작하게 설정해놓음
해결 방법
- Intel 의 내장 그래픽을 사용해보는 방법을 찾아보았습니다.
- Intel 내장 그래픽은 성능이 크게 좋다고 알고 있지는 않았습니다.
- 하지만, CPU 100% 를 사용하는 것보다는 작업을 나눠서 하면 훨씬 효율적으로 동작할 것이라고 생각했습니다.
- 그래픽 전문 작업을 하는 내장 그래픽 카드로 비디오 처리에 CPU 를 쓰는 것보다 훨씬 효율적이라고 생각했습니다.
ffmpeg -codecs
- 위 명령어를 사용하면 위와 같이 현재 설치되어 있는 ffmpeg 의 사용 가능한 코덱을 확인할 수 있습니다.
- 녹화를 할 때 각 서버는 H.264 코덱을 사용했는데, Nvidia Graphic Card 를 탑재한 모델은
h264_nvenc
encoder 를 사용했습니다. - Intel 내장 그래픽만 탑재한 모델은
h264_nvenc
사용이 불가능합니다.libx264
나libopenh264
encoder 를 사용했었는데, 이는 SW 기반 (CPU 사용) 방식이었습니다. - 이 때
h264_qsv
를 사용하면 CPU 사용량은 10% 도 증가하지 않고, 기존에 사용되지 않던 내장 그래픽의 사용률이 30% 정도로 증가한 것을 볼 수 있었습니다. 녹화 시간도 줄어들지 않고 정상 길이로 나오게 되었습니다.- 다만 encoder 가 달라져서 다른 그래픽 카드를 가진 2개의 영상의 퀄리티가 다소 상이해보였습니다.
- 각 서버의 HW 특성을 잘 활용해야 정상적인 SW 동작을 기대할 수 있고, 사전에 HW 가 상이한 경우도 미리 확인해봐야된다는 지식을 얻었습니다.
정보
H.264 는 2003년에 발표된 동영상 표준 규격의 코덱입니다. 기존 MPEG-4 Part 2보다 발전된 비디오 코딩이라 AVC(Advanced Video Coding)로도 통용됩니다. 압축률도 좋을뿐더러 비교적 낮은 비트레이트에서도 좋은 화질을 가져, 많은 서비스들에서 사용하고 있습니다.