(Java) ffmpeg을 활용한 동영상 처리하기

유인근·2021년 3월 6일
1

Java

목록 보기
2/2
post-thumbnail
post-custom-banner

About

Java에서 ffmpeg을 활용한 동영상 압축, 썸네일 생성, 재생시간 추출 등의 작업을 진행하면서 작업한 과정과 방법에 대해 기록해 보고자 한다 : )

To Do

동영상과 관련해서 기능적으로 구현하고자 하는 것은 아래 4가지 항목이다.

  • 압축(파일 용량 줄이기)
  • 썸네일 생성(단순 프레임 이미지가 아닌, 영상 썸네일)
  • 파일 크기(너비, 높이) 구하기
  • 재생시간 추출(초 단위)

이때 Java에서 동영상 파일을 다루는 여러 오픈 소스를 찾는 과정에서 ffmpeg 프레임워크ffmpeg-cli-wrapper 오픈 소스(https://github.com/bramp/ffmpeg-cli-wrapper)를 알게 되었고, 이 2개를 사용하기로 했다. 이유는 사용 목적에 따라 다르겠지만 라이센스에 문제 되지 않는 오픈 소스이면서 사용법이 비교적 간단해 보였기 때문이다.

ffmpeg은 비디오, 오디오, 이미지를 쉽게 인코딩 · 디코딩 · 먹싱 · 디먹싱 할 수 있는 오픈 소스 프로젝트이다.

ffmpeg-cli-wrapper는 Java에서 ffmpeg을 사용할 수 있게 해주는 즉, Java와 ffmpeg의 중간 다리 역할을 해주는 cli wrapper이다.

따라서 To Do 항목을 정리해보면 다음과 같다.

  1. ffmpeg 설치
  2. ffmpeg-cli-wrapper 의존성 추가
  3. 동영상 처리 기능 구현

ffmpeg 설치하기

ffmpeg을 설치하는 방법에는 OS에 따라 여러 방법이 있겠지만, macOS와 Linux 환경에서 아래 방법으로 ffmpeg이 잘 설치되는 것을 확인했다.

  • macOS(Homebrew로 설치)
brew install ffmpeg

위 방법은 매우 간단하지만, ffmpeg에는 다양한 코덱 라이브러리가 필요하기 때문에 설치는 꽤 오래 걸렸다. 그래도 필요한 라이브러리를 따로 설치받게 되면 더 복잡 했을텐데, Homebrew 덕분에 간단하게 설치할 수 있었다.

Ubuntu 환경에서도 시도해보기 위해 linuxbrew를 다운받아, 똑같이 설치해봤는데 설치 과정 중에 라이브러리별로 버전 호환 문제가 계속적으로 발생해 포기했다...

cd /usr/local/bin
mkdir ffmpeg
cd /usr/local/bin/ffmpeg
wget https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-3.4.2-64bit-static.tar.xz
tar -xf ffmpeg-release-amd64-static.tar.xz
ln -sfn /usr/local/bin/ffmpeg/ffmpeg-*-amd64-static/ffmpeg /usr/bin/ffmpeg
ln -sfn /usr/local/bin/ffmpeg/ffmpeg-*-amd64-static/ffprobe /usr/bin/ffprobe

위 방법은 ffmpeg build 결과물을 그대로 다운받아 사용하는 방법인데, 이 방법은 꽤 간단하면서도 빠르게 사용할 수 있었다. 다만 위 명령어를 스크립트로 빈번하게 실행하는 경우에는 static build 파일을 제공하는 사이트의 주소가 얼마든지 바뀔 수 있기 때문에 나만의 저장소에 따로 보관해서 사용하는 것이 안전하고 좋을 거 같다.

  • ffmpeg 설치 확인
ffmpeg // ffmpeg이 정상적으로 설치되면 아래와 같이 확인 가능

ffmpeg-cli-wrapper 의존성 추가

위 과정에서 설치한 ffmpeg을 Java 프로젝트에서 사용하기 위해 ffmpeg-cli-wrapper 의존성을 추가해줘야 한다. 그래야 ffmpeg 명령어를 프로젝트 내부의 Java 코드로 구현할 수 있다. Maven이나 Gradle에서 다음과 같이 의존성을 추가해주면 된다.

  • Maven
<dependency>
  <groupId>net.bramp.ffmpeg</groupId>
  <artifactId>ffmpeg</artifactId>
  <version>0.6.2</version>
</dependency>
  • Gradle
compile group: 'net.bramp.ffmpeg', name: 'ffmpeg', version: '0.6.2'

(*출처: https://github.com/bramp/ffmpeg-cli-wrapper)

ffmpeg-cli-wrapper 사용한 코드를 작성해 실행해보면 실제 다음과 같은 ffmpeg 명령어가 실행되는 것을 로그상으로 확인할 수 있다.

결과

  • 블로그에 동영상 업로드가 되지 않아 skip!

느낀점

동영상은 파일 중에서도 사이즈가 크다 보니까 성능상의 이슈가 특히 중요하다고 느꼈다. 구현한 4가지 기능(압축, 썸네일, 크기, 재생시간 추출)의 작업 시간과 CPU 사용률을 대략적으로 살펴봤을 때, 특히 동영상 압축 작업이 가장 오래 걸리고 CPU 사용률이 높게 치솟았다. 이러한 점들 때문에 실제 서비스를 운영하는 환경에서는 동영상을 처리하는 별도의 서버를 두는 것도 고려해볼 수 있을 거 같다.

그리고 ffmpeg과 같은 멀티미디어를 따로 설치해야 하기 때문에, AWS를 사용한다면 EC2에 별도로 ffmpeg을 설치해 AMI로 구성할지 등에 대한 고민도 필요할 거 같다.

지난번 Animated GIF 썸네일 생성하기에 이어서 이번에 동영상 파일 처리를 위한 작업을 진행했는데 ffmpeg을 설치하는 것부터 시작해서 많은 삽질을 한 거 같다...

그래도 원하는 결과물을 만들어낼 수 있어서 뿌듯했고 그 과정에서 동영상 처리를 위해 주의할 점을 계속적으로 고민해볼 수 있는 좋은 기회였다.

profile
조금씩 꾸준하게 🔥
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 2월 20일

덕분에 좋은 내용 잘 보고 갑니다.
정말 감사합니다.

답글 달기