FFmpeg은 오디오·비디오 등 위한 오픈소스 멀티미디어 프레임워크입니다.
ffmpeg으로 영상/음성 인코딩 및 자르기, 합치기, 필터링 등을 수행가능하다
ffmpeg: cli 명령어
ffprobe : 미디어 조회, duration, fps, codec 등 정보 수집, 분석 도구
ffplay : 영상 플레이
nodejs/nest js에서 child_process를 통해 명령 전달 가능함
* child_process 란 : nodejs 환경에서 python, git, ffmpeg등 외부 프로그램을 실행 할 수 있도로 지원하는 프로세스 모듈
* 인코딩이란 원본 RAW 데이터를 압축 하여 컨테이너에 담는 과정
영상 인코딩 과정
- 각 픽셀 은 24bit ( = 3byte 의 R,G,B ) 로 구성됨
- 하나의 프레임에는 width x hight x 3byte로 나열됨
- 1fps = 1920 x 1080 x 3 = 6,220,800 bytes ( 약 6MB)
- 1초에 30 fps 인경우 -> 6MB x 30 = 180MB ==> 용량이 매우커서 압축 필요
- 압축은 코덱으로 수행
- H.264, H.265 ( 영상)
- ACC, Opus ( 오디오 )
- 압축된 스트림 포맷으로 정의 ( 포맷은 데이터를 담는 그릇 )
- MP4 : 가장 범용적, IOS, Android, Window 모두 지원 / 자막, 메타데이터 비교적 약함
- MKV : 기능성 가장 우수, 모든 코덱 지원, 모든 자막 지원, 자유도 높음, IOS, 웹 호환성 낮음
- MOV : 영상 편집 최적화 / 파일 크기 큼, 호환성 떨어짐
- AVI : 전통적 포맷, 단순한 구조 / 호환성, 오디오 싱크 등 문제 발생
- WebM : 구글, 웹용 오픈 포맷, 유튜브, 웹스트링 최적화, 가벼운 고효율 / 코덱 제한적, 호환성 낮음
- 코덱을 사용하여 포멧에 저장시 저장되는 내용
- 비디오 스트림
- 오디오 스트림
- 자막 스트림
- 메타데이터
- 타임스탬프

포맷 장단점
| MP4 | 웹/모바일 표준 | H.264/H.265 | 호환성 최고 | 자막/메타데이터 약함 |
| MKV | 자유도·기능 최고 | 거의 모두 | 자막·오디오·메타 풍부 | 브라우저 호환 약함 |
| MOV | Apple/편집용 | ProRes | 전문 편집에 최적 | 파일 크기 큼 |
| AVI | 레거시 포맷 | 다양하지만 제한 | 단순 | 현대 기능 부족 |
| WebM | 웹 최적 | VP9/AV1 | 웹 스트리밍 최강 | H.264 불가 |