요즘 보면 다양한 연령대에서 유튜브 하는 분들이 참 많아진 것 같습니다. 꼭 유튜브 때문만이 아니라도 여러 가지 이유로 영상을 편집하고 싶은 수요는 많아진 것 같습니다. 영상을 촬영하는 행위가 이제는 대중적이 되어서 누구나 영상을 아주 많이 생산하고 있죠. 그에 따라 촬영한 밋밋한 원본 영상 대신 아주 멋진 효과와 전환으로 눈길을 사로잡는 것에 대한 수요도 많아졌습니다. 또한 업무상, 연구 목적 등에 의해 영상의 특정 부분만 잘라내거나 붙이거나 하고 싶은 경우도 많아졌습니다. 물론, 반디컷과 같은 도구를 이용해서도 가능하지만 비싼 도구를 구매할 만큼 계속적인 필요가 없는 분들도 많을 것입니다. 그래서 오늘은 간단한 편집 기능을 오픈소스인 FFMPEG 커맨드라인 예제 를 이용해 직접 해 보면서 기억하기 어려운 커맨드도 한번 정리해 보는 시간을 가지려고 합니다.

FFMPEG 이 뭔가요?

FFMPEG 은 영상 또는 이미지를 다루기 위해 제작된 그리고 현재도 제작되고 있는 오픈소스 프로젝트입니다. 아마 이 글을 읽고 있는 분이 필요하거나 상상할 수 있는 모든 영상에 대한 조작이 ffmpeg을 이용해 가능할 거라고 99% 확신합니다. 그 만큼 아주 다양한 기능을 많은 개발자들이 이미 구현해 놓았고, 현재도 수 많은 플러그인이 제작되고 있습니다.

FFMPEG 설치

FFMpeg 은 오픈소스 프로젝트입니다. 모든 소스코드가 공개되어 있고, 누구나 무료로 받아서 빌드하거나 설치할 수 있습니다. Windows 운영체제의 경우 빌드하기가 까다롭지만, 설치용 바이너리까지 다운로드 할 수 있도록 공식 사이트에서 제공하고 있습니다. 여기에서 다운로드 하여 설치하면 됩니다.

명령 프롬프트 도구에서 ffmpeg 을 입력했을 때 위 그림과 같이 표시된다면 정상적으로 잘 설치된 것입니다.

FFMPEG 커맨드라인 예제

몇 가지 예제를 정리해 보겠습니다.

기본 영상 자르기 예제

단순하게 컨테이너 타입만 변경하고 싶을 때 (예: mkv->mp4)

ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4

영상의 특정 시간대만 자르기

-ss 00:04:25 이렇게 설정하면 4분 25초 부분부터 자른다
-t 120 이렇게 설정하면 120초 분량을 자른다

ffmpeg -i input.mp4 -ss 00:04:25 -t 120 -c:v copy -c:a copy output.mp4

영상의 특정 영역만 자르기

-filter:v “crop=1280:720:320:16” 이렇게 설정하면 영상의 pixel 좌표계 기준 320, 16 지점부터 가로 1280 pixel 만큼, 세로 720 pixel 만큼 잘라서 새로 인코딩한다.

ffmpeg -i input.mp4 -c:v libx264 -filter:v "crop=1280:720:320:16" output.mp4

영상 품질 변경하기 예제

영상에는 FPS(frame per second), Bitrate(단위면적당 데이터량) 와 같은 품질 속성이 있습니다.

우리 눈이 보통 초당 20~30 프레임 정도의 영상을 볼 때 자연스러운 움직임으로 인식한다고 하여, 지역에 따라 초당 30 프레임 또는 25 프레임 정도의 영상이 일반화 되었습니다. 최근에는 유튜브 중심으로 완전한 형태는 아니지만 인터레이싱 60fps 영상도 많이 사용하고 있는 것 같습니다.

Bitrate가 높을수록 미세한 데이터까지 기록이 됩니다. 다만, 눈이 받아들일 수 있는 미세함에는 역시 한계가 있기 때문에 일정 수준 이상의 bitrate 설정은 체감하기 어렵기도 합니다.

이러한 영상 품질 속성들은 ffmpeg 커맨드라인 예제 를 통해 얼마든지 변경할 수 있습니다.

FPS 변경하기 예제

-r 6 이렇게 설정하면 출력 영상을 6fps로 설정할 수 있습니다. 또는 30fps 영상에서 초당 1프레임 정도의 jpg 이미지를 뽑아내고 싶은 경우도 유사하게 가능합니다.

ffmpeg -i input.mp4 -c:v libx264 -r 6 output.mp4
ffmpeg -i input.mp4 -r 1 image2 images\img-%05d.jpg

Bitrate 변경하기 예제

-b:v 5M 이렇게 설정하면 출력 영상의 bitrate를 5Mbps로 설정할 수 있습니다.

ffmpeg -i input.mp4 -b:v 5M output.mp4

영상 해상도 변경하기 예제

영상의 해상도를 변경하는 것을 스케일링이라고 합니다. 앞서 자르기 예제에서 filter:v 옵션을 이용해 특정 영역을 자른 것과 유사하지만, crop의 경우 영상의 해상도를 유지한 상태에서 특정 영역을 자르는 것이고 scale 은 해상도 자체를 변경하는 것을 말합니다.

ffmpeg -i input.mp4 -vcodec libx264 -filter:v "scale=1280:720" output.mp4

화면 영역 캡처하여 동영상 만들기 예제

다음의 FFMPEG 커맨드라인 예제 를 이용하여 내 모니터 화면에 출력되고 있는 내용물의 원하는 영역을 지정하여 캡처 동영상을 만들 수 있습니다. 마치 반디캠과 유사한 기능입니다만, 커맨드라인으로 구동해야 하기 때문에 UI를 가지고 있는 시장의 제품들과 같이 편리하지는 않습니다. 약간의 불편함을 감수한다면 워터마크나 제한시간이 없는 캡처 영상을 만들 수 있다는 장점도 있습니다.

ffmpeg -f gdigrab -framerate 15 -offset_x 0 -offset_y 0 -video_size 1920x1080 -show_region 1 -i desktop -c:v h264 -b:v 8M output.mp4

앞에 설명한 내용을 어느 정도 숙지했다면 대략 어떤 커맨드인지 짐작할 수 있을 것이라 생각됩니다. 내 컴퓨터의 화면 영역의 0, 0 의 offset부터 가로 1920 pixel, 세로 1080 pixel 크기의 영역을 15 FPS, 8Mbps 로 캡처하는 커맨드입니다. 인코딩을 위한 영상 코덱은 h.264를 사용하고 있네요.

기타 예제

H.264 영상에 대해 지식이 있는 분들은 코덱의 profile에 대해서 들어본 적이 있을겁니다. FFMPEG을 이용하여 이러한 codec profile을 변경할 수 있습니다.

ffmpeg -i input.mp4 -c:v libx264 -profile:v baseline baseline-output.mp4
ffmpeg -i input.mp4 -c:v libx264 -profile:v main main-output.mp4
ffmpeg -i input.mp4 -c:v libx264 -profile:v high high-output.mp4

Powerpoint(PPT) 첨부용 영상 변환

ffmpeg -i input.mp4 -q:v 4 -c:v wmv2 -c:a wmav2 output.wmv

정리

다양한 FFMPEG 커맨드라인 예제 를 살펴보았습니다. 이러한 기본 커맨드 외에도 FFMPEG 을 이용하면 상상할 수 있는 거의 모든 영상 처리가 가능합니다. 예제들을 살펴보시고 실제 사용처에 적용할 수 있는 유용한 정보가 되었기를 기대합니다.


Jay

Jay

S/W Engineer!!

2개의 댓글

젤네일 · 2023-05-05 15:33

혹시 TS 동영상 파일 프레임을 60fps로 변환하려고 할 때,
코덱을 기존 코덱으로 유지하면서 60fps로 인코딩을 하고 싶다면 커맨드를
ffmpeg -i input.ts -vcodec copy -acodec copy -r 60 output.ts
이렇게 해야할까요? 관련 지식이 전무해서, 질문 드려요!

Jay

Jay · 2023-05-08 16:05

보통 codec 복사하고 컨터이너 형식만 변경할 때 -c:v 옵션으로 하는데, 이 경우 framerate도 복사해서 transcoding이 잘 안되는 것 같네요.

ffmpeg -i input.ts -vf fps=60 -r 60 output.ts

이렇게 하시면 framerate는 변경이 될 것 같습니다. 다만, transcoding 과정에서 264 profile이나 yuv 같은 설정이 변경될 수 있으므로, 이러한 설정이 코덱에서 크리티컬한 설정이라면 직접 넣어주시는 편이 좋을 것 같습니다.

답글 남기기

Avatar placeholder