[FFMPEG] Command 사용법 및 예제

개발 2017. 9. 12. 14:35

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ffmpeg는 오픈소스이면서, 비디오/오디오 관련한 많은 기능을 제공하고 있으며, 성능또한 상당히 좋은 편이다. 

ffmpeg는 크게 4가지로 분류하면 다음과 같다. 


1. ffmpeg : command line 도구 ( 동영상 크기및 코덱을 변경하경 할수 있다. ) 

2. ffserver : 동영상 streaming을 위한 서버 

3. ffplay : SDL 이라는 오픈소스 기반으로 player를 해주는 컴포넌트 

4. ffprobe : 간단한 멀티미디어(동영상) 분석도구 


이중에서 가장 기본이되고 방대한것이 바로 ffmpeg command line 인데, 

이걸로 무엇을 할 수 있는지 알아 보자. 


[사전준비] 

각 OS별로 컴파일된 binary를 사용해서 command를 연습해 볼 수 있다. 

https://ffmpeg.org/download.html 에서 OS별로 선택해서 다운받으면 된다. source code를 다운받지 말고 빌드된 binary를 받으면 된다. 현재 최신버전은 3.3.3 입니다. 



[기본 cmd 구조] 

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...


 * global_options 

  - 입력, 출력 파일에 모두 적용 되는 옵션 

  -y, -n 처럼 강제로 output을 덥어 쓸지 정하는 옵션이 있는데, 몇가지 없음. 


 * input_file_options & input_url  

  - input에 사용되는 옵션으로 -i 앞에 위치한다. 

  - input이 여러개가 사용될 경우, 각 옵션들은 각각 input에 적용된다. 


 * output_file_options & output_url 

  - output 파일이름과 옵션들. 

  - 출력을 많이 변경하므로 여기에 옵션이 많이 사용된다. 


 * 참고 : 기본문서 

  - https://ffmpeg.org/ffmpeg.html : 간단문서 

  - https://ffmpeg.org/ffmpeg-all.html : 자세한 문서 

  - https://trac.ffmpeg.org/wiki : ffmpeg 위키문서 (버그, 가이드, 기타등등 ) 



case study


 * mp4 파일에서 비디오 제거하기 ( = audio 추출하기 ) 

ffmpeg -i input.mp4 -vn output.mp4 

 - 입력파일로 input.mp4 파일을 지정 

 -an : disable audio recording

 이렇게 하면 input파일에서 오디오 track을  decode 하고, 다시 encode 하는 과정을 거치게 된다. 그래서 인지 audio bitrate가 127KBit/s 에서 71KBit/s으로 변경되었다. 오디오 트랙을 그대로 보존하고 싶으면 아래처럼 옵션을 추가하면 된다. 추가로 encode/decode 과정이 없어서 속도가 더 빠르게 된다. 

ffmpeg -i input.mp4 -acodec copy -vn output.mp4

- acodec copy : audio를 디코딩/인코딩 하지 않고 그냥 copy 하라는 의미 

ffmpeg 명령어중에 같은 의미이지만 alias로 여러가지 방식으로 표현이 가능한데, -acodec copy은 다음과 같이 여러가지 방식으로 표한할수 있다. 

-c copy : 코덱을 그냥 카피하라는 의미, 오디오 비디오 모두에 해당한다. 

-acode copy : 오디오코덱을 카피하라는 의미 ( -vcode 은 비디오라는 뜻 ) 

-c:a copy : 코덱인데 오디오라는 의미 ( -c:v 이면 비디오라는 뜻 ) 


동영상에서 음악을 mp3 형식으로 뽑아내고 싶으면 아래와 같이 할 수있다. 

ffmpeg -i input.mp4 -vn output.mp3

 output 파일의 형식을 mp3로 하면 내부에서 자동으로 디코딩을 한후에 mp3 코덱으로 인코딩을 수행한다. 아래의 명령과 같은 의미가 된다. 

ffmpeg -i input.mp4 -acodec mp3 output.mp3

위와 똑같고 명시적으로 encoding할 codec을 알려주었다. 


* mp4 파일에서 특정 구간만 짤라서 뽑아 보자. 

ffmpeg -i input_20s.mp4 -vn -ss 5 -to 10 -c copy ouput_5_10.mp4

 -ss 5 : 시작 위치를 지정한다. (즉, 5초부터 시작한다. )

 -to 10 : Stop writing the output at position ( 즉, 10초까지만 사용한다. )

20초짜리 동영상파일에서 비디오를 제거하고(-vn) 5초부터 10초까지의 audio 파일만 crop 하는 명령이다. 


* 끝부분을 부드럽게 crop 하기 위해서 fade out 효과를 주면서. 

ffmpeg -i input_60s.mp4 -to 30 -filter_complex "afade=t=out:st=28:d=2" output_fadeout.mp3

-to 30 : 처음부터 30초까지 짜르라는 의미

-filter_complex : 복합필터를 적용하라는 뜻 

"afade=t=out" : fade효과인데 타입(t)은 서서히 줄어드는 효과(out) 

st=28 : (startTime) 28초부터 시작해서 

d=2 : (duration) 2초동안

명령이 조금씩 길어지는데, 위의 설명을 천천히 보면 알 수 있다. 위에서는 처음부터 30초까지 짤르면서 fade-out 효과를 주었는데, 10초부터 30초까지 중간을 짜르면서 앞에 fade-in 효과를 추가하고 싶으면 어떻게 할까? 

ffmpeg -i input.mp4 -ss 10 -to 30 -filter_complex "afade=t=in:st=10:d=1,afade=t=out:st=29:d=1" output.mp3

점점 복잡해진다. ^^; 


* 오디오 파일을 반복해서 붙여 볼까? 

ffmpeg -stream_loop 1 -i input.mp3 -c copy output_loop.mp3

-stream_loop n : n번 반복하라는뜻, 0은 반복 없음. -1은 무한 반복

위에있는 stream_loop는 입력파일 앞에 추가한 input_file에 대한 옵션이다. ffmpeg는 입력을 받아서 출력으로 쓰는 형식인데, 입력은 반복해주면 출력결과가 반복(loop)이 되는 것이다. 


* 오디오파일1, 오디오파일2를 붙이고 싶으면? 

ffmepg -i "concat:input_1.mp3|input_2.mp3" output.mp3

-i 다음에 입력파일이 오는 위치인데, 이부분에 따옴표가 붙으면서 subcommand가 왔다. 

concat:file1|file2|file3...    형식으로 붙이고 싶은 많큼 파일을 붙일 수 있다. 


* 오디오파일과 비디오파일을 합쳐볼까? 

ffmpeg -i audio_only.mp3 -i video_only.mp4 -c copy ouput_mux.mp4

오디오만 있는 파일과 비디오만 있는파일 2개를 사용해서 하나의 동영상 파일로 만든다. 

2개의 입력파일 시간이 다를경우, 최종 output 길이는 긴 것으로 된다. 만약 비디오파일이 30초길이고 음악이 20초길이면 결과물 output을 play 해보면 20초까지는 동영상과 음악이 같이 나오다가 21초부터는 영상만 나오게 된다. 





: