Utils/Program

ffmpeg 소개와 동영상 사이즈 줄이는 법

jinmc 2020. 12. 2. 11:08
반응형

· FFmpeg란?

- 마이클 니더마이어의 주도하에 개발되고 있는 모든 동영상, 음악, 사진 포맷들의 디코딩과 인코딩을 담당하는 소프트웨어 프로젝트이다. 현재 거의 모든 동영상 플레이어들이 FFmpeg기반이며, Nvidia 와 AMD도 FFmpeg를 이용하여 재생을 담당한다고 한다.

 

namu.wiki/w/FFmpeg

 

FFmpeg - 나무위키

여기에 적혀있는 것들은 유명한 것들이고, 이것들 말고도 수많은 미디어 플레이어들이 FFmpeg를 기반으로 한다. 이쪽은 한마디로 정리가 가능하다. 대다수 인코더 프로그램들은 모두 FFmpeg기반이

namu.wiki

 

FFmpeg는 여러가지 활용이 있겠지만, 오늘 정리할 건, 큰 동영상 파일을 작게 만드는 방법이다.

 

ffmpeg -i filename.mp4 -sn -c:v libx264 -preset medium -crf 23 -tune animation -sws_flags lanczos -filter:v "scale=-1:720" -c:a aac -b:a 192k -ac 2 outfile.mkv

 

  • "-i filename.mp4" - 입력 파일로 filename.mp4를 지정한다. 확장자를 포함시켜야 한다.

  • "-threads 0" - 사용할 스레드 수를 지정한다 0은 모두. 0이 디폴트라 생략해도 무방하다.

  • "-sn" - 내장자막을 인코딩하지 않겠다는 의미이다. 내장자막을 가져오고 싶으면 -c:s copy로 바꾸면 된다.

  • "-vcodec libx264" - libx264를 사용하여 H.264로 인코딩. MPEG4를 쓰려면 libxvid, VP8을 쓰려면 libvpx로 설정해주면 된다. 밑은 옵션 중 libx264의 옵션을 사용하는 건 물론 달라지지만 대충 비슷하다. 다양한 옵션은 영어가 된다면 ffmpeg 위키 참조.

  • "-preset medium" - libx264의 프리셋을 이용하는것으로 very slow, slower, slow, medium, fast, faster, veryfast 등의 옵션이 있다. ultrafast나 placebo (이렇게 느려지면 화질 개선이 플라시보 효과 이상의 무언가는 없다라는 수준) 등의 옵션도 있지만 보통 사람들은 쓸 일 없다 (...) 당연히 slow쪽으로 갈 수록 인코딩은 느려진다. CRF방식으로 인코딩을 할때는 용량에 관여을 하며, 비트레이트 지정으로 인코딩을 할 시 화질에 관여된다. CRF인코딩 기준 slow의 경우 medium에 비해 인코딩 시간이 50~66% 늘어나지만 용량은 0~4%정도 줄어든다. veryslow의 경우는 약 4.5배정도 인코딩 시간이 늘어나며 용량 이득은 12%정도다.[8]

  • "-crf 23" - CRF는 고정 비트레이트 인코딩이 아닌 "가변 비트레이트 화질우선 인코딩"방식으로서 옵션값은 0에서 51까지의 설정이 가능한데 값이 낮을 수록 고화질이다. 18 정도면 거의 무손실이고 기본값인 23 정도면 상당히 고화질으로서 영화나 미드를 인코딩하는데 적절하다. 애니메이션은 보통 25~27의 값을 쓴다. 화질이 나쁜(깍두기 크리를 맞은) mpeg2방식의 HDTV원본을 재인코딩할때는 CRF방식으로 인코딩하면 원본보다 더 크게 인코딩 되는 경우가 있으므로 고정 비트레이트 방식으로 인코딩을 하는게 낫다.[9] 고정 비트레이트 방식으로 인코딩을 하고 싶다면 -crf 23 대신에 -vb 2000k 이렇게 지정하면 된다.

  • "-tune animation" - libx264의 tune 옵션을 사용한다. 색감과는 관계가 없고 deblock 위주로 옵션을 조정한다. animation 옵션은 deblock 값을 높여서 화면을 좀 더 뭉게준다. 일반적인 영화나 티비영상의 경우 film 옵션을 쓴다.

  • "-sws_flags lanczos -vf "scale=1280:-1"" lanczos란 리사이즈 필터를 이용하여 720p로 리사이즈. -1은 화면비에 맞춰서 자동으로 세로사이즈를 결정한다. 자동으로 리사이즈하는 경우에는 1280:718 이런식으로 이상한 사이즈가 나올수 있으니 왠만하면 수동으로 지정해주자. 이 VF명령줄에 여러가지 필터를 넣을 수 있다. libass를 사용해서 자막을 하드코딩 할 수도 있고 yadif로 디인터레이싱도 가능하다 ivtc도 가능하다. ffmpeg 필터 문서 참조.

  • "-c:a aac -b:a 192k -ac 2" AAC 코덱으로 192k정도에 맞춰서 2채널로 다운믹싱하여 인코딩한다. AAC 외의 MP3같은 포멧도 사용할 수 있으나, OPUS Vorbis를 제외하면 음질이 상대적으로 떨어지기 때문에 비추천 한다.[10] 이보다도 고품질로 인코딩하고자 한다면 opus 혹은 Vorbis를 쓰거나, 프라운호퍼 AAC소스를 가져와서 직접 ffmpeg을 컴파일 해서 인코딩을 해야한다.[11], Vorbis를 이용하여 -acodec libvorbis -ac 2 -aq 4 이런식으로 인코딩 할 수 있다. 단 Vorbis의 경우 일반적인 기기에서 호환성은 떨어진다.[12] 더 다양한 옵션은 FFmpeg 공식 오디오 인코딩 가이드 참조.

  • "outfile.mkv" - 출력 파일명이다. 확장자에 따라 영상 컨테이너(avi, mp4, mkv같은)를 자동으로 선택해주긴 하지만, 가급적이면 -format 옵션으로 출력 포맷을 지정해 주도록 하자. 참고로 확장자가 mp4인 경우에는 음성코덱으로 AAC, MP2, MP3, AC3 만 가능하다. Vorbis, Opus 는 불가능함. MKV가 가장 호환성이 좋다. 현존하는 거의 모든 포멧을 담을 수 있을 정도.

주의할 점 : 상당히 오래걸린다. 거의 동영상 길이만큼의 시간이 걸리는듯

반응형