21세기소년

20100608 :: 리눅스에서 아이폰 동영상 인코딩하기 (ffmpeg)

지난 포스팅에서 문제가 되었던 부분은 결국 극복을 못했습니다. 워드프레스가 RC 버전이라 생긴 문제인지.. 암튼 계속 이어나갑니다.

Medibuntu의 힘을 빌리다.

Medibuntu 라는 Ubuntu의 사촌쯤 되는 배포판이 있습니다. 미디어 처리에 특화된 녀석으로 온갖 비디오, 오디오 코덱들을 많이 가지고 있는 녀석입니다. 이 녀석을 사용하면 아이폰용 동영상을 거뜬히 인코딩할 수 있다고 합니다.

그렇다고 사용하고 있는 우분투 배포판을 미디분투로 변신 시킬 필요는 없습니다. 다만 코덱 설치와 관련하여 Medibuntu의 저장소(repository)만 살짝 빌려올 생각입니다. 이 부분은 우분투 공식 문서 사이트를 참조하여 설치하도록 합니다. (해당 링크의 페이지에서 Adding The Repository 부분의 명령을 복사하여 터미널에서 실행합니다.)[1. 이 부분을 본문에 삽입하니 포스트가 저장이 안되는 문제가 있어서 뺐습니다.]

이 명령은 Medibuntu에서 사용하는 저장소를 추가하고, 키 인증을 받고, 패키지 목록을 새로 고치는 과정을 수행합니다. 이 과정 중에 인증에 실패했다는 경고가 나올 수 있지만 무시하면 됩니다.

그럼 혹시 모르니, 다음 패키지들을 설치 및 재설치 해보도록 하겠습니다.

  • ffmpeg
  • x264
  • faac
  • libavcodec-extra-52

명령어는 다음과 같습니다.

[bash]$ sudo apt-get –reinstall install ffmpeg x264 faac libavcodec-extra-52[/bash]

여기까지 하면 거의 준비가 끝났습니다. 다만, ffmpeg의 옵션이 매우 복잡합니다. 그래서 역시 구글링에서 얻은 옵션 값을 이용하여 스크립트를 하나 만들었습니다.

단 두 줄로 이루어졌습니다만, 좀 깁니다..

[bash]#!/bin/bash
ffmpeg -i "$1" -r 29.97 -vcodec libx264 -s 480×320 -aspect 16:9 -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -b 1000k -maxrate 1250k -bufsize 4M -bt 256k -refs 1 -coder 0 -me_method umh -me_range 16 -subq 7 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 35 -level 30 -qmin 10 -qmax 51 -qcomp 0.6 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec libfaac -ab 80k -ar 48000 -ac 2 "$1.mp4"[/bash]

위의 내용을 복사하여 메모장(gEdit)등에 붙여넣고 적당한 이름을 주고 저장합니다. 패스로 지정된 영역[1. /usr/share/bin 등에 저장하면 일반 내장 명령어처럼 호출할 수 있습니다.]에 저장해도 좋지만 여기서는 귀찮으니, 그냥 동영상 파일들이 있는 디렉터리에 저장하도록 합니다. 위 스크립트는 영상을 인코딩하여 원래 이름 뒤에 .mp4라는 확장자를 붙여서 그 결과를 만들어 내는 명령입니다.

예를 들어 이 스크립트를 aip 라는 이름을 주었다고 가정하겠습니다. 이제 해당 파일을 ‘실행가능하도록’ 만들어야 합니다. 리눅스는 파일 확장자 따위는 필요 없고 다만 ‘실행 가능한 권한’이 있으면 그냥 실행할 수 있습니다. (참 권한에 민감합니다…)

[bash]$ chmod 755 aip[/bash]

만약, 권한이 없다고 한다면 sudo chmod 755 aip로 해 줍니다. 제 경우에는 ntfs 드라이브에서 실행하니 권한이 없다고 하여 sudo 를 통해 실행 권한을 주었습니다.

그리고 해당 디렉터리에서 ./aip “개인의 취향 E01.avi” 라고 입력합니다. (이때 파일명 중간에 빈칸이 들어가서 따옴표로 일부러 둘러쌌습니다.) 그러자 인코딩이 됩니다. 조금 기다렸다 q를 눌러 중지하고 우선 컴퓨터 상에서 제대로 재생되는지 확인해 봅니다. 아무래도 제대로 재생이 되는 듯 하군요.

이제 인코딩을 한 방에 끝내버리겠습니다. 개인의 취향은 총 16편으로 구성되어 있고, 제 PC에는 “개인의취향.E01.avi”와 같은 식으로 이름이 정리되어 있습니다. 이를 한 방에 하려면 for 구문을 쓰면 되지요.

$ for x in 개인의*; do ./aip “$x” ;done

이렇게 작업을 시작한지 40분이 경과되었고, 고작 2편이 인코딩을 조금 전에 시작한 것 같습니다. h264 코덱은 인코딩에 엄청나게 많은 시간이 걸리는 군요. 인코딩 작업이 끝나면, 동영상이 제대로 아이폰에서 재생되는지 확인하고 후속 포스팅을 올리도록 하겠습니다.

긴 글 읽어주셔서 감사합니다.

  • 요즘 제가 하는 작업 때문에 관심이 많은 부분인데, 이런 글을 접하니 감사한 마음까지 드는군요! 블로그 디자인도 간결하고 시원해서 좋습니다. 앞으로도 좋은 글 많이 써주시리라 믿어 의심치 않게 되는 곳이네요.

    • 답변 감사합니다~. 후속 포스팅도 곧 쓰겠지만, (사실 업데이트가 매우 드뭅니다;;) 아이폰으로 옮겨보니 영상은 잘 나오더군요. 아무쪼록 도움이 되셨으면 좋겠습니다. 항상 건강하세요~

  • Riverful

    좋은 정보 감사합니다. ubuntu머신을 encoding머신도 겸용하려고 이것저것 알아봤는데 가장 도움되는 자료네요. :)

    • 근데 ffmpeg를 통한 인코딩이 드라마는 문제가 없는데, 자막을 넣기가 까다롭더군요. 자막을 버닝하는 방법은 작은 화면에서 보기에는 그리 만족스럽지 못하고… 여튼 최근에 좀 번거롭기는 하지만 방법은 찾아서 한 두개는 성공했습니다. 몇 일 내로 관련한 포스팅을 다시 올릴 예정이니, 한 번 지켜봐 주세요.

      • Return21

        ffmpeg 에서 자막먹싱하는 것에 대한 힌트라도 주시면 고맙겠습니다.

        • 답변이 늦었습니다. ffmpeg에서 자막 먹싱하는 부분은 정상적으로 안되는 경우가 많은 듯 합니다. 테스트를 좀 더 해보고 포스팅하도록 하겠습니다. smi파일을 유니코드 SRT로 변환하면 Handbrake에서는 먹싱이 가능한데, 이렇게 하니 아이폰에서 자막을 끄고 켤 수 있더군요.