명령어 신택스
ffmpeg [global options] [input options] -i input_file [output options] output_file
ffplay [global options] [input options] -i input_file [output options]
ffplay는 출력 파일을 생성하지 않고 화면으로 디스플레이한다.
필터(Filter), 필터체인(Filterchain), 필터그래프(Filtergraph)
필터(Filter)는 libavfilter 라이브러리내의 툴로서 인코딩 직전에 스트림의 프로퍼티를 변경하는 역할을 한다. ffplay -f lavfi -i testsrc -vf transpose=1
testsrc 입력에 대해 transpose비디오 필터를 사용해서 90도 회전(transpose=1)
ffmpeg -i input.mp3 -af atempo=0.8 output.mp3
입력 스트림에 대해 atemp 오디오 필터를 사용해서 템포를 느리게(atempo=0.8) 조절
여러개의 필터를 순차적으로 적용할 필요가 있을때는 콤마(",")로 구분된 필터로 구성된 필터체인를 사용한다. ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4
입력 스트림에 대해 hqdn3d 비디오필터로 High Quality 3D Denoiser 작업을 수행하고, pad 비디오 필터로 입력 너비의 2배(pad=2*iw)인 패딩을 추가
필터체인는 다시 세미콜론(";")으로 묶어서 필터그래프를 형성한다. 필터그래프는 링크 라벨(Link Label)과 같이 사용할 경우 매우 편리하다. 가령 어떤 필터체인의 결과에 링크 라벨을 붙여 놓게되면 나중에 어떠한 필터그래프에서라도 이 링크 라벨을 사용해서 입력을 지정할 수 있다. ffplay -i i.mpg -vf "split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w"
split 비디오 필터를 이용해서 입력을 2개로 만든 후 각각에 [a], [b] 라벨 부여하고, 이어지는 2개의 필터그래프에서는 [a] 라벨에 대해서는 pad 필터를 적용한 후 [A] 라벨 부여, [b] 라벨에 대해서는 hqdn3d 필터를 적용한 후 [B] 라벨을 부여함. 마지막 필터그래프는 [A], [B]를 입력으로 받아서 overlay 필터를 적용
ffplay -f lavfi -i rgbtestsrc -vf "split[a][b];[a]pad=2*iw[1];[b]vflip[2];[1][2]overlay=w" vflip 비디오 필터를 사용해서 화면 상하 전환
미디어 스트림(Media Stream)
미디어 컨테이너(Container)는 하나 이상의 스트림들로 구성되며 각각의 스트림은 개별적으로 선택 및 처리된다. 스트림의 종류는 오디오(a:audio), 첨부(t:attachment), 데이타(d:data), 자막(s:subtitle)과 비디오(v:video)등 총 5가지로 구분된다. 스트림을 선택하기 위해서는 map 옵션을 사용한다. ffmpeg -i A.mov -i B.mov -i C.mov -map 0:v:0 -map 1:a:0 -map 2:s:0 clip.mov
위 명령어는 3개의 입력 파일 중, 첫번째 파일의 첫번째 비디오 스트림(0:v:0)과 두번째 파일의 첫번째 오디오 스트림(=1:a:0), 그리고 세번째 파일의 첫번째 자막 스트림(=2:s:0)을 선택해서 결과 파일을 구성하는 예를 보여준다.
스트림을 지정하는 형식은 file_number:stream_type[:stream_number]과 같은데 여기서 number는 0부터 시작한다. 특별한 경우로 -map 0는 모든 스트림 타입의 전체 스트림을 의미하고, -map i:v는 i번째 파일의 모든 비디오 스트림을, -map i:a는 i번째 파일의 모든 오디오 스트림을 지칭한다. 또한 -an, -vn, -sn는 해당 스트림 타입을 제외할 때 사용한다. -map이 아예 사용되지 않으면 각 스트림 타입별로 우선 순위가 높은 1개의 스트림이 선택된다.
SI 프리픽스(Prefix)
ffmpeg -i input.avi -b:v 1500000 output.mp4
ffmpeg -i input.avi -b:v 1500K output.mp4
ffmpeg -i input.avi -b:v 1.5M output.mp4
ffmpeg -i input.avi -b:v 0.0015G output.mp4
위의 명령어들은 비디오의 비트 레이트(-b)를 셋팅하는 예로서 다양한 SI 사례를 보여준다.
ffmpeg -i input.avi -fs 10MB output.mp4
파일 크기(-fs)를 조정하는 옵션 등에는 MB 등을 사용
비디오 화면 리사이징(Resizing)과 스케일링(Scaling)
아래는 -s 옵션을 사용해서 리사이징(Resizing)을 하는 예이다.
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
숫자 대신 vga와 같은 미리 정의된 이름을 사용할 수 있는데 몇가지 예를 들면 아래와 같다.
qvga320x240
vga640x480
svga800x600
hd480852x480
xga1024x768
hd7201280x480
sxga1280x1024
wxga1366x768
hd10801920x1080
리사이징은 인터넷 전송을 용이하게 하거나 작은 화면에 맞추기 위해 사용되므로 원본보다 작은 해상도 갖도록 만드는게 보통이다. 이 경우 원본의 디테일을 잃게되는 픽셀 크기를 알아두어야 한다. 가령 800x600을 640x480으로 리사이징 할 경우 소위 스케일링 팩터는 0.8(640/800)이 되어 2 픽셀 너비를 갖는 대상은 1.6(2 x 0.8)이 되어 근사적으로 2 픽셀을 그대로 유지한다. 반면 같은 원본을 160x120으로 변환했을 때는 스케일링 팩터는 0.2이고 2 픽셀을 갖는 정보는 0.4(2 x 0.2) 픽셀로서 근사값으로 0으로 처리되어 보이지 않게된다. 이 경우 3 픽셀 이상의 정보를 갖는 대상만 살아남게 된다. -s 옵션을 사용한 리사이징은 내부적으로는 필터그래프의 제일 마지막 단계에서 scale 비디오 필터를 삽입하는 것이다. 아래의 두 사례는 동일한 동작을 한다.
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
-s 옵션 대신 scale 비디오 필터를 사용하면 부가적인 스케일링 옵션 적용이 가능하다.
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
입력 너비(iw)와 입력 높이(ih)를 1/2씩 줄인 스케일링
ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4
입력의 90% 비율로 스케일링
ffmpeg -i input.avi -vf scale=400:400/a
출력의 너비를 400px로 고정하고, 높이는 원본의 aspect ratio를 적용
ffmpeg -i input.avi -vf scale=400*a:400
출력의 높이를 400px로 하고, 너비는 원본의 aspect ratio를 적용
리사이징이 보통 화면 사이즈를 줄이는 다운 샘플링 목적으로 활용되는 거에 비해, 화면을 키우고자 할 때는 다음과 같은 스케일링 기법이 사용된다.
ffmpeg -i phone_video.3gp -vf super2xsai output.mp4
super2xsai라는 특별한 필터를 사용해서 선명도를 잃지 않고 원본을 2배로 업스케일링
크롭핑(Cropping)
ffmpeg -i input.avi -vf crop=iw/3:ih:0:0 output1.mp4
상단 왼쪽(0,0) 기준으로 입력 너비의 1/3(iw/3)과 입력 높이 전체(ih)를 크롭핑
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
crop 비디오 필터의 기준점이 주어지지 않으면 화면 중심을 자동 선택
패딩(Padding)
ffmpeg -i sample.png -vf pad=iw+20:ih+20:10:10:pink framed_photo.jpg
높이, 너비를 20px씩 증가시킨 출력을 만들고 원본 오프셋을 상단 왼쪽 기준 (10px, 10px)로 위치
ffmpeg -i input.avi -vf "pad=ih*16/9:ih:(ow-iw)/2:0" film_wide.avi
패딩을 넣어서 16:9 비율로 만들기
ffmpeg -i input.avi -vf "pad=ih*10/5:ih:(ow-iw)/2:0" film_wide.avi
가로 방향으로 패딩 넣기(Pillarboxing)
ffmpeg -i input.avi -vf "pad=iw:iw*10/5:0:(oh-ih)/2" film_wide2.avi
세로 방향으로 패딩 넣기(Letterboxing)
플림(Flip)과 회전(Rotation)
ffplay -f lavfi -i rgbtestsrc -vf vflip
상하 뒤집기
ffplay -f lavfi -i smptebars -vf transpose=0
ffplay -f lavfi -i smptebars -vf transpose=2,vflip
반시계 방향으로 90도 회전하고 상하 뒤집기
ffplay -f lavfi -i smptebars -vf transpose=3
ffplay -f lavfi -i smptebars -vf transpose=1,vflip
시계 방향으로 90도 회전하고 상하 뒤집기
블러(Blur), 샤픈(Sharpen), 디노이징(Denoising)
ffmpeg -i input.mpg -vf boxblur=1.5:1 output.mp4
ffmpeg -i halftone.jpg -vf smartblur=5:0.8:0 blurred_halftone.png
ffmpeg -i input -vf unsharp output.mp4
ffmpeg -i input -vf unsharp=6:6:-2 output.mp4
ffmpeg -i input.mpg -vf mp=denoise3d output.webm
ffmpeg -i input.avi -vf hqdn3d output.mp4
테스트 패턴을 사용한 ffplay 사용 예
ffplay -f lavfi -i rgbtestsrc
여기서 lavfi는 libavfilter의 가상 입력 디바이스로서 오픈된 출력 패드의 데이타를 처리한다. rgbtestsrc와 같이 내장된 테스트 패턴으로 사용할 수 있는 입력 소스로는 testsrc, mptestsrc, smptebars, color=c=red 등이 있다.
ffplay -f lavfi -i color=c=red
ffplay -f lavfi -i color=c=#ff0000
ffplay -f lavfi -i color=c=#ff0000:s=640x480