개요

동영상 파일을 활용하다가 타이틀과 같이 영상을 자르고 다시 사이즈를 조정할 일이 생겼다. 여기서 자른다는 표현은 영상의 재생 구간을 자르는 것이 아닌 해상도 영역을 일부 자르고 다시 원본 해상도로 리사이즈 해주는 업무였다. 그래서 ffmpeg 프로그램을 통해 단순한 명령어로 필요한 영역을 자르고 다시 원본 해상도에 맞게 늘려서 비디오 파일로 뽑아내는 작업을 진행한다.

환경

  • Ubuntu 20.04
  • ffmpeg version 4.2.7

영역 자르기(crop)

아래의 이미지와 같이 표시한 영역만 살려내는 작업을 진행한다.

drawing drawing

영상 자르기는 아래의 명령어와 같은 형식으로 수행할 수 있다.

$ ffmpeg -i "INPUT.mp4" -vf crop=w:h:x:y "OUTPUT.mp4"

여기서 w,h,x,y의 값만 확실히 하면 되는데 w 와 h는 생성될 영상의 너비와 높이다.
x, y는 자르기를 시작할 좌표 지점이다. 일반적으로 해당 좌표의 기준(0, 0)은 좌상단이다.

예를들어 1920 * 1080의 비디오 파일 a.mp4 가 있다고 하자.

예시 1

$ ffmpeg -i "a.mp4" -vf crop=960:540:0:0 "b.mp4"

위의 명령어는 b.mp4 라는 동영상 파일을 생성하며 960*540 의 해상도를 가진다. 그리고 원본 영상을 4분할 했을 때 좌상단 영역의 영상을 보여준다. 시작을 (0,0)에서 했고 너비와 높이를 반으로 줄였으니 말이다.

예시 2

$ ffmpeg -i "a.mp4" -vf crop=1920:1000:0:40 "c.mp4"

위 명령어는 c.mp4라는 동영상 파일을 생성하며 1920*1000의 해상도를 가진다. 원본 영상대비 상단 40px, 하단 40px을 자른 결과물이 생성된다. 그래서 위와 아래, 왼쪽과 오른쪽을 동일하게 자르려면 픽셀 값을 게산해서 적으면 된다.

예시 3

$ ffmpeg -i "a.mp4" -vf crop=1920:1080:200:500  -vc copy "d.mp4"

해당 명령어로 생성된 동영상 파일 d.mp4는 원본과 동일한 해상도 1920*1080을 가진다. 그러나 뒤에 x,y 값으로 입력해준 200, 500의 시작위치는 적용되지 않는다. 결과물은 결국 원본과 동일하다. 그리고 w, h 값을 원본의 해상도 보다 높게 적는다면 에러가 발생한다. 예를 들어 h를 1200으로 적으면 다음과 같은 에러를 뱉는다.

[Parsed_crop_0 @ 0x55f8a7e3e280] Invalid too big or non positive size for width '1920' or height '1200'
[Parsed_crop_0 @ 0x55f8a7e3e280] Failed to configure input pad on Parsed_crop_0
Error reinitializing filters!

해상도 조절하기(resize)

해상도 크기를 변경하기 잘라내기와 똑같이 -vf 옵션을 사용한다. 그 뒤에 scale 옵션을 붙여준다. 명령어 형태는 다음과 같다.

$ ffmpeg -i input.avi -vf scale=w:h output.avi

scale에 대해서 얼마의 width와 height 로 변경할건지 입력한다.

동일하게 1920 * 1080의 비디오 파일 a.mp4 가 있다고 하자.

예시 1

$ ffmpeg -i a.mp4 -vf scale=1280:720 e.mp4

해당 명령어의 결과물 e.mp41280*720의 해상도를 가진다. 해당 영상은 원본의 종횡비와 같도록 리사이즈 되었다.

예시 2

$ ffmpeg -i a.mp4 -vf scale=960:-1 e.mp4
$ ffmpeg -i a.mp4 -vf scale=-1:360 f.mp4

해당 명령어의 결과물 e.mp4f.mp4는 scale 옵션에 -1이 있는것을 볼수 있다. 이는 나머지 명시된 값에 의해 종횡비(aspect ratio)를 유지한채 자동으로 그 값이 결정된다. 원본 영상이 16:9 비율의 FHD(1920*1080) 영상이므로 e.mp4 영상은 960*540 해상도를 가지며 f.mp4 영상은 640*360 해상도를 가진다.

예시 3

$ ffmpeg -i a.mp4 -vf scale=640:640 g.mp4

해당 명령어로 생성된 영상 g.mp4640*640의 해상도를 가지며 원본과 종횡비가 같지 않다. 원본 영상대비 옆으로 압축된 느낌의 영상을 보게 된다.

결과 적용

본인은 FHD(19201080) 해상도를 가진 동영상 파일에서 불필요한 상단 100px을 잘라내면서 다시 19201080 사이즈로 만들고 싶었다. 동시에 기존 촬영된 화면 비율 깨지지 않기 위해 좌측도 같은 비율로 잘라내고 다시 scale 해주었다. 과정은 다음과 같다.

  • 상단 100px 은 1080px 대비 9.25925..% 를 가짐
  • 1920px에 해당 비율을 곱해 좌측 178px을 같이 잘라낸다
  • 잘라낸 결과물을 다시 원본 해상도에 맞게 리사이즈 한다.
$ ffmpeg -i my_video.mp4 -vf -vf crop=1920-178:1080-100:178:100,scale=1920:1080 -c:a copy new_video.mp4
  • -c:a copy는 오디오 코덱을 원본의 것 그대로 복사한다는 의미이다. 영상의 시각적인 부분을 편집하는 명령어라 비디오 코덱에 대한 카피는 사용하지 못한다.
  • 좌측을 자르지 않고 양옆을 동일하게 잘라도 된다. 그렇게 하려면 아마 crop 옵션을 1920-178:980:89:100 과 같이 주면 될 것이다.

참고링크: ffmpeg - trac wiki: Cropping Video
참고링크: ffmpeg - trac wiki: scaling

댓글남기기