리눅스 폴더내에서 동영상 일괄 인코딩 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개
작성하느라 고생 많으셨을텐데 정말 유용한 코드네요~
추천 꾹 눌러드렸어요!!
그럼 벌이뉨 님께서도 폭염 속에서 항상 가정에 건강이 함께 하시기를 기원합니다 :)