안녕하세요. 클리앙 뉴비 quartzsaber입니다.
ffmpeg는 영상 파일을 다루는 도구입니다. 워낙 유명하고 많이 쓰이는 프로그램이라 어도비를 제외한 거의 대부분의 인코딩 툴은 ffmpeg를 사용하기 쉽게 포장한 프로그램이라고 보셔도 됩니다.
저런 프로그램 대신에 ffmpeg를 직접 사용하시면 좀 더 세밀한 부분을 제어할 수 있습니다. 예를 들면 파일 2개를 합친다던지, 비디오는 복사하고 오디오만 인코딩 한다던지, 영상 파일에 자막을 끼워넣는다던지가 가능합니다. 또한 ffmpeg는 영상 뿐만 아니라 오디오 파일과 자막 파일도 제어할 수 있습니다.
참고로 아래 글에서 "명령어를 입력" 한다는 말은 명령어를 타이핑 하고 엔터까지 누르는 걸 뜻합니다.
1. 다운로드 방법
윈도우 기준으로 ffmpeg는 공식 홈페이지에서 링크를 타고 가서 받을 수 있습니다.
https://ffmpeg.org/download.html
여기서 큼지막하게 있는 "Download Source Code" 버튼 말고, 아래쪽의 윈도우 로고를 클릭해주세요. 거기에 뜨는 리스트 중에 마음에 드는 사이트로 가서 받으시면 됩니다. 보통 선택할 수 있는 옵션이 release 혹은 git, shared 혹은 static, full 혹은 essential, gpl 혹은 lgpl으로 있는데 git, static, full, gpl을 선택하시면 됩니다.
위 내용을 따라하시기 어렵다면 https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z 이 링크로 받으실 수 있습니다. 다만 몇년 뒤에도 사이트가 유지될지는 잘 모르겠습니다.
파일을 받으셨다면 ffmpeg.exe가 들어있는 폴더를 찾아서 적당한 위치에 압축을 풀어주세요. 보통은 bin이라는 이름으로 되어 있습니다. 그리고 그 폴더를 열어서 빈공간에 쉬프트를 누른채로 우클릭을 해주세요. 그러면 평소에 뜨던 우클릭 메뉴가 뜨는데, 중간에 있는 "여기에 PowerShell 창 열기"를 클릭하시면 파란색 콘솔 창이 뜹니다. 앞으로 ffmpeg를 이용한 작업은 이 창을 열어서 하시면 됩니다.
콘솔창에 ffmpeg -version 명령을 입력하면 ffmpeg version xxxx Copyright (c) 으로 시작하는 문장이 쭉 뜰겁니다. 만일 오류가 뜬다면 한번 앞에 "./"를 따옴표를 빼고 붙여보세요. 온점 슬래쉬입니다. 이걸로 해결된다면 앞으로 ffmpeg 앞에 쭉 이걸 붙이시면 됩니다. 그래도 안된다면 아마 윗단계에서 무언가를 잘못 하셨을것으로 생각됩니다. 댓글 남겨주시면 최대한 도와드릴게요.
2. 기초 사용법
이번에는 간단하게 mp4파일을 mkv파일로 변환하는 예시를 보여드리겠습니다.
ffmpeg의 명령은 <전역 인자> <인자> [파일명] <인자> [파일명] 순으로 이루어집니다. 모든 인자는 - (마이너스 기호)로 시작합니다. 그리고 파일명 앞에 -i를 붙이면 입력파일, 안붙이면 출력파일입니다.
예를 들어 Big Buck Bunny.mp4를 aaa.mkv로 변환한다면
ffmpeg -i "Big Buck Bunny.mp4" -c copy aaa.mkv
라고 명령어를 입력하시면 됩니다. "Big Buck Bunny.mp4" 는 파일이름에 공백이 들어있어서 따옴표로 둘러쌌고요, 그 앞에 -i 가 있으니 입력 파일로 인식됩니다. 그리고 -c copy는 인코딩을 하지 않고 단순 복사하라는 인자입니다. aaa.mkv는 -로 시작하지 않으니 파일명으로 인식되고, -i 가 없으니 출력 파일로 인식됩니다.
참고로 윈도우에서는 한글 파일 이름이 잘 인식되지 않을 수 있습니다. ffmpeg를 사용하기 전에 chcp 65001 명령어를 입력하시면 해결이 될수도 있습니다.
3. 인코딩을 하는법
ffmpeg의 인자 -c는 코덱을 지정하는 인자입니다. 위에서 사용한 copy도 일종의 코덱으로 취급받습니다. 코덱을 사용하지 않는 코덱 (?) 인 셈이죠. ffmpeg는 아주 다양한 코덱을 지원하는데요, 주로 사용하는 코덱은 영상 중에는 libx264, libx265, nvenc_h264 등이 있습니다. 오디오 코덱으로는 mp3, aac, libvorbis, libopus가 있습니다.
우선 오디오 인코딩 하는법부터 알려 드리겠습니다. aa.mp3를 bb.aac로 인코딩 하는 예제입니다.
ffmpeg -i aa.mp3 -c:a aac -b:a 160k bb.aac
-c 뒤에 :a 가 붙었는데요, 이 의미는 코덱을 지정하되, 오디오에만 지정하라는 의미입니다. 반대로 비디오 코덱을 지정하실때는 -c:v를 사용하시면 됩니다. 그리고 -b:a 옵션은 오디오 비트레이트 (품질)을 설정하는 옵션입니다. mp3의 경우에는 320k를, aac의 경우에는 160k 에서 192k 정도를 사용하시면 적당합니다. 참고로 별로 의미는 없지만 k를 쓰는 대신 192000이라고 입력하셔도 무방합니다.
다른 예시로 aa.mkv를 bb.mp4로 변환하는데 오디오는 aac로 인코딩하고 비디오는 복사하려면
ffmpeg -i aa.mkv -c:a aac -b:a 192k -c:v copy bb.mp4
입니다.
이어서 비디오를 인코딩 하는 방법입니다. 비디오도 위와 크게 다르지 않은데, 비디오는 코덱별로 옵션이 조금 차이가 납니다. 우선은 가장 많이 사용되는 H.264 코덱 libx264를 기준으로 설명 드리겠습니다.
aa.mp4 를 bb.webm으로 인코딩 하면서 비디오는 libx264로 인코딩하고 오디오는 복사하는 명령입니다.
ffmpeg -i aa.mp4 -c:a copy -c:v libx264 -crf 18 -preset veryfast bb.webm
이 명령에서 crf와 preset이 추가되었는데요, crf는 품질을 지정하는 인자이고, preset는 처리 속도를 지정하는 인자입니다. crf는 작을수록 파일 크기가 커지지만 품질이 향상됩니다. 대략 18정도면 원본과 거의 차이가 없는 수준이고, 필요에 따라 숫자를 늘리시면 됩니다. crf를 6 증가하면 용량이 절반이 되고, 6 감소하면 용량이 두배가 됩니다.
이어서 preset은 처리 속도를 지정하는데, 빠를수록 압축이 덜 됩니다. 만약 시간에 관계 없이 최대한 압축이 되기만 한다면 veryslow를 사용하고, 용량이 커지더라도 빨리 처리해야 한다면 veryfast를 쓰시면 됩니다. 기본값은 medium이고, help라고 치면 가능한 목록을 보여줍니다.
libx265도 위와 같은 방식으로 사용하시면 되는데, libx264에 비해 crf값을 4~5 정도 증가시켜서 사용하시면 비슷한 품질을 얻으실 수 있습니다.
아래 예시는 aa.mp4를 bb.mkv로 변환하되, 영상은 H.264 (libx264)로, 오디오는 aac로 인코딩 하는 예시입니다.
ffmpeg -i aa.mp4 -c:a aac -b:a 160k -c:v libx264 -crf 22 -preset veryfast bb.mkv
그리고 덤으로 아래 예시는 EUC-KR로 된 smi 자막을 srt 자막으로 변환하는 예시입니다.
ffmpeg -sub_charenc euc_kr -i a.smi -c:s srt b.srt
참고로 저는 플레이어 지원 여부를 확인해서 가급적이면 srt대신 ass자막을 사용하시는걸 권장드립니다.
4. 영상에 자막을 합치는 법
제가 이 글을 쓰기로 결심한 이유입니다. ㅎㅎㅎ
우선 자막을 합치는 방식에는 하드랑 소프트가 있습니다. 전자는 자막을 아예 영상에 포함시키는 방식이고, 후자는 자막 파일을 동영상 파일에 녹여넣는 방식입니다. 후자가 처리 속도도 빠르고 싱크도 조절할 수 있는 등 장점이 많지만 몇몇 플레이어가 지원하지 않는다는 단점이 있습니다. 그래도 제가 사용하는 프로그램들은 문제가 없어서 저는 후자를 주로 사용합니다.
소프트 방식부터 보여드리겠습니다.
ffmpeg -i aa.mp4 -sub_charenc euc_kr -i aa.smi -c:a copy -c:v copy -c:s ass bb.mkv
파일별로 끊어보면 "-i aa.mp4" 랑 "-sub_charenc euc_kr -i aa.smi" 랑 "-c:a copy -c:v copy -c:s ass bb.mkv "로 나눠집니다. 자세한 별도의 설명은 드리지 않겠습니다. 입력 파일이든 출력 파일이든 파일을 하나 지정할 때 마다 인자가 초기화된다는 점이랑 자막 끼워넣기는 mkv를 비롯해 소수의 포맷만 지원한다는 점만 아시면 될 것 같습니다. mp4도 mov_text를 통해 지원하기는 하는데, 플레이어 호환성이 그닥 좋지 못합니다.
이어서 하드 방식입니다. 이 방식은 영상을 수정하는 것이기 때문에 반드시 영상을 재 인코딩 해야합니다.
ffmpeg -i aa.mp4 -vf subtitles=aa.smi:charenc=euc_kr -c:a aac -b:a 160k -c:v libx265 -crf 24 -preset veryfast bb.mkv
charenc 부분은 자막 파일의 인코딩에 따라 수정해서 사용하시면 됩니다.
5. 하드웨어 가속을 사용하는법
이 내용은 엔비디아 그래픽 카드를 사용중이신 분에게만 해당됩니다. 인텔 내장그래픽을 사용하는것도 가능한데, 제가 써본적이 없어서 잘 모르겠습니다.
우선은 ffmpeg 의 바로 뒤에 -hwaccel cuda를 붙이셔야 합니다. 이 옵션이 없어도 작동은 하나, 성능상의 손해가 있을 수 있습니다.
디코딩을 가속하려면 우선 영상의 코덱을 아셔야 합니다. 그러려면 ffmpeg -i aa.mp4 처럼 출력 파일 없이 명령을 실행하면 오류가 뜨면서 영상 정보를 출력하는데, "Stream #0:1(eng): Video: vp9" 같은 부분을 유심히 보시면 됩니다. 이 영상은 코덱이 vp9네요. 흔히 쓰이는 코덱으로는 h264, h265, vp9, av1 등이 있습니다.
영상의 코덱을 아셨다면 디코딩을 가속하는건 간단합니다.
ffmpeg -hwaccel cuda -c:v vp9_cuvid aa.mp4 (후략)
처럼 입력 파일의 인자로 코덱을 지정해주시면 됩니다. 코덱 이름 뒤에 _cuvid를 붙이는 방식입니다.
다음으로 인코딩을 가속하는것도 쉽습니다.
ffmpeg -hwaccel cuda (중략) -c:v h264_nvenc -qp 22 bb.mp4
처럼 사용하시면 됩니다. 여기서 crf 대신 qp를 사용했고, preset은 생략했습니다. qp 옵션이 crf랑 비슷하기는 하지만 의미가 조금 다른 옵션이라서 몇 번 사용해보시며 자신에게 맞는 숫자를 찾으시면 되겠습니다.
마지막으로 하드웨어를 디코딩과 인코딩에 전부 사용하는 예시입니다.
ffmpeg -hwaccel cuda -c:v h265_cuvid -i aa.mp4 -c:a copy -c:v h264_nvenc -qp 22 bb.mp4
6. 마치며
더 많은 옵션이 궁금하다면 구글에서 ffmpeg wiki (원하는 내용) 으로 검색하셔서 ffmpeg 위키를 참고해주세요.
글을 쓰는 시간이 길어지니까 뒷부분이 날림이 되어버렸네요.... 클리앙에서 이런 장문의 글을 써보는건 처음인것 같습니다. 부디 이 글이 많은 분들에게 도움이 되면 좋겠네요. 댓글로 질문 하시면 시간이 날때 최대한 도와드리겠습니다.
전에 한번 찾아봤는데 ffmpeg도 그렇고 그런 기능있는 프로그램이 없었던걸로 기억해서...
영상 자르는걸 ffmpeg 배치파일로 만들어서 쓰고는 있습니다.ㅎㅎ
ffmpeg으로 간단한 스크립트로 하는 것은 빠르고 좋은것 같습니다. 다음에도 다른 강좌도 해주세요~
일반적인 용도에서는 커맨드라인 대신 gui에서 옵션 선택이 가능해서 편하고 좋습니다!
(단일영역이 아닌 시간에 따라 크롭박스가 달리되는 경우)
시간에 따라 크롭박스의 위치가 바뀌는 데이터가 있는데, ffmpeg으로 처리가 되는지 궁금해서요.
혹은 ffmpeg에는 필터 그래프를 파일에 저장해놓고 그걸 읽는 기능이 있습니다. 자세한건 http://www.ffmpeg-archive.org/Read-values-from-a-text-or-CSV-file-td4689225.html 를 참고해 보시면 될듯합니다. 참고로 crop 필터는 crop=w:h:x:y 꼴인데, w와 h는 첫번째 프레임에 연산한 결과로 고정이지만 x와 y는 매 프레임에 수식을 연산합니다. https://ffmpeg.org/ffmpeg-utils.html#Expression-Evaluation
답변 감사합니다. 큰 도움이 될 것 같습니다!!