AVPlayer와 ffmpeg 모두 열심히 개발하면서 버전이 올라가는 바람에 4월에 올렸던 내용이 어긋나면서 컴파일이 안되고 있었습니다. 주로 arm assembly code 관련된 문제가 많았고, gas-preprocessor.pl 의 매크로 지원 문제라서 받아서 컴파일하는 입장에서는 문제가 생길 때마다 매번 대응하기 곤란했습니다. 매번 git 에 코드가 올라올 때마다 확인할 수도 없는 노릇이어서 이번에는 아예 AVPlayer 소스안에 들어있는 ffmpeg code에 맞추어서 컴파일하도록 했습니다.
 AVPlayer.zip 에 libs/FFmpeg 에 비교적 최근(아마도?) 소스가 들어있으므로 매번 git 에서 clone 할 필요없이 주어진 것으로 컴파일하기로 했습니다. 당장 최신 ffmpeg 의 기능이 필요하지 않다면 상관없을 듯 합니다. 그리고 universal library에 i386의 library는 제외시켰습니다. yasm을 설치하고 이전 스크립트로 컴파일해도 되지만 어차피 AVPlayer에 링크될 때 simulator 용을 만들 수 없으므로 컴파일할 필요는 없습니다. ffmpeg library 자체에 흥미있으신 분들은 이전 글을 참고해서 컴파일해 보시면 될 듯 합니다. 좀 무책임한 선택이지만 매번 버전 차이 때문에 이 글을 업데이트하는 일은 없었으면 하는 바람입니다.


준비물

FFmpeg library만들기
 
  • AVPlayerDist143.zip을 작업할 폴더에 풉니다.
  • __MACOSX 폴더는 지워도 됩니다.
  • https://github.com/yuvi/gas-preprocessor 에서 gas-preprocessor.pl을 가져와 /usr/local/bin으로 복사합니다.
  • AVPlayer 안에 libs 디렉토리로 이동합니다. (cd libs)
  • libs 안에 ffmpeg-armv6, ffmpeg-armv7 디렉토리를 만듭니다. (mkdir ffmpeg-armv6 ffmpeg-armv7)
  • build-armv6 파일을 열어 15번째 줄에서 CONFIGURE_OPTIONS=" ... " 안에 --disable-doc 을 추가합니다.
  • build-armv6 파일의 30번째 줄의 ./configure ... 을 ../FFmpeg/configure ... 으로 수정합니다.
  • build-armv6 파일의 30번째 줄에서 gcc-4.2 와 iPhoneOS4.3.sdk 라고 되어 있는 부분을 자신의 버전과 일치하도록 수정합니다. 어떤 버전인지 자신이 없으면 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ 과 /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/ 에 실제로 존재하는지 확인하면 됩니다.
  • build-armv7 파일을 열어 build-armv6 에서 수정한 것처럼 고칩니다.
  • FFmpeg 디렉토리에 있는 config.* 파일들을 삭제합니다. (rm -rf FFmpeg/config.*)
    configure를 실행하면 생성되는 파일들인데 이 파일이 FFmpeg에 있으면 ffmpeg-armv6이나 ffmpeg-armv7에서 configure 가 되지 않습니다.
  • 이제 순서대로 build-armv6, build-armv7 스크립트를 실행합니다. (sh build-armv6; sh build-armv7)
    각각의 target에 대해 configure, make를 순서대로 수행하게 됩니다.
    모든 target의 library가 compile되면 ffmpeg-armv6/dist, ffmpeg-armv7/dist 에 include, lib 디렉토리가 만들어지고 해더와 라이브러리가 생성됩니다.
  • combine-libs 파일을 열어서 5번째 줄의 ARCHS="armv6 armv7 i386" 에서 i386 을 지웁니다.
    그리고 8번째 줄의 BUILD_LIBS=" ... " 에서 마지막에 있는 libavcore.a 를 지웁니다.
    28번째 줄과 31번째 줄의 i386 을 armv7 으로 수정합니다.
  • combine-libs를 실행해서 (sh combine-libs) 모든 target의 library를 합칩니다. ffmpeg-uarch에 최종 헤더와 라이브러리가 만들어집니다.

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

댓글을 달아 주세요

  1. ipad2 2011.08.09 03:44  댓글주소  수정/삭제  댓글쓰기

    친절한 해설과 정보 감사 드립니다
    덕분에 인코딩과 설치까지 되긴 되었습니다
    그런데 프로그램에 영상이나 음악을 저장한후 Media Explorer 을 구동하기만 하면 다운되어 버리네요
    .zip 화일을 복사해서 넣으면 정상적으로 작동을 하는데 영상,음악 파일만 넣으면 다운되어 버리네요
    소스공개시 일부러 막아 놓은 것인가요
    왜 그런지 이유가 궁금하네요
    모든 기능이 잘 작동되시는지 궁금하네요

  2. 허당 2011.09.14 17:21  댓글주소  수정/삭제  댓글쓰기

    정보 감사합니다~ 삽질 하다가 이제 제대로 동작이 되네요 ㅎㅎ
    yasm 설치 안한 것과.. /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ 경로가..
    저는 iOS 별로 따로 폴더를 두고 설치를 하여 그 부분에서 잘못됐었네요

  3. 박주형 2011.11.10 19:39  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 탈옥폰 유저입니다.
    탈옥을 하면 cydia란 어플을 통해서 온갖 바이너리 파일들을 받을 수 잇는데 최근에 ffmpeg을 받앗읍니다. 근데 2009년 컴파일 되엇고 ARMv7용으로 안나왓더라구요. 개발자한테 메일보내보앗더니 더이상 맥이 없다네요.

    그래서, avplayer안으로만 심는거 말구 초보자들도 쉽게 따라할수 잇는 ffmpeg armv7컴파일 강좌를 부탁할려구요......
    아니면 바이너리를 컴파일하셔서 제 메일(arter97@naver.com)으로 꼭 보내주세요 ㅠㅠ 꼭 필요해서요 ㅠㅠ
    감사합니다 ㅎㅎ

  4. ffmpeg컴파일 2011.11.21 10:59  댓글주소  수정/삭제  댓글쓰기

    •이제 순서대로 build-armv6, build-armv7 스크립트를 실행합니다. (sh build-armv6; sh build-armv7)
    각각의 target에 대해 configure, make를 순서대로 수행하게 됩니다.
    모든 target의 library가 compile되면 ffmpeg-armv6/dist, ffmpeg-armv7/dist 에 include, lib 디렉토리가 만들어지고 해더와 라이브러리가 생성됩니다.

    이전 작업까지는 잘 따라하였습니다

    근데 이작업을 하려고 하는데 에러가 나는데요 어떻게 해야하나요?

    warrning 2개
    Error handling externals definition fpo 'ffmpeg-armv6/libswscale'
    URL 'svn://svm.ffmpeg.org/mplayer.trynk.libswscale'at evision 34354 doesn,t exist

    가 뜨네요

    그리고
    /Deveplper/Platforms/iPhonesOS.platrform.Develpoer/usr/bin/gcc-4.2 is unable to creat an executalbe file. C comipler test failed

    라고 떠서 fmpeg-armv6/dist, ffmpeg-armv7/dist 에 include, lib 디렉토리가 만들어지고 해더와 라이브러리가 생성되지 않습니다.

    어떻게 처리를 해야 할까요? ㅠㅠ 부탁드립니다

  5. Eugene 2012.08.31 14:52  댓글주소  수정/삭제  댓글쓰기

    상세한 설명 덕분에 컴파일 성공하고 갑니다~

    감사합니다!!

  6. ㅠㅠ 2013.03.11 08:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요..

    아이폰 공부하는 유저인데...

    현재 AVPlayer가 좀 바뀌어서 그 이후로 소스공개가 안되는것같더라구요...

    혹시 받아놓으신 소스 공유가 가능할런지요? ㅠㅠㅋ

    huge123@naver.com 으로 공유 부탁드리겠습니다.

    컴파일해보고 싶은데 소스가 없네요 ㅠㅋ

    • BlogIcon luuvish 2013.03.12 13:12 신고  댓글주소  수정/삭제

      eplayworks.com의 support/avplayer/license 페이지에서 다운받으실 수 있습니다.

      http://eplayworks.com/section/support/licenseAP.php?lang=en
      위 페이지의 AVPlayer-XCode download 를 클릭하면 됩니다.

      http://avstreamer.eplayworks.com/download/download_avplayer.php

  7. 한스 2013.05.09 17:58  댓글주소  수정/삭제  댓글쓰기

    강좌 잘 참고 하여 컴파일중에 있습니다
    source:AVPlayer164.zip과
    script:build-ffmpeg-ios4.3.tar.gz을 이용하여 컴파일하고 있습니다

    강좌를 참고 하여 script를 수정후,
    armv6 과 armv7을 컴파일 했습니다만
    armv6는
    configuration 하면서, gcc is unable to create an executeable file 에러와,

    armv7은 컴파일을 하다가,
    af_volume.o error:invalid operand in inline asm: 'adds $1, ${2:R}, ~~~
    에서 에러가 발행합니다

    두 스크립트를 확인해봤으나 armv6,7 부분만 다를뿐, 모두 같은데 현상이 달라
    고전중에 있습니다

    조언을 좀 부탁드리겠습니다

  8. 안녕하세요.. 2013.09.02 16:22  댓글주소  수정/삭제  댓글쓰기

    안녕하세요..
    http://avstreamer.eplayworks.com/download/download_avplayer.php
    이 링크로 소스를 받아보니 이제 소스부분이 거의 없군요..
    어떻게 ffmpeg는 빌드 하였는데.. AppDelegate가 없어서..
    오류가 나는군요..
    Undefined symbols for architecture i386:
    "_OBJC_CLASS_$_AppDelegate", referenced from:
    objc-class-ref in main.o
    "_OBJC_CLASS_$_FolderUtils", referenced from:
    objc-class-ref in list.o

    실례되지 않는다면 이전 버전의 소스를 부탁드려도 될까요?
    ftfuture@naver.com
    좋은 글 감사합니다.