[FFMPEG] Command 사용법 및 예제
개발 2017. 9. 12. 14:35ffmpeg는 오픈소스이면서, 비디오/오디오 관련한 많은 기능을 제공하고 있으며, 성능또한 상당히 좋은 편이다.
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 위키문서 (버그, 가이드, 기타등등 )
* 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초부터는 영상만 나오게 된다.