Skip to Content
Go Back
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 CSS가 어려운 이유 — 프로젝트 중심 실전 CSS 강의 소개 2023-04-13
📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기(강의) 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12
📌 [번역] CSS 코드 냄새 2013-01-01

하위폴더를 훑으며 ffmpeg 영상 파일 용량 줄이기 스크립트

영상 파일은 용량이 크다. 그러나 용량을 줄일 수 있다. 우선 압축률이 높은 코덱으로 변환해서 저장하면 용량을 아낄 수 있고, 다음으로 화질을 저하시켜서 할 수도 있다. 사람 눈에는 거기서 거기인 정도로 화질을 저하시키면 된다. 오래 보관하는 게 더 중요하면 그렇게 하자.

필요한 것은 ffmpeg다.

리눅스 사용자는 apt install ffmpeg 같은 명령어로, 맥 사용자는 brew install ffmpeg 같은 명령어로 설치하면 된다. 윈도우 사용자는, ffmpeg 사이트에서 링크해 둔 윈도우용 바이너리를 받으면 된다.

다만, 아래 스크립트는 bash용이라서 윈도우 cmd에서는 돌아가지 않는다. WSL, cygwin을 사용하거나 윈도우용 git를 설치하면 따라오는 git bash를 사용하면 아래 스크립트를 활용할 수 있다.

아래 bash 함수를 .bshrc, .zshrc 같은 데 등록해서 사용한다. 혹은 이 파일을 다운로드해서 실행 권한을 부여해 사용해도 된다: mov2mp4.sh, mov2mp4-optimize.sh

이 스크립트는 변환이 성공하면 원본 파일은 삭제해 버린다. 주의하기 바란다.

삭제하지 않고 휴지통에 넣고 싶으면 && 뒤에 있는 rm을 휴지통에 넣는 명령어로 변경한다. 아무것도 하고 싶지 않으면 그냥 &&부터 지운다. &&는 앞의 명령어가 성공하면 실행할 추가 명령어를 적는 문법이니까 그냥 지워도 된다.

# 파일 포맷만 변경해 용량 줄이기
function mov2mp4 {
    OIFS="$IFS"
    IFS=$'n'
    for f in $(find . -name *.MOV)
        do ffmpeg -i "$f" "${f/.MOV/.mp4}" && rm "$f"
    done
    for f in $(find . -name *.mov)
        do ffmpeg -i "$f" "${f/.mov/.mp4}" && rm "$f"
    done
    for f in $(find . -name *.mkv)
        do ffmpeg -i "$f" "${f/.mkv/.mp4}" && rm "$f"
    done
    IFS="$OIFS"
}

# 파일 포맷도 줄이고 품질도 조정해 용량 줄이기
function mov2mp4-optimized {
    OIFS="$IFS"
    IFS=$'n'
    for f in $(find . -name *.MOV)
        do ffmpeg -i "$f" -vcodec libx265 -crf 28 "${f/.MOV/.mp4}" && rm "$f"
    done
    for f in $(find . -name *.mov)
        do ffmpeg -i "$f" -vcodec libx265 -crf 28 "${f/.mov/.mp4}" && rm "$f"
    done
    for f in $(find . -name *.mkv)
        do ffmpeg -i "$f" -vcodec libx265 -crf 28 "${f/.mkv/.mp4}" && rm "$f"
    done
    IFS="$OIFS"
}

원리는 간단하다. bash의 for 문법을 이용해서 MOV 파일이나 mkv 파일을 훑고 ffmpeg로 변환한다.

이 때 파일을 찾는 건 find 명령어로 한다.

그런데 find 명령어는 for에 파일을 넘겨줄 때 띄어쓰기 단위로 파일명을 넘겨준다. 이걸 방지하기 위해서 bash 환경변수 $IFS에 역시 환경변수 $'n'을 잠시 넣어 준다.

ffmpeg 명령어는 간단한데, -i는 인풋 파일, 그리고 뒤에 아무 플래그 없이 쓰는 게 아웃풋 파일명이다. mp4로 확장자만 바꿔 줘도 용량을 줄일 수 있다.

mov2mp4-optimize 명령은 ffmpeg 명령에 옵션을 두 개 붙였는데, 비디오 코덱으로 libx265를 사용하라는 것과 crf를 28로 맞추라는 것이다. mp4는 보통 libx264를 사용할 텐데 libx265가 더 최신 코덱이고 압축률도 높다고 한다(HEVC가 쓰는 포맷이라고). crf는 숫자가 높을수록 저품질이 된다. 근데 libx265(즉, H.265)는 윈도우 컴에서 영상 편집할 때 성능을 많이 잡아먹을 테니, 맥 유저가 아니라면 나중에 편집해야 할 영상은 libx264로 압축하자.

설명은 간단하게 이정도 하겠다. 나도 더 자세히 쓰려면 찾아 봐야 하는데, 이정도로 감만 잡으면 되지 않을까 싶다.

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다