요즘 iPhone/iPad 에서 무인코딩으로 동영상을 볼 수 있는 앱으로 잘 나가는 AV Player를 iOS SDK로 compile해 볼 수 있습니다. FFmpeg license 문제로 컴파일할 수 있는 코드가 공개되어 있습니다. 물론 중요한 부분은 library로 묶여있지만 앱의 전체적인 모습과 GUI 구성, FFmpeg library를 어떻게 컴파일해서 합쳤는지 좋은 참고자료가 될 듯 합니다.


준비물

FFmpeg library만들기
  • AVPlayer-XCode.zip을 작업할 폴더에 풉니다.
  • __MACOSX 폴더는 지우세요.
  • AVPlayer 안에 FFMPEG 디렉토리로 이동합니다.
  • gas-preprocessor.pl을 /usr/local/bin으로 복사합니다.
  • build-armv7으로 armv7용 library만 만드는 것도 가능하지만 combine-libs를 보면 뭔가 이상하죠? 사실 이 스크립드의 원본은 gabriel의 ffmpeg ios compile script입니다. 제대로 armv6, armv7, i386 library를 만들어서 universal library를 만들어 봅시다.
  • build-ffmpeg-ios.tar.gz

  • 위의 첨부된 파일을 받아 FFMPEG 디렉토리에 풉니다.
  • gabriel의 소스에서 svn의 revision을 고정했고 target 마다 별도의 svn source를 다운하지 않도록 변경되었고 configure의 option이 수정되었습니다. --enable-postproc 이 제거되었고 --enable-gpl 을 off 시켰습니다. gpl option을 켜면 LGPL license가 아닌 GPL license가 됩니다. 모든 소스를 공개해야 되죠. 마찬가지의 이유로 LGPL의 경우 libx264나 libxvid를 사용할 수 없게 됩니다.
  • 이제 순서대로 build-armv6, build-armv7, build-i386 스크립트를 실행합니다. ffmpeg 사이트에서 소스를 checkout해 온 후 configure, make를 순서대로 수행하게 됩니다.
  • 모든 target의 library가 compile되면 ffmpeg-armv6/dist, ffmpeg-armv7/dist, ffmpeg-i386/dist에 include, lib 디렉토리가 만들어지고 해더와 라이브러리가 생성됩니다.
  • combine-libs를 실행해서 모든 target의 library를 합칩니다. ffmpeg-uarch에 최종 헤더와 라이브러리가 만들어집니다.

AVPlayer compile하기
  • Xcode로 AVPlayer project를 엽니다.
  • Targets 에서 AVPlayer/AVPlayerHD의 Info 창을 엽니다.
  • Search Paths 항목의 Header Search Paths 란의 내용을 수정합니다. $(SRCROOT)/FFMPEG/ffmpeg-uarch/include, $(SRCROOT)/FFMPEG/ffmpeg-armv7/dist/include 이런식으로 수정하고 Recursive를 체크하면 됩니다.
  • Search Paths 항목의 Library Search Paths 란의 내용을 수정합니다. $(SRCROOT)/FFMPEG/ffmpeg-uarch/lib, $(SRCROOT)/FFMPEG/ffmpeg-armv7/dist/lib 식으로 수정하고 Recursive를 체크하면 됩니다.
  • AVPlayer/LIBS/FFMPEG 밑의 libavcodec.a, libavcore.a, libavdevice.a, libavfilter.a, libavformat.a, libavutil.a, libswscale.a의 Info 창을 열고 경로를 수정합니다. AVPlayer/FFMPEG/ffmpeg-uarch/lib 밑에 있는 library를 지정하면 됩니다.
  • 프로젝트의 라이브러리 설정은 모두 수정되었습니다. 이제 build 버튼만 누르면 됩니다. 단, 주의하실 점은 Simulator로는 build가 되지 않습니다. libAVPlayerLib.a에 AVPlayer의 중요한 코드들이 모두 숨어있는데, 이 라이브러리가 i386으로 compile 되어 있지 않습니다. arm용으로만 compile되어 있기 때문에 Device로만 bulid 가능합니다.
Posted by luuvish

댓글을 달아 주세요

  1. 유아독존 2011.02.12 07:46  댓글주소  수정/삭제  댓글쓰기

    자세한 설명 감사드립니다.

    그런데 그대로 따라하는 도중에 보니 계속 실패가 되더라고요 (FFMpeg를 스크립트를 이용해서 컴파일 하는 도중) 그래서 살펴보니 --enable-swscale (소프트웨어 스케일)이 켜져있는데 리비전 번호가 r25596 로 되어있는걸로 받다보니 libswscale 디렉토리에 있는 소스파일들을 못받아오고 에러가 납니다. 저 옵션을 끄던지 아니면 리비전번호를 최신꺼로 해야할듯 싶은데요. 그리고 최신꺼로 받아왔을때 위 압축파일에 포함되어있는 gas-preprocessor.pl을 이용해서 하니 컴파일 에러가 나더라고요. 그래서 AVPlayer에 포함된 gas-preprocessor.pl을 /usr/local/bin 에다가 복사하니 제대로 넘어가네요. 혹시 시간나시면 확인해주시면 정말 감사하겠습니다. 그럼 수고하세요. 꾸벅~

    Email: sabal90@hanmail.net

  2. BlogIcon luuvish 2011.02.14 13:55  댓글주소  수정/삭제  댓글쓰기

    네. libswscale 원본의 위치가 변경된 모양이에요. 최신 리비전으로 받아야 제대로 됩니다. 수정되어도 이전 리비전은 고정되어야 정상인데 libswscale은 external link라 문제가 된 모양이네요. 최신 버전은 armv6 에서 --disable-optimization 일 때 컴파일이 안되더군요.

  3. DJLee 2011.04.20 12:43  댓글주소  수정/삭제  댓글쓰기

    안녕하세요?
    질문이 있는데
    위의 그대로 했습니다만,,,
    빌드후 에러메시지가


    "_av_get_bits_per_sample_fmt", referenced from:


    _audioBitAdjust in libAVPlayerLib.a(AVDecoder.o)


    ld: symbol(s) not found

    다음과 같이 나오네요

    _av_get_bits_per_sample_fmt를 참조를 못하는 거같은데 ...
    혹시 해결 방법이 없는지 궁금합니다.

  4. BlogIcon luuvish 2011.04.20 15:20 신고  댓글주소  수정/삭제  댓글쓰기

    libavutil.a 이 제대로 link되었는지 확인해 보세요.
    Xcode의 library 설정에서 빠졌을 수도 있고 libavutil.a가 아예 컴파일이 안되어 있는지도 모릅니다.