Live-Streaming/WebRTC
WebRTC (7) - Kurento RecorderEndpoint + FFmpeg (3)
아케인222
2023. 3. 10. 02:04
1) FFmpeg이란?
- 마이클 니더마이어의 주도 하에 개발되고 있는 오픈소스 프로젝트
- LGPL / GPL 라이선스를 따르며, 모든 동영상 / 사진 포맷들의 인코딩/디코딩을 목표로 개발 진행 중
- FFmpeg 자체는 오픈소스 이지만 FFmpeg 내에 사용되고 있는 H.264/H.265와 같은 유료 (로열티 문제)
--- FFmpeg에서는 다음과 같은 기능을 제공함 ---
-
ffmpeg - 미디어 포맷 변환 도구
-
ffplay - 간이 파일 재생기
-
ffprobe - 미디어 정보 표시 도구
-
libavcodec - 오디오/비디오 코덱 라이브러리
-
libavformat - 멀티미디어 컨테이너의 디먹서/먹서 라이브러리
-
libavdevice - 입출력 장치 제어 라이브러리
-
libavfilter - 미디어 필터 라이브러리
-
libswscale - 이미지 처리 라이브러리
-
libswresample - 오디오 처리 라이브러리
- 이 중 FFmpeg과 FFprobe를 이용해 미디어를 전처리 후 업로드 하였다.
- FFmpeg을 설치 하기 위해 window의 경우 직접 설치 후 환경 변수를 설정해주면 된다.
- Linux ubuntu의 경우 sudo apt-get으로 쉽게 설치가 가능하다
- macOS의 경우 homebrew로 쉽게 설치가 가능하다
- 설치 완료 후 cli창에서 ffmpeg 을 입력 했을 때 위와 같이 나온다면 제대로 설치 + 경로 설정이 완료 된 것이다.
- linux나 macOS에서 설치 경로를 확인하고 싶다면 which ffmpeg을 입력하면 다음과 같이 확인할 수 있다.
2) FFmpeg Java (Wrapper) 란?
- FFmpeg을 java에서 제어하기 위한 wrapper library
- FFmpeg의 경우 설치 후 cli에 명령어를 입력하여 제어하는 방식
- 위 라이브러리를 이용할 경우 그러한 작업들을 java 코드를 이용해 대신 제어할 수 있게 된다.
- Maven or Gracle dependency에 net.bram.ffmpeg을 추가 하면 됨 (현재 latest version은 0.7.0)
FFmpeg ffmpeg = new FFmpeg("/path/to/ffmpeg");
FFprobe ffprobe = new FFprobe("/path/to/ffprobe");
- FFmpeg과 FFprobe가 설치된 경로를 이용해 각 객체를 생성 해주고 사용하면 된다.
- FFmpegBuilder를 이용해 작업을 만들고
FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
// Run a one-pass encode
executor.createJob(builder).run();
- 위와 같이 executor를 이용해 실행 해주면 된다.
- 주의 할 점은 executor.createJob()을 통해 나오는 FFmpegJob 객체는 Runnable을 상속 받고 있고, Runnable.run()을 직접 호출하면 메인 스레드에서 해당 작업을 실행하는 것과 같다.
- 즉, mp4 HLS 변환과 같은 오래 걸리는 작업을 위와 같이 실행하게 되면 메인 스레드가 블로킹 당할 수 있다.
- CompletableFuture.runAsync를 이용해 Runnable을 argument로 넘겨 메인 스레드가 아닌 ForkJoinPool에 있는 스레드로 작업을 처리할 수있다.
3) With RecorderEndpoint
- RecorderEndpoint에서 레코딩이 완료 되면 .mp4 파일을 생성
- FFmpeg 및 FFmpeg JAVA를 이용해 해당 파일을 읽어 gif 생성 및 HLS (m3u8 / ts) 으로 포맷 변경 가능
- CompletableFuture를 이용해 해당 작업이 끝나는 시점을 특정 할 수 있고, 변환 작업이 끝나면 업로드 등의 다음 작업 처리