AVPlayer를 컴파일하는 방법을 밑에서 포스팅했었습니다. 몇분이 질문을 하셔서 체크도 해볼 겸 다시 컴파일해 보니 왠 걸. 몇 달이나 되었다고 이것 저것 바뀌었더군요. 답변 몇줄 적는 걸로 해결되지 않을 것 같아 다시 정리해 보았습니다. 변경된 부분 위주로 빨간색으로 체크해 두었습니다.


준비물

FFmpeg library만들기
  • AVPlayer-Objects.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를 만들어 봅시다. (script가 수정되었으니 여기에 첨부된 것을 받으세요)
  • build-ffmpeg-ios4.3.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를 사용할 수 없게 됩니다.
  • svn에서 checkout하는 부분은 git으로 clone하도록 수정되었습니다. 더이상 ffmpeg에서 svn로 source를 공유하지 않습니다. 또한 ffmpeg의 configure option이 변경되었기 때문에 --extra-ldflags="-arch arm7" 뒤에 -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib/system 이 추가되었습니다. 그리고 document 생성에 문제가 있어 --disable-doc 이 추가되었습니다.
  • 바로 build script를 돌리면 지금(2011-04-24)의 ffmpeg은 버그가 있어서 컴파일되지 않습니다.
    Undefined symbols for architecture armv7:
      "memset", referenced from:
          _ff_ac3_bit_alloc_calc_bap_armv6 in libavcodec.a(ac3dsp_armv6.o)
         (maybe you meant:__memset_chk, _memset )
      "ff_vp8_dct_cat_prob", referenced from:
          .Literal_2 in libavcodec.a(vp8_armv6.o)
         (maybe you meant: __ff_vp8_dct_cat_prob)
    ld: symbol(s) not found for architecture armv7
    이런 메시지가 나오면서 link에서 문제가 발생합니다.
    ffmpeg-source/libavcodec/ac3dsp_armv6.S 의 82 line에서
    b memset 을 b X(memset) 으로
    ffmpeg-source/libavcodec/vp8_armv6.S 의 183 line에서
    movrel r4, ff_vp8_dct_cat_prob 를 movrel r4, X(ff_vp8_dct_cat_prob) 로
    수정하셔야 합니다.
  • 이제 순서대로 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에 최종 헤더와 라이브러리가 만들어집니다. libavcore.a는 더이상 존재하지 않습니다. combine-libs에서도 제거되어야 합니다.

AVPlayer compile하기
  • Xcode로 AVPlayer project를 엽니다.
  • Targets 에서 AVPlayer,AVPlayerHD의 Build Settings을 선택합니다.
  • 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의 Utilities 창을 열고 경로를 수정합니다. AVPlayer/FFMPEG/ffmpeg-uarch/lib 밑에 있는 library를 지정하면 됩니다. libavcore.a는 이제 존재하지 않습니다. library에서 제거하세요.
  • 프로젝트의 라이브러리 설정은 모두 수정되었습니다. 이제 build 버튼만 누르면 됩니다. 단, 주의하실 점은 Simulator로는 build가 되지 않습니다. libAVPlayerLib.a에 AVPlayer의 중요한 코드들이 모두 숨어있는데, 이 라이브러리가 i386으로 compile 되어 있지 않습니다. arm용으로만 compile되어 있기 때문에 Device로만 bulid 가능합니다.
Posted by luuvish

댓글을 달아 주세요

  1. BlogIcon 유령c 2011.05.20 09:53  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 덕분에 FFMpeg 컴파일에 성공했습니다!!
    저는 ysam이 설치 되지 않았어서 살짝 고생했었는데 포스팅에 추가해주셔도 좋을것 같습니다.

    http://www.tortall.net/projects/yasm/wiki/Download

    좋은하루 되세요 ^^

  2. 캐이캐이 2011.07.30 17:27  댓글주소  수정/삭제  댓글쓰기

    ERROR: .endm without .macro at /usr/local/bin/gas-preprocessor.pl line 80, <ASMFILE> line 36.
    make: *** [libavcodec/arm/ac3dsp_arm.o] Error 29

    컴파일 하는 중에 이런 에러가 뜨면 어떻게 해야하나요?

  3. ipad 2011.08.05 17:32  댓글주소  수정/삭제  댓글쓰기

    build-ffmpeg-ios4.3.tar.gz 화일중 build-armv6, build-armv7, 은 정상적으로 됩니다만 build-i386 을 실행시키면
    에러가 납니다 이유가 무엇인지 조언 부탁드립니다.


    ../$SOURCE_DIR/configure --cc="$IOSSDK_GCC" --as="$SCRIPT_DIR/gas-preprocessor.pl $IOSSDK_GCC" --sysroot="$IOSSDKDIR" --extra-cflags="-mdynamic-no-pic" --prefix="dist" $CONFIGURE_OPTIONS
    /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin10-gcc-4.2.1 is unable to create an executable file.
    If /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin10-gcc-4.2.1 is a cross-compiler, use the --enable-cross-compile option.
    Only do this if you know what cross compiling means.
    C compiler test failed.

    If you think configure made a mistake, make sure you are using the latest
    version from Git. If the latest version fails, report the problem to the
    ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
    Rerun configure with logging enabled (do not use --disable-logging), and
    include the log this produces with your report.

    • BlogIcon luuvish 2011.08.05 23:15 신고  댓글주소  수정/삭제

      저의 경우 SDK 버전이 맞지 않을 때나 $CONFIGURE_OPTIONS이 ffmpeg에서 처리 못하는 경우에 위의 메시지를 본 적이 있습니다. armv6이나 armv7이 컴파일된 것으로 보아 gcc나 SDK의 버전 문제일 것 같네요.

    • ipad 2011.08.09 00:33  댓글주소  수정/삭제

      귀한 정보와 조언에 감사를 드립니다
      죄송하지만 이전 블러그에서 빌드하신 이전 AVPlayer-Objects.zip 버전파일이 있으시면 좀 보내주실수 있으신지요
      2011/04/24 이전 버전이나 2010/12/27 이전 버전이면 더 좋을것 같습니다
      iphonedalin@gmail.com 입니다
      염치없이 부탁드립니다

  4. 아이폰 2011.08.05 17:33  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사를 드립니다
    xcode 4.1 에서 설치하는데 계속 에러가 납니다
    죄송하지만 xcode 4.1에 설치하는 법 좀 알려주세요
    AVPlayer-Objects.zip 도 업그레이드가 된것 같네요
    부탁드려요

  5. BlogIcon parkboo 2011.08.19 15:36  댓글주소  수정/삭제  댓글쓰기

    저는 아래처럼 빌드했습니다.

    1. http://www.eplayworks.com/p/lgplinformation.html 에서 소스 받기
    2. gas-preprocessor.pl 설치
    3. yasm 설치 (Mac Port로 하면 쉬움)
    4. libs/FFMpeg 에서 아래 실행.
    ./configure --cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 --as="$SCRIPT_DIR/gas-preprocessor.pl /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2" --prefix="dist" --enable-cross-compile --target-os=darwin --arch=arm --cpu=cortex-a8 --extra-cflags="-arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk" --extra-ldflags="-arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk" --enable-pic --disable-asm
    (disable-asm 옵션을 추가 안하면 빌드시 에러 발생)
    5. make && make install
    6. xcode에서 libz, libbz 추가