리눅스 폴더내에서 동영상 일괄 인코딩 shell 명령어 > 개발자팁

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

리눅스 폴더내에서 동영상 일괄 인코딩 shell 명령어 정보

OS 리눅스 폴더내에서 동영상 일괄 인코딩 shell 명령어

본문

간혹 폴더내에서 동영상들의 스트리밍을 위해 용량을 줄일 필요가 있을 때가 있습니다.

요즘은 워낙 큰 동영상이 많이 들어와서 FHD, UHD 등등 동영상은 스트리밍하기에는 좀 벅찬면이 있죠.

그래서 고민하다 쉘에서 바로 실행할 명령어를 만들었습니다. 무지해서 어느때보다 고생했네요.

 

파이썬으로 만들까 고민도 많이 했는데 파일 만들기 귀찬고 제 동영상 서버가 깡통 centos에 딱 필요한 모듈만 깔아둬서 파이썬도 설치해야하고 등등의 귀차니즘에 쉘 명령어로 하자 했는데... 오히려 긴 시간 삽질하면서 오기가 생겨 만들게되었습니다. 쉘파일도 쓰기 귀찬아 루프문이나 변수 선언도 사용하지 않는 순순히 명령어로만 만들었습니다. 

 

선제 조건은 동영상 편집 프로그램인 ffmpeg가 깔려 있어야 합니다.

 

find ./ -name '*.mp4' -and ! -name '720_*' -exec bash -c 'ffmpeg -y -i "$0" -vf "scale='\''min(1280,iw)'\'':'\''min(720,ih)'\'',setdar=16/9" -r 30 "${0/"${0##*/}"/720_${0##*/}}" && rm "$0"' {} \;

참고. 한줄코드 입니다.

 

1) 위 코드에서 find는 다 아시다시피 검색입니다. 검색에서도 mp4 확장자만 검색하고 파일명 앞에 720_ 프리픽스 문자열이 없는 것만 검색합니다.

 

2) 이후 검색된 내용으로 bash 명령어를 실행하는데 ffmpeg로 인코딩하는 명령어 입니다.

 

3) -y 는 파일 덮어쓰기나 예외시 OS에서 실행할꺼냐 질문하는데 저같은 경우 300개 정도 파일을 인코딩해야 해서 질문을 yes로 무조건 건너 뛰게 옵션을 -y로 설정했습니다.

 

4) -i 는 검색된 파일입니다. 즉 인코딩할 원본 파일 ./video/test[new].mp4 가 검색되면 $0 변수에 대입되어 들어 옵니다.

 

5) scale에서는 가로 1280 세로 720 이상만 720P(HD)급으로 인코딩하고 미만 동영상은 그냥 스케일 조절없이 원본크기 그대로 인코딩하도록 설정했습니다. 화면비는 16:9 입니다.

 

6) -r은 fps 입니다. 초당 30프레임으로 조절하시면 적절할겁니다. 요즘은 40~100 까지 프레임 동영상도 들어오는데 서버 트래픽 감당하시려면 30 프레임만 해도 충분한 것 같습니다.

 

7) 마지막 중요한 부분이 "${0/"${0##*/}"/720_${0##*/}}" 이부분인데 기존 파일 경로 ./video/test[new].mp4 에서 파일 명만 뽑는 "${0##*/}" 명령어를 사용해서 test[new].mp4 문자열을 검색을하고 720_${0##*/} 명령어를 사용해서 720_test[new].mp4 문자열로 치환합니다. 결국 ./video/720_test[new].mp4 문자열이 되는 겁니다. 저장될 파일명입니다. 

 

8) 쉘스크립트에서 문자열 치환은 ${원본/검색문자열/치환문자열} 이 사용법인데 보시다시피 복잡합니다. 검색문자열에 "${0##*/}" 큰 따옴표를 감싼 이유는 파일명에 특수문자가 들어가 있으면 검색이 안되서 이부분 때문에 포기할까 고민 많이 했습니다. 결국 찾고 찾고 또 찾아서 큰 따옴표를 감싸면 된다는 결론을 얻었네요. 그런데 치환문자열 부분에서는 또 특수문자가 들어간 문자열을 큰 따움표로 감싸지 않아야 치환이 됩니다.

 

9) && rm "$0"' 부분은 인코딩이 끝나면(&&) 원본 파일을 지우라는 명령어 입니다.

 

아래코드는 검색 후 치환하는 부분만 테스트할 때 사용한 코드입니다.

 

find ./ -name '*.mp4' -and ! -name '720_*' -exec bash -c ' echo "${0/"${0##*/}"/720_${0##*/}}" ' {} \;

 

이상 허접한 팁이었습니다.

 

PS) 동영상 일괄 인코딩은 쉘 스크립트 파일이나 파이썬 코드 등으로 몇몇 가지 나와 있습니다. 저 같은 경우 딱 입맛에 맞는 소스를 찾지 못해서... 공부하는겸 괜히 쉘 명령어로만 만든다고 2일을 테스트하고 삽질했네요. 리눅스 쉘스크립트는 정말 민감한 아이입니다. ㅠㅜ 큰 따옴표 작은 따옴표 특문 처리 에휴... 이스케이프 작은 따옴표도 '\'' 이렇게 써야합니다. 답답했네요. 다음부터는 그냥 파이썬으로 할려구요 ㅎㅎ

추천
6

댓글 2개

오오~ 동영상 일괄 인코딩 Shell script 감사드립니다! ^-^
작성하느라 고생 많으셨을텐데 정말 유용한 코드네요~
추천 꾹 눌러드렸어요!!
그럼 벌이뉨 님께서도 폭염 속에서 항상 가정에 건강이 함께 하시기를 기원합니다 :)
전체 69
개발자팁 내용 검색 OS에서

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT