FFmpeg 명령어 구조 살펴보기 (2)

imtaejong·2020년 5월 7일
3

FFmpeg Filter

목록 보기
2/2
post-thumbnail

FFmpeg 명령어 구조 살펴보기


개요

ffmpeg command의 구조를 알아보겠습니다.
옵션별 사용 방법은 이 구조를 알고 난 뒤에 학습(?)해도 늦지 않습니다 :)
(소스코드 레벨이 아닌 커맨드를 사용하는 관점입니다. 참고해주세요)

왜 이걸 알아야 하나요

ffmpeg을 간단하게 사용 할 경우 $ ffmpeg -i input.mp4 output.mkv 와 같이 간단하게 사용 할 수 있습니다.
하지만 내가 원하는 행동이 아래와 같이 추가 되면 어떻게 해야 할까요?

bitrate는 얼만큼으로 할까
audio는 몇 khz로 해야 할까
비디오는 소리를 제거하고 오디오만 따로 빼고 싶다
RAW FORMAT으로 처리해야한다

원하는 행동이 복잡해질 수록 커맨드가 복잡하게 느껴지게 되죠
하지만 잘 뜯어보면 상당히 체계적으로 만들어져 있는 녀석임이 분명하다고 생각합니다.
하나씩 알아보도록 하죠:)


문법

아래와 같은 기본 규칙이 있습니다.

규칙

  1. 명령어는 입력 된 순서대로 실행이 됩니다.

  2. 같은 내용을 여러번 반복 해서 사용 할 수도 있습니다.

  3. 입, 출력은 상당히 많은 유형의 Data Stream을 포함 시킬 수 있습니다.

  4. 명령으로 이해 할 수 없는 옵션은 출력파일 URL 로 간주 됩니다.


규칙 설명

위에서 설명한 규칙을 하나씩 풀어서 써보겠습니다.

  1. 명령어는 입력 된 순서대로 실행이 됩니다.
ffmpeg -i file1.mp4 -i -vf scale=300:-1 file2.mp4 -an -c:v libx264output.mkv
     --->>> 명령어는 --->>> 순서대로 --->>> 읽어집니다 --->>>

전역옵션만 순서와 상관없이 실행 됩니다.
-loglevel, -y와 같은 전역 옵션은 순서와 관계 없이 실행 됩니다.
만약 글로벌 옵션의 정체가 뭔지 궁금하시면 링크에 들어가셔서 Ctrl+f 와 함께 (global) 이라는 키워드를 검색해보시면 더 둘러 보실 수 있습니다.

  1. 같은 내용을 여러번 반복 해서 사용 할 수도 있습니다.

    • 순서대로 실행 되는 과정에서 입력 되는 내용이 여러번 중복 되어도 에러(or 경고) 처리가 되지 않습니다.
  2. 입, 출력은 상당히 많은 유형의 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
  3. 명령으로 이해 할 수 없는 옵션은 출력파일 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..}

위의 명령어를 하나씩 하나씩 설명해보겠습니다.

  1. ffmpeg
    우리가 실행시키는 ffmpeg 실행파일 입니다.
    이 파일은 ffmpeg 디렉터리 내에 있는 configuremake 명령어를 통해 만들어진 바이너리형태의 독립 실행파일입니다.
    단순히 실행파일 이기 때문에 부담없이 이름을 바꾸고 위치를 바꿔도 아무 상관이 없습니다.
    make install을 실행 했다면 /usr/bin or /usr/local/bin과 같은 $PATH 경로 중에 위치해 있습니다

    피카츄 배구 실행파일을 바탕화면에서 다운로드 폴더로 옮겨도 실행이 되는 것과 같이, 이 ffmpeg 파일도 이리 저리 옮겨도 상관 없습니다.

  2. {전역옵션}
    한번의 명령을 실행 할 때에 적용 시킬 전역 옵션을 써놓는 영역입니다. 전역옵션은 명령어의 순서와 관계가 없지만 명령어가 길어지기 시작하면 구조화 시켜야 할 필요가 생깁니다.
    개인적으로는 가장 앞에 놓는 것이 덜 혼란스럽더군요..

  3. [{input.mp4 옵션} -i input.mp4] [{output1.mp4} output1.mp4] (같이 설명하겠습니다)
    배열의 형태로 쓰이기 때문에 대괄호로 묶었습니다. 명칭은 Stream 이라고 합니다.

    ffmpeg
    이미지에서 보이는 명령어를 보면 input0.mp4가 -map 0:0 으로 지정 됩니다. 그리고 그 다음에 써있는 input1.mkv는 -map 1:3 에서 1번으로 지정 됩니다. 그냥 써있는 순서대로 0번부터 쭈욱 배열로 연결 되는 형태입니다.

    조금 더 상세히 보기 위해 세가지 색의 사각형명령어 기본구조를 다시 보겠습니다.

  • 노란색 - Input Area
  • 빨간색 - Input Area
  • 연회색 - Output Area

만약 명령어가 너무 길어지게 되면 \(역슬래시)를 이용해 아래와 같이도 사용 가능합니다.

  • 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 종류에 대해서 하나씩 풀어볼까 합니다.


Version Info

버전 정보

분류프로그램버전
OSUbuntu20.04 (Focal Fossa)
ClientFFmpegn4.1.3
Terminaldash0.5.10.2-6

Reference

ffmpeg map image - https://trac.ffmpeg.org/wiki/Map

0개의 댓글