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
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


XBMC가 AppleTV2와 iPhone/iPad로 porting 되었습니다.

오픈소스 프로젝트이므로 자유롭게 다운받아 Xcode로 컴파일해서 돌려 볼 수 있습니다.
다만 몇가지 제약으로 인해 탈옥된 디바이스에만 올릴 수 있습니다.

탈옥을 했다는 전제하에 아래의 내용을 따라가시면 됩니다.
탈옥한 디바이스에는 AppSync가 설치되어 있어야 합니다.



CodeSign을 속이기 위한 설정

(http://www.alexwhittemore.com/?p=398 참조)
$ cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk
$ sudo cp SDKSettings.plist SDKSettings.plist.orig
$ sudo vi SDKSettings.plist
<key>CODE_SIGNING_REQUIRED</key> 을 찾아 그 아래줄의
<string>YES</string> 을 <string>NO</string> 로 수정
<key>ENTITLEMENTS_REQUIRED</key> 을 찾아 그 아래줄의
<string>YES</string> 을 <string>NO</string> 로 수정

$ cd /Developer/Platforms/iPhoneOS.platform/
$ sudo cp Info.plist Info.plist.orig
$ sudo vi Info.plist
<key>CODE_SIGN_CONTEXT_CLASS</key> 을 찾아 그 아래줄의
<string>XCiPhoneOSCodeSignContext</string> 을 <string>XCCodeSignContext</string> 로 수정
CODE_SIGN_CONTEXT_CLASS 가 한번 더 나오므로 위와 같이 한번 더 수정

$ cd ~/Desktop
$ vi script

아래의 내용을 카피해서 script file을 만듭니다.
#!/bin/bash
cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "\xc3\x26\x00\x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support

$ chmod 777 script
$ ./script

$ mkdir /Developer/iphoneentitlements401
$ cd /Developer/iphoneentitlements401
$ curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
$ mv gen_entitlements.txt gen_entitlements.py
$ chmod 777 gen_entitlements.py



키체인 만들기

$ open /Applications/Utilities/Keychain\ Access.app/

키체인 프로그램이 열리면
Keychain Access (키체인 접근) 메뉴의 Certificate Assistant (인증 지원) 에서
Create a Certificate (인증서 생성) 를 선택

'Name (이름)' : 'iPhone Developer'
'Identity Type (신원 유형)' : 'Self Signed Root (자체 서명 루트)'
'Certificate Type (인증서 유형)' : 'Code Signing (코드 서명)'

위와 같이 iPhone Developer 라는 이름의 코드 서명을 만듭니다.
인증서가 만들어지면 정보입수에서 신뢰를 항상 신뢰로 설정합니다.



XBMC 컴파일하기

XBMC의 iOS branches source를 받아옵니다.
$ git clone https://github.com/xbmc/atv2.git xbmc

일부 툴들이 설치되어 있지 않을 수 있습니다. fink나 port로 설치해야 합니다.
$ sudo fink install autoconf help2man
$ cd xbmc
$ sudo mkdir -p /usr/local/bin
$ sudo cp tools/osx/ios-depends/gas-preprocessor/gas-preprocessor.pl /usr/local/bin/

컴파일을 시작합니다. 상당한 시간이 걸립니다.
$ make -C tools/osx/ios-depends
$ make -C tools/osx/ios-depends/xbmc
$ make xcode_depends

두가지 타겟중 필요한 것을 생성합니다.
$ xcodebuild -project XBMC-IOS.xcodeproj -target XBMC -configuration Release build ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 IPHONEOS_DEPLOYMENT_TARGET=4.1 SDKROOT=iphoneos4.2
$ xcodebuild -project XBMC-ATV2.xcodeproj -target XBMC -configuration Release build ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 IPHONEOS_DEPLOYMENT_TARGET=4.1 SDKROOT=iphoneos4.2
Posted by luuvish
TAG ffmpeg, ios, xbmc
VLC는 한번에 제대로 컴파일된 적이 없네요. iOS 버전은 최근에 작업중인지 그나마 덜 고생하고 컴파일 성공했습니다. 프로젝트들이 얽혀있어 분석이 쉽진 않겠네요.

$ tar jxvf VLC-1.1.0-iOS.tar.bz2
$ ln -s VLC-1.1.0-iOS vlc
$ cd vlc/extras/package/ios
  • build_for_iOS.sh 을 열어서 SDK 버전을 수정합니다. 현재 최신버전은 4.2.sdk입니다. IOS_SDK_ROOT="${DEVROOT}/SDKs/iPhone${PLATFORM}3.2.sdk"
  • build_for_iOS.sh 를 실행해서 컴파일해 보면 중간에 에러가 나면서 멈춥니다. patch file의 버전문제인데 ../../contrib/src-arm-apple-darwin10-ios/src/Patches/live-inet_ntop.patch의 161-185 라인을 참고해서 ../../contrib/src-arm-apple-darwin10-ios/src/live/liveMedia/RTSPServer.cpp을 직접 수정하면 됩니다. our_inet_ntoa()의 두번째 인자로 buf를 추가하기만 하면됩니다.
  • 이제 build_for_iOS.sh를 실행해서 컴파일합니다. 완료되면 vlc/install-ios-OS에 해더와 라이브러리가 생성됩니다.
  • MobileVLCKit의 static plugins를 build합니다.
$ cd vlc/projects/macosx/framework
$ xcodebuild -project MobileVLCKit.xcodeproj -target "Aggregate static plugins" -configuration "Release"
  • MobileVLCKit의 MobileVLCKit의 SDK 버전을 최신버전으로 수정하고 build합니다.
$ open MobileVLCKit.xcodeproj
fix Targets/MobileVLCKit - Get Info / Build
Configuration : All Configurations
Architectures / Base SDK : Latest iOS
$ xcodebuild -project MobileVLCKit.xcodeproj -target "MobileVLCKit" -configuration "Release"



MediaLibraryKit compile하기
  • 작업디렉토리(VLC-1.1.0-iOS와 같은 위치)에 MediaLibraryKit 디렉토리를 만들고 압축을 풉니다.
$ mkdir MediaLibraryKit && cd MediaLibraryKit
$ unzip MediaLibraryKit-1.1.0.zip
  • External 디렉토리로 들어가 MobileVLCKit의 링크를 만듭니다.
$ ln -s ../../vlc/projects/macosx/framework/build/Release-iphoneos MobileVLCKit
  • MediaLibraryKit의 SDK 버전을 최신버전으로 수정하고 build합니다.
$ open MobileMediaLibraryKit.xcodeproj
fix Targets/MobileMediaLibraryKit - Get Info / Build
Configuration : All Configurations
Architectures / Base SDK : Latest iOS
$ xcodebuild -project MobileMediaLibraryKit.xcodeproj -configuration "Release"



MobileVLC compile하기
  • 작업디렉토리(VLC-1.1.0-iOS와 같은 위치)에서 MobileVLC의 압축을 풉니다.
$ tar zxvf MobileVLC-1.1.0.tar.gz
$ cd MobileVLC
  • External 밑에 있는 MediaLibraryKit와 MobileVLCKit의 링크가 제대로 되어있는지 확인합니다.
  • MobileVLC의 SDK 버전을 최신버전으로 수정하고 build합니다.
$ open MobileVLC.xcodeproj
fix Targets/MobileVLC - Get Info / Build
Configuration : All Configurations
Architectures / Architectures : Standard (armv6 armv7)
Architectures / Base SDK : Latest iOS
build with Device-Release configurations

Posted by luuvish
TAG ffmpeg, ios, vlc
요즘 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