ffmpeg command의 구조를 알아보겠습니다.
옵션별 사용 방법은 이 구조를 알고 난 뒤에 학습(?)해도 늦지 않습니다 :)
(소스코드 레벨이 아닌 커맨드를 사용하는 관점입니다. 참고해주세요)
ffmpeg을 간단하게 사용 할 경우 $ ffmpeg -i input.mp4 output.mkv
와 같이 간단하게 사용 할 수 있습니다.
하지만 내가 원하는 행동이 아래와 같이 추가 되면 어떻게 해야 할까요?
bitrate는 얼만큼으로 할까
audio는 몇 khz로 해야 할까
비디오는 소리를 제거하고 오디오만 따로 빼고 싶다
RAW FORMAT으로 처리해야한다
원하는 행동이 복잡해질 수록 커맨드가 복잡하게 느껴지게 되죠
하지만 잘 뜯어보면 상당히 체계적으로 만들어져 있는 녀석임이 분명하다고 생각합니다.
하나씩 알아보도록 하죠:)
아래와 같은 기본 규칙이 있습니다.
명령어는 입력 된 순서대로 실행이 됩니다.
같은 내용을 여러번 반복 해서 사용 할 수도 있습니다.
입, 출력은 상당히 많은 유형의 Data Stream을 포함 시킬 수 있습니다.
명령으로 이해 할 수 없는 옵션은 출력파일 URL 로 간주 됩니다.
위에서 설명한 규칙을 하나씩 풀어서 써보겠습니다.
ffmpeg -i file1.mp4 -i -vf scale=300:-1 file2.mp4 -an -c:v libx264output.mkv
--->>> 명령어는 --->>> 순서대로 --->>> 읽어집니다 --->>>
전역옵션만 순서와 상관없이 실행 됩니다.
-loglevel
,-y
와 같은 전역 옵션은 순서와 관계 없이 실행 됩니다.
만약 글로벌 옵션의 정체가 뭔지 궁금하시면 링크에 들어가셔서 Ctrl+f 와 함께(global)
이라는 키워드를 검색해보시면 더 둘러 보실 수 있습니다.
같은 내용을 여러번 반복 해서 사용 할 수도 있습니다.
입, 출력은 상당히 많은 유형의 Data Stream을 포함 시킬 수 있습니다.
#파일 경로
$ ffmpeg -i /home/data/input.mp4 ...
# HTTP Protocol
$ ffmpeg -i http://www.imtaejong.com/data/input.mp4 ...
# RTMP, SRT 등 Protocol
$ ffmpeg -i rtmp://1.23.45.67:8080/streams.m3u8 ...
# Unix Pipe Access Protocol ([pipe](https://ffmpeg.org/ffmpeg-protocols.html#pipe))
## pipe - input
$ cat input.wav | ffmpeg -i pipe:0
## pipe - output
$ ffmpeg -i input.wav -f avi pipe:1 | cat > output.avi
명령으로 이해 할 수 없는 옵션은 출력파일 URL 로 간주 됩니다.
명령어로 쓰이는 -
(하이픈) 기호가 없이 파일명 혹은 특정 경로를 가르키는 URI가 있는 경우 출력파일 경로로 인식 됩니다.
ffmpeg -i hello_i_m_in.jpg \
https://imtaejong.com/uplaod/this_is_output.png?token=43781be6-c993-453b-8384-0fa770d57893 \
-y
위와 같은 명령어가 실행 될 경우 마지막에 부은 -y
는 전역 옵션으로 인식 되므로 그 앞에 있는 URL이 출력 경로가 됩니다. 이 경우 스트림의 형태로 해당 서버에 업로드가 될 수 있습니다. (FFmpeg HTTP Protocol이 사용 됩니다.)
규칙을 대충 둘러보았으니 이제 커맨드를 한 구문씩 뜯어보겠습니다.
ffmpeg {전역 옵션} [{input.mp4 옵션} -i input.mp4] [{output1.mp4} output1.mp4] {other..}
위의 명령어를 하나씩 하나씩 설명해보겠습니다.
ffmpeg
우리가 실행시키는 ffmpeg
실행파일 입니다.
이 파일은 ffmpeg 디렉터리 내에 있는 configure
및 make
명령어를 통해 만들어진 바이너리형태의 독립 실행파일입니다.
단순히 실행파일 이기 때문에 부담없이 이름을 바꾸고 위치를 바꿔도 아무 상관이 없습니다.
make install
을 실행 했다면 /usr/bin
or /usr/local/bin
과 같은 $PATH
경로 중에 위치해 있습니다
피카츄 배구 실행파일을 바탕화면에서 다운로드 폴더로 옮겨도 실행이 되는 것과 같이, 이 ffmpeg 파일도 이리 저리 옮겨도 상관 없습니다.
{전역옵션}
한번의 명령을 실행 할 때에 적용 시킬 전역 옵션을 써놓는 영역입니다. 전역옵션은 명령어의 순서와 관계가 없지만 명령어가 길어지기 시작하면 구조화 시켜야 할 필요가 생깁니다.
개인적으로는 가장 앞에 놓는 것이 덜 혼란스럽더군요..
[{input.mp4 옵션} -i input.mp4] [{output1.mp4} output1.mp4]
(같이 설명하겠습니다)
배열의 형태로 쓰이기 때문에 대괄호로 묶었습니다. 명칭은 Stream
이라고 합니다.
이미지에서 보이는 명령어를 보면 input0.mp4
가 -map 0:0 으로 지정 됩니다. 그리고 그 다음에 써있는 input1.mkv
는 -map 1:3 에서 1
번으로 지정 됩니다. 그냥 써있는 순서대로 0번부터 쭈욱 배열로 연결 되는 형태입니다.
조금 더 상세히 보기 위해 세가지 색의 사각형과 명령어 기본구조를 다시 보겠습니다.
만약 명령어가 너무 길어지게 되면 \
(역슬래시)를 이용해 아래와 같이도 사용 가능합니다.
output
한 개 인 경우$ ffmpeg \
-i input0.mp4 \
-i input1.mkv \
-map 0:0 -map 1:3 output.mp4
output
두 개 인 경우$ ffmpeg \
-i input0.mp4 \
-i input1.mkv \
-map 0:0 -map 1:3 output.mp4 \
-map 0:0 -map 1:1 output_with_eng.mp4
\
는 Shell 기본 명령어 기능입니다.
ffmpeg이 아니더라도 bash, zsh와 같은 터미널 환경에서 공통으로 사용 가능합니다.
규칙을 설명하다보니 주절주절 이야기가 길었지만... 잘 읽어보시고 한번만 딱 파악해놓으시면 많이 유용 하실 겁니다.
이번에는 이렇게 부랴부랴 끝내고..
이 다음번 부터는 ffmpeg filter 종류에 대해서 하나씩 풀어볼까 합니다.
버전 정보
분류 | 프로그램 | 버전 |
---|---|---|
OS | Ubuntu | 20.04 (Focal Fossa) |
Client | FFmpeg | n4.1.3 |
Terminal | dash | 0.5.10.2-6 |
ffmpeg map
image - https://trac.ffmpeg.org/wiki/Map