메뉴 건너뛰기

Hodol's Blog

Documents FFMPEG 명령 사용법

2015.08.16 00:02

Hodol 조회 수:9638

FFMPEG 명령 사용법

목차

ffmpeg는 성능이 좋은 오픈소스 비디오/오디오 변환 프로그램이다. ffmpeg로 수준 높은 멀티미디어 작업을 할 수는 있지만 그 진입 장벽이 높다. 이 글에서는 간단한 ffmpeg의 사용법을 알아보도록 한다. 늘 드리는 말씀이지만, 이 문서 역시 야매 문서이다.

 

동영상 파일의 구조
글쓴이는 데스크탑에 있던 동영상을 모바일 기기에서 재생하려고 하였지만 모바일 기기의 성능이 해당 동영상을 재생하기엔 충분치 않았고 파일을 변환할 필요성을 알게 되었다. 그래서 여러 변환 프로그램들을 구해 사용해보려고 했지만 무엇을 어떻게 설정해야 모바일 기기에 알맞은 것인지를 몰랐기에 시행착오를 격어야 했다. 프로그램에서 자체적으로 제공되는 프리셋을 이용할 수도 있었지만 이 경우에는 왠지 영상의 품질이 불충분하다는 느낌도 없지 않았다. 따라서 ffmpeg 명령을 알아보기에 앞서 동영상 파일들이 어떻게 생겼는지를 살펴볼 필요가 있다: 동영상 파일은 비디오 정보, 오디오 정보 등을 하나로 묶어(mux) 놓은 것이다. 이들 정보를 하나로 묶는 개념을 컨테이너(container)라고 부르며 정보를 묶는 방식에 따라 파일의 확장자가 달라진다. 컨테이너 안에 있는 정보들, 특히 시간에 따라 변하는 정보를 스트림(stream)이라고 부르는데 예를 들어, 비디오 정보를 비디오 스트림, 오디오 정보를 오디오 스트림, 자막이 포함되어 있다면 이 자막 정보를 자막 스트림이라고 부른다. 또한, 스트림이 꼭 하나씩만 포함되는 것이 아니다. 같은 영상을 두고 각 나라별로 더빙을 다르게 해서 국가별 오디오 스트림들을 한 파일 안에 저장할 수도 있고, 비디오 제작 후기 영상 같은 것도 같이 묶어서 파일을 배포하는 경우도 있다. 이제 스트림에 대해 알아보자. 스트림은 시간에 따라 변화하는 정보를 담고 있으며 동영상 재생 프로그램들은 이 정보들을 정해진 시간마다 해석하여 사용자가 이해할 수 있는 형태로 만들어 출력한다. 이러한 정보는 그 양이 방대해서 저장하기 위해서는 압축될 필요가 있다. 스트림의 정보를 압축을 하고 역으로 압축을 푸는 기술을 코덱(codec)이라고 한다. 여러 가지 코덱들이 존재하며 각각 장단점이 있다. 이제 이 압축된 정보들을 풀어서 재생하였을 때를 생각해 보자. 비디오 파일이라면 영상의 해상도(resolution)나 원래의 데이터로부터 제대로 된 색상을 얼마나 잘 구현할지(bitrate) 1초에 몇 개의 영상을 재생할지(framerate) 등을 고려할 수 있다. 유사하게 오디오 스트림도 어떤 코덱으로 사용하는지 어느 음역대까지 소리를 구현할지(channel, bitrate) 등을 고려할 수 있다. 앞에서 설명된 내용들이 동영상 품질에 어떤 영향을 미치는지 정리해 보자. 노파심에 적자면 동영상의 품질이 좋을수록 이를 재생하는 기기의 성능 또한 좋아야 한다.
  • 코덱은 장단점이 있다. 저장 데이터를 획기적으로 줄이는 코덱이 있는가 하면 데이터 압축을 푸는 속도가 빠르다거나 적당한 성능이지만 무료 라이센스라거나 특정 플렛폼만 지원하며 해당 플렛폼에서는 뛰어난 성능을 보여주는 등 코덱만으로도 고민할게 많다. 이 쪽의 전공자가 아니라면 경험적으로 좋은 코덱을 선택하거나 인터넷에서 코덱 관련 문서를 훑어보는 것이 합리적일 것 같다.
  • 컨테이너는 사실 정보를 어떻게 묶었느냐의 차이라서 이를 처리하는데 거창한 기술이 필요하거나 하지는 않는다. 다만 라이센스 문제로 특정 플렛폼에서 지원이 되지 않는 컨테이너들이 존재한다. 예를 들어, .wmv 확장자를 가지는 파일은 일반적으로 안드로이드나 아이폰에서 재생할 수가 없다.
  • 스트림의 갯수가 여러 개인 경우, 자신에게 필요한 스트림들만 추출하여 저장할 수 있다면 파일 용량을 줄이는 획기적인 방법이 될 것이다. 예를 들어, 블루레이의 국가별로 더빙된 오디오 스트림들을 모바일 기기용으로 변환할 때 한국어 오디오 스트림만 따오면 된다. 사실 ffmpeg 명령 사용 시, 별도의 옵션을 기술하지 않으면 각 비디오/오디오 스트림을 1개씩만 추출하여 사용하는 것이 기본설정으로 되어 있다.
  • 기기의 화면이 높은 해상도를 지원하고 재생되는 파일의 비트레이트가 충분하다면 선명한 고품질의 영상을 감상할 수 있다. 그러나 모바일 기기와 같은 상대적으로 작은 화면에서 재생될 파일이라면 높은 해상도는 필요하지가 않다. 참고로 해상도는 파일의 크기에 큰 영향을 미치지 않는다. 그러나 프로그램 재생 성능에 약간의 부하를 줄 수는 있다.
  • 비트레이트는 영상을 그리는데 얼마나 많은 정보를 사용하는지를 나타낸다. 영상의 품질과 직결되는 것으로 영상을 재생하는 기기가 충분한 해상도를 지원한다면 비트레이트가 높을수록 영상의 품질이 우수하다. 비트레이트와 해상도와 영상의 품질의 관계는 글쓴이가 쓴 문서를 참고하길 바란다.
  • 프레임레이트가 높으면 코덱으로 처리해야할 데이터 양이 많아지므로 재생 성능 저하의 문제가 있고 일반적으로 파일의 크기도 커지지만 기기의 성능이 충분하다면 좀 더 부드럽게 움직이는 영상을 감상할 수 있다. 코덱에 따라 프레임레이트가 높아지더라도 파일의 크기가 크게 변하지 않는 경우도 있다.
  • 오디오의 경우도 영상의 경우와 크게 다르지 않다. 오디오 코덱들도 각각 장단점이 있으며, 비트레이트가 높으면 좀 더 풍성한 음질을 즐길 수 있다, 물론 비트레이트가 높은 영상을 고품질로 즐기려면 높은 해상도를 지원하는 화면이 필요하듯이 오디오의 경우도 재생할 수 있는 음역대가 넓은 스피커가 필요하다. 또한, 5.1채널과 같이 여러 방향의 소리 정보를 담은 오디오 스트림들로 구성된 파일을 이어폰이 달린 모바일 기기용으로 변환할 때에는 스테레오로 변환해도 충분하다.
이제 동영상의 품질을 높이거나 낮추기 위해 어떤 설정의 값을 올려야할지 내려야할지 정도는 알 수 있을 것 같다.

 

FFMPEG 명령 살펴보기
우선 FFMPEG 공식 문서에 따르면 ffmpeg명령은 다음과 같은 구조를 지닌다.
$ ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...
중괄호와 대괄호는 문법적 구조를 보여주기 위한 것일 뿐 실제로 사용하지 않는다. 눈여겨 봐야 할 부분은 중괄호로 묶인 부분들이다. 입력 파일에 대한 옵션은 입력 파일 앞에, 출력 파일에 대한 옵션은 출력 파일 앞에 기술한다. 즉, 옵션을 사용할 때, 순서를 지켜주어야 한다! 이는 다른 명령들과 비교해서 두드러지는 차이점이다. 이 문서에서는 global_optioninput_file_options에 대해 다루지 않을 것이다. 보다 자세한 내용을 원한다면 공식 문서를 참조하도록 하자.
파일 변환에 앞서 우리가 가지고 있는 동영상 파일에 대한 세부 사항을 알 필요가 있으며 다음처럼 출력 파일에 대한 정보를 생략한 명령어로 확인 가능하다.
$ ffmpeg -i input_file
이제 변환 예제를 살펴보도록 하자. 다음은 filename.avi 파일을 outputfilename.mp4으로 변환하는 작업이다. Global 옵션이나 입력 파일(filename.avi)에 대한 옵션은 없으며, 출력 파일에 대한 옵션만 있는 명령이다.
$ ffmpeg -i "filepath/filename.avi" -codec:v libx264 -profile:v baseline -preset slow -b:v 1000k -maxrate 1000k -bufsize 2000k -vf scale=-1:720 -threads 0 -codec:a aac -b:a 128k -f mp4 -ss 00:01:00 -t 01:00:00 -strict experimental "outputfilepath/outputfilename.mp4"
  • -i 옵션은 입력 파일을 지정한다. 위 예제에 -i "filepath/filename.avi" 이후에 기술된 옵션들은 모두 출력 파일에 대한 옵션이다.
  • -codec:v 옵션은 비디오 스트림의 코덱을 지정한다. :v는 비디오를 의미한다.
  • -profile:v 옵션은 일종의 비디오 압축에 사용되는 기술들의 수준을 명시한다. 장치마다 지원하는 기술 수준이 다르며 성능이 낮은 모바일 기기라면 보통 baseline을 사용한다.
  • -preset 옵션은 압축을 하는데 걸리는 시간 또는 압축률을 설정한다. 압축률이 높을수록 데이터를 압축하는데 시간이 오래 걸린다. 압축률이 낮다고 품질이 좋거나 하지는 않으며 압축률이 높다면 파일 용량이 줄어 든다. 설정값으로는 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo를 사용한다.
  • -b:v 옵션은 비디오 스트림의 비트레이트이다. 한프레임의 한 화소를 그리는데 얼마나 많은 정보를 사용할 것인지를 설정한다. 값이 높을수록 영상의 품질은 좋아진다.
  • -maxrate 옵션은 최대 비트레이트이다. 앞의 비트레이트는 평균적인 설정값이고 그렇기에 영상의 어떤 프레임에서는 비정상적으로 큰 값을 가질 수 있다. 이를 막기 위해 상한선을 지정하는 역할을 한다.
  • -bufsize 옵션은 출력 버퍼를 지정한다. 영상이 재생될 때 이 값만큼의 영상데이터가 메모리에 준비된다고 생각하자.
  • vf 옵션은 비디오 필터이다. 이 뒤에 2차 옵션이 따라온다.
  • scale 옵션은 비디오 필터의 부분 옵션으로 영상의 해상도를 지정한다. 1024x768 형식으로 설정할 수도 있으나 예문에서처럼 -1:720 형식의 설정을 주로 쓴다. 이는 소위 말하는 720p 영상이라는 뜻으로 영상의 높이가 720픽셀이라는 뜻이다.
  • threads 옵션은 작업을 하는데 사용할 CPU 코어의 갯수를 의미한다. 물론 많은 코어를 사용하면 작업 속도도 빠르다. 0으로 설정하면 알아서 최적화된 코어 갯수를 설정하여 작업한다.
  • -codec:a 옵션은 오디오 스트림의 코덱을 지정한다. :a는 오디오를 의미한다.
  • -b:a 옵션은 오디오 스트림의 비트레이트이다. 높을수록 좋은 품질의 음성을 감상할 수 있다.
  • -f 옵션은 파일 포맷을 지정한다. ffmpeg는 출력 파일의 이름에 근거하여 파일 포맷을 스스로 결정하므로 특별한 일이 아니라면 지정할 필요가 없다.
  • -ss 옵션은 파일의 시작 부분이다. 즉, 입력 영상의 1분부터 녹화를 하겠다는 의미이다.
  • -t 옵션은 멀티미디어의 재생 시간이다. 즉, 1시간 동안 재생을 하겠다는 의미이며 위의 예제의 경우, 출력 파일을 재생하게 되면 입력 파일의 1분에서 1시간 1분까지에 해당하는 내용이 1시간동안 재생된다. -to 옵션은 입력 영상으로부터의 녹화가 끝나는 지점을 명시하는데 -t옵션 대신 이를 사용하였다면 출력 파일은 입력 파일의 1분에서 1시 사이에 해당하는 데이터를 총 59분에 걸쳐 재생하게 된다.
  • -strict experimental 옵션은 제한은 완화하는 옵션이다. 갖가지 옵션들이 섞여서 무언가 제한 사항이 있는 모양인데 이를 무시하고 작업을 진행하도록 한다.