FFMPEG 사용 방법
FFMPEG 란?
MPEG 영상 표준화 그룹에서 유래했고, "mpeg" 앞에 붙은 "FF"는 패스트 포워드(fast forward)를 의미한다.
FFMPEG 은 비디오, 오디오, 이미지를 쉽게 인코딩 (Encoding), 디코딩 (Decoding), 먹싱 (Muxing), 디먹싱 (Demuxing) 할 수 있도록 도움을 주는 멀티미디어 프레임워크이다.
코딩(Coding) : 컴퓨터가 알아먹을 수 있도록 이진코드(binary code) 를 입력하는 것을 말한다.
인코딩(Encoding) : 특정한 데이터포맷으로 데이터를 가공하는것을 말한다. 원본 영상 데이터로부터 특정
디코딩(Decoding) : 특정 동영상 코덱을 사용하여 원본 영상 데이터를 얻는 것
먹싱(Muxing) : multiplexing 의 약어로 데이터를 섞는 것이다. 데이터를 종류별로 따로 따로 구분해서 보내는 비효율을 없애기 위해 사용된다.
디먹싱(Demuxing) : demultiplexing 의 약어로 먹싱된 데이터를 다시 종류별로 뽑아내는 것을 말한다.
ffmpeg 의 작동 방식
- 입력파일을 demuxer가 열어서 각 채널별로 인코딩된 데이터 패킷으로 변경한다.
- 다시 인코딩된 패킷은 각각의 디코더에 의해서 프레임으로 변환된다.
- 프레임에 대해 필터링을 적용한다. 필터는 프레임의 내부를 변환하여 다른 프레임을 생성한다.
- 변환된 프레임들을 다시 인코더가 패킷으로 변환한다.
- muxer에 의해 인코더가 뱉은 패킷을 파일 포맷에 맞게 싸넣는다.
FFMPEG 을 왜 사용할까?
영상 및 오디오를 압축하는 알고리즘에는 수많은 종류가 존재한다. 따라서 영상 및 오디오를 정상적으로 재생하려면 수 많은 압축 알고리즘을 모두 직접 구현해야만 한다. 그러나 영상 및 오디오를 압축하는 프로그램들이 매우 복잡하며 그 종류도 매우 많기 때문에 이를 짧은 시간안에 개발하는 것은 매우 어렵다. 그러나 FFMPEG 은 오픈소스로 전 세계의 개발자들이 개발을 하기 때문에 이러한 수 많은 종류의 영상 및 오디오 코덱 및 파일 포맷등을 지원하고 있다.
즉, 멀티미디어 관련 프로그램을 개발하는데 있어서 직접 영상 및 오디오를 압축하는 프로그램을 개발하는 것 보다 FFMPEG 을 잘 사용하는 것이 쉽기때문에 이용한다.
FFMPEG 을 사용하는 방법
FFMPEG 은 명령어를 직접 입력하는 방식으로 동작 한다.
(1) 비디오에서 오디오 추출
ffmpeg -i $dstName -map 0:a -c copy $extractFile
(2) 오디오 + 오디오 병합
ffmpeg -i $mr_path -i $extractFile -shortest -filter_complex '[0:a]volume=0.5[a0]; [1:a]volume=3.5[a1]; [a0][a1]amix=inputs=2[out]' -map '[out]' -ac 2 -c:a aac $mergeAudio
-ac 숫자 : 오디오 채널을 지정한다
-c:a : 오디오 코덱을 뜻한다. 여기서는 aac 로 함
(3) 비디오 + 오디오 병합
ffmpeg -i $dstName -i $mergeAudio -c copy -shortest -map '0:v:0' -map '1:a:0' -y $mergeVideo
-y : 출력파일을 쓸 때 같은 이름의 파일이 있어도 항상 덮어쓰기를 하겠다는 의미
-copy : 비디오의 코덱과 오디오의 설정을 동일화시킨다는 의미
(4) 비디오 + 비디오 병합
ffmpeg -i input1/mp4 -i input2.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2:shortest=1[outv]" -map "[outv]" -movflags frag_keyframe+empty_moov output.avi
-filter_complex : 복합 필터 그래프는 조금 더 복잡한 문법이나 심플 필터 그래프를 여러개 사용하는 것이다. 여러 파일을 한 번에 연결/합성하거나, 혹은 출력이 2개 이상인 필터를 사용할 때 적용한다.
-hsatck : hstack 필터를 사용해서 가로로 연결한 비디오를 만든다
(5) 비디오 썸네일 추출
ffmpeg -i video.mp4 -ss $getFromSecond -s $size output.png
-i : 입력 파일 이름
-ss : Start Second, 이미지 캡쳐 시간 (초)
-s 숫자 : Frame size (가로x세로) , 해상도
size : 추출하고싶은 이미지 파일의 사이즈 (내가 원하는 크기로 변수 $size 에 맞추어 입력해줌)
(6) png → mp4 파일 변환
ffmpeg -r 1/5 -i image.png output.mp4
-r 숫자 : 출력 동영상 프레임레이트를 지정한다