2011-08-09 10 views
7

Próbuję skompilować plik ffmpeg przy użyciu plików make i kompilacji w iFrameExtractor example. po pierwsze próbowałem wykonać plik readme na github, który mówi tylko o uruchomieniu folderu ./build_universal w ffmpeg. to nie zadziałałoproblem kompilacji ffmpeg dla iFrameExtractor

Próbowałem następnie postępować zgodnie z informacjami w INSTALL bez powodzenia. następnie próbowałem robić rzeczy w INSTALL, a następnie ./build_universal, które nie działały. Wszystkie pliki * .a, które są importowane do projektu, istnieją do końca sekwencji kompilacji. kiedy uruchamiane są polecenia lipo w build_universal, które prawdopodobnie łączą pliki .a dla różnych architektur (?). byle jak te zostawić następujące błędy:

lipo: specifed architecture type (armv6) for file (armv6/libavcodec.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) and cpusubtype (6)) 
lipo: specifed architecture type (armv6) for file (armv6/libavdevice.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) and cpusubtype (6)) 
lipo: specifed architecture type (armv6) for file (armv6/libavformat.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) and cpusubtype (6)) 
lipo: specifed architecture type (armv6) for file (armv6/libavutil.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) and cpusubtype (6)) 
lipo: specifed architecture type (armv6) for file (armv6/libswscale.a) does not match it's cputype (16777223) and cpusubtype (3) (should be cputype (12) and cpusubtype (6)) 

mogę dostać projekt do kompilacji na symulatorze, jeśli mogę użyć tylko ./build_armv7 ale jeśli uruchomię Powszechna .a pliki są usuwane w końcu. i tylko używanie nie działa, aby budować dla iPhone 4.

Odpowiedz

10

Po tygodniu prób i błędów, w końcu udało mi się stworzyć uniwersalne biblioteki ffmpeg i z powodzeniem skompilować i uruchomić iFrameExtractor dla urządzenia, jak również symulatora.

Aby skompilować i uruchomić projekt na urządzeniu iPhone lub symulatora:

1) Otwórz Terminal

2) sklonować repozytorium git clone git: //github.com/lajos/iFrameExtractor.git

3) przejdź do folderu ffmpeg w projekcie: cd iFrameExtractor/ffmpeg

4) uruchom: ./configure

5) Edycja kompilacji skrypty (build_armv6, build_armv7, build_i386) w następujący sposób:

Te skrypty zakładają, że używasz iOS SDK 5.0 w Xcode 4.2.

build_armv6:

#!/bin/tcsh -f 

if (! -d armv6) mkdir armv6 
if (! -d lib) mkdir lib 

rm armv6/*.a 

make clean 

./configure \ 
--disable-bzlib --disable-doc \ 
--disable-ffmpeg --disable-ffplay \ 
--disable-ffserver --disable-mmx \ 
--cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \ 
--as='gas-preprocessor/gas-preprocessor.pl /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \ 
--enable-cross-compile --target-os=darwin \ 
--arch=arm --cpu=arm1176jzf-s \ 
--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk \ 
--extra-ldflags="-arch armv6 -L//Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/system" \ 
--extra-cflags="-arch armv6" 

make 

mv libavcodec/libavcodec.a armv6/ 
mv libavdevice/libavdevice.a armv6/ 
mv libavformat/libavformat.a armv6/ 
mv libavutil/libavutil.a armv6/ 
mv libswscale/libswscale.a armv6/ 

rm lib/*.a 

cp armv6/*.a lib/ 

build_armv7:

#!/bin/tcsh -f 

if (! -d armv7) mkdir armv7 
if (! -d lib) mkdir lib 

rm armv7/*.a 

make clean 

./configure \ 
--disable-bzlib --disable-doc \ 
--disable-ffmpeg --disable-ffplay \ 
--disable-ffserver --disable-mmx \ 
--cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \ 
--as='gas-preprocessor/gas-preprocessor.pl /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \ 
--enable-cross-compile --target-os=darwin \ 
--arch=arm --cpu=cortex-a8 --enable-pic \ 
--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk \ 
--extra-ldflags="-arch armv7 - L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/system" \ 
--extra-cflags="-arch armv7" 

make 

mv libavcodec/libavcodec.a armv7/ 
mv libavdevice/libavdevice.a armv7/ 
mv libavformat/libavformat.a armv7/ 
mv libavutil/libavutil.a armv7/ 
mv libswscale/libswscale.a armv7/ 

rm lib/*.a 

cp armv7/*.a lib/ 

build_i386:

#!/bin/tcsh -f 

if (! -d i386) mkdir i386 
if (! -d lib) mkdir lib 

rm i386/*.a 

make clean 

./configure \ 
--disable-bzlib --disable-doc \ 
--disable-ffmpeg --disable-ffplay \ 
--disable-ffserver --disable-mmx \ 
--cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \ 
--as='gas-preprocessor/gas-preprocessor.pl  /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \ 
--sysroot=/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk \ 
--extra-ldflags="-arch i386 -L//Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/usr/lib/system" \ 
--extra-cflags="-arch i386 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -O0 -fasm-blocks -Wreturn-type -Wunused-variable -D__IPHONE_OS_VERSION_MIN_REQUIRED=40000 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk -fvisibility=hidden -mmacosx-version-min=10.5 -gdwarf-2" 

make 

mv libavcodec/libavcodec.a i386/ 
mv libavdevice/libavdevice.a i386/ 
mv libavformat/libavformat.a i386/ 
mv libavutil/libavutil.a i386/ 
mv libswscale/libswscale.a i386/ 

rm lib/*.a 

cp i386/*.a lib/ 

6) budowanie biblioteki ffmpeg: ./build_universal

7) otworzyć Xcode projec i uruchom go na urządzeniu lub symulatorze iPhone'a

Te kroki działają idealnie dla mnie. Mam nadzieję, że pomoże to innym osobom walczącym o uruchomienie bibliotek ffmpeg na iOS.

+0

możesz skontaktować się ze mną, potrzebuję programowania w tym przypadku (oleksiivinogradov Skype) lub [email protected] email – user170317

+0

Dziękuję za zrobienie tego! – explodes

+0

Hi @Far Pointer, wykonałem wszystkie kroki, ale nie udało się skompilować iFrameExtractor. Korzystam z Xcode 4.2. Czy możesz mi w tym pomóc? – Shantanu

5

Pobrałem najnowsze repozytorium ffmpeg i użyłem następującego po kompilacji tylko dla armv6 i armv7. Nie mogłem uzyskać pracy dla i386, otrzymuję błędy, że cputype i subcputype są nieprawidłowe. najwyraźniej cputype ma być x86, a subcputype powinno być intel.

zresztą użyłem następujące tworzyć skrypty kompilacji dla architektur ramion:

budować scenariusz:

#!/bin/sh 

set -e 

SCRIPT_DIR=$((cd -P $(dirname $0) && pwd)) 
DIST_DIR_BASE=${DIST_DIR_BASE:="$SCRIPT_DIR/dist"} 

if [ -d ffmpeg ] 
then 
    echo "Found ffmpeg source directory, no need to fetch from git..." 
else 
    echo "Fetching ffmpeg from git://git.videolan.org/ffmpeg.git..." 
    git clone git://git.videolan.org/ffmpeg.git 
fi 

ARCHS=${ARCHS:-"armv6 armv7"} 

for ARCH in $ARCHS 
do 
    FFMPEG_DIR=ffmpeg-$ARCH 
    if [ -d $FFMPEG_DIR ] 
    then 
     echo "Removing old directory $FFMPEG_DIR" 
     rm -rf $FFMPEG_DIR 
    fi 
    echo "Copying source for $ARCH to directory $FFMPEG_DIR" 
    cp -a ffmpeg $FFMPEG_DIR 

    cd $FFMPEG_DIR 

    DIST_DIR=$DIST_DIR_BASE-$ARCH 
    mkdir -p $DIST_DIR 

    case $ARCH in 
     armv6) 
      EXTRA_FLAGS="--enable-cross-compile --target-os=darwin --arch=arm --cpu=arm1176jzf-s" 
      EXTRA_CFLAGS="-arch $ARCH" 
      EXTRA_LDFLAGS="-arch $ARCH" 
      ;; 
     armv7) 
      EXTRA_FLAGS="--enable-cross-compile --target-os=darwin --arch=arm --cpu=cortex-a8 --enable-pic" 
      EXTRA_CFLAGS="-arch $ARCH" 
      EXTRA_LDFLAGS="-arch $ARCH" 
      ;; 
     x86_64) 
      EXTRA_CC_FLAGS="-mdynamic-no-pic" 
      ;; 
    esac 

    echo "Configuring ffmpeg for $ARCH..." 
    ./configure \ 
    --prefix=$DIST_DIR \ 
    --extra-ldflags=-L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib/system \ 
    --disable-bzlib \ 
    --disable-doc \ 
    --disable-ffmpeg \ 
    --disable-ffplay \ 
    --disable-ffserver \ 
    --cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \ 
    --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk \ 
    --extra-ldflags="$EXTRA_LDFLAGS" \ 
    --extra-cflags="$EXTRA_CFLAGS" \ 
    $EXTRA_FLAGS 

    echo "Installing ffmpeg for $ARCH..." 
    make && make install 

    cd $SCRIPT_DIR 

    if [ -d $DIST_DIR/bin ] 
    then 
     rm -rf $DIST_DIR/bin 
    fi 
    if [ -d $DIST_DIR/share ] 
    then 
     rm -rf $DIST_DIR/share 
    fi 
done 

i połączyć libs scenariusz:

#!/bin/bash 

set -e 

ARCHS="armv6 armv7" 

for ARCH in $ARCHS 
do 
    if [ -d dist-$ARCH ] 
    then 
    MAIN_ARCH=$ARCH 
    fi 
done 

if [ -z "$MAIN_ARCH" ] 
then 
    echo "Please compile an architecture" 
    exit 1 
fi 


OUTPUT_DIR="dist-uarch" 
rm -rf $OUTPUT_DIR 

mkdir -p $OUTPUT_DIR/lib $OUTPUT_DIR/include 

for LIB in dist-$MAIN_ARCH/lib/*.a 
do 
    LIB=`basename $LIB` 
    LIPO_CREATE="" 
    for ARCH in $ARCHS 
    do 
    if [ -d dist-$ARCH ] 
    then 
     LIPO_CREATE="$LIPO_CREATE-arch $ARCH dist-$ARCH/lib/$LIB " 
    fi 
    done 
    OUTPUT="$OUTPUT_DIR/lib/$LIB" 
    echo "Creating: $OUTPUT" 
    lipo -create $LIPO_CREATE -output $OUTPUT 
    lipo -info $OUTPUT 
done 

echo "Copying headers from dist-$MAIN_ARCH..." 
cp -R dist-$MAIN_ARCH/include/* $OUTPUT_DIR/include 

następnie zaimportować .a pliki z BUILD-FOLDER/dist-uarch i buduje w xcode jak czar!

+0

Zbudowany w porządku, ale teraz mają błędy link: (istnieją 39, oto próbka) niezdefiniowane symbole architektury ARMv7: "_ff_vector_fmul_vfp", przywoływane z: _ff_dsputil_init_vfp w libavcodec.a (dsputil_init_vfp.o) " _MAIN”, odwołuje się od: rozpocząć w crt1.3.1.o "_av_solve_lls", odwołuje z: _ff_lpc_calc_coefs w libavcodec.a (lpc.o) "_ff_float_to_int16_vfp" odwołuje od: _ff_dsputil_init_vfp w libavcodec.a (dsputil_init_vfp. o) ld: symbol (s) nie znaleziono dla architektury armv7 – YuzaKen

+0

Czuję, że mam ten też, n Jestem całkiem pewien. jak importuje? Możliwe, że musisz dodać kolejną ścieżkę wyszukiwania dla importu. kliknij cel -> karta ustawienia kompilacji -> ścieżki wyszukiwania -> i zmień ścieżkę wyszukiwania nagłówka/biblioteki tak, aby pasowała do miejsca zbudowanych plików! –

+0

To działało również dla mnie. Dobra robota! Dodatkowe kroki, które podjąłem, to zmienić wersję sdk w skrypcie. Musiałem również dodać "- disable-asm" do flag. W końcu musiałem zaktualizować ścieżki wyszukiwania nagłówków. – ezekielDFM

1

budynek FFMPEG dla iOS 5.1

nadzieję, że to pomoże Ci zbudować najnowszy FFMPEG dla iOS 5.1

git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg 

cd ffmpeg 

./build_universal 

uwaga: trzeba stworzyć build_ * skrypty po pierwsze, aby zrobić to zobaczyć kod poniżej

scenariusza ARMv7 - utworzyć plik build_armv7

#!/bin/tcsh -f 

if (! -d armv7) mkdir armv7 
if (! -d lib) mkdir lib 

rm armv7/*.a 

make clean 

./configure --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --enable-cross-compile --arch=arm --target-os=darwin --cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc --as='gas-preprocessor.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk --cpu=cortex-a8 --extra-cflags='-arch armv7' --extra-ldflags='-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk' --enable-pic 

make 

mv libavcodec/libavcodec.a armv7/ 
mv libavdevice/libavdevice.a armv7/ 
mv libavformat/libavformat.a armv7/ 
mv libavutil/libavutil.a armv7/ 
mv libswscale/libswscale.a armv7/ 

rm lib/*.a 

cp armv7/*.a lib/ 

skrypt ARMV6 - utworzyć plik build_armv6

#!/bin/tcsh -f 

if (! -d armv6) mkdir armv6 
if (! -d lib) mkdir lib 

rm armv6/*.a 

make clean 

./configure --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --enable-cross-compile --arch=arm --target-os=darwin --cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc --as='gas-preprocessor.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk --cpu=arm1176jzf-s --extra-cflags='-arch armv6' --extra-ldflags='-arch armv6 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk' 

make 

mv libavcodec/libavcodec.a armv6/ 
mv libavdevice/libavdevice.a armv6/ 
mv libavformat/libavformat.a armv6/ 
mv libavutil/libavutil.a armv6/ 
mv libswscale/libswscale.a armv6/ 

rm lib/*.a 

cp armv6/*.a lib/ 

skryptu na symulatorze - utworzyć plik build_i386

#!/bin/tcsh -f 

if (! -d i386) mkdir i386 
if (! -d lib) mkdir lib 

rm i386/*.a 

make clean 

./configure \ 
--disable-bzlib --disable-doc \ 
--disable-ffmpeg --disable-ffplay \ 
--disable-ffserver --disable-mmx \ 
--cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \ 
--as='gas-preprocessor.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \ 
--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk \ 
--extra-ldflags="-arch i386 -L//Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/lib/system" \ 
--extra-cflags="-arch i386 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -O0 -fasm-blocks -Wreturn-type -Wunused-variable -D__IPHONE_OS_VERSION_MIN_REQUIRED=40000 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk -fvisibility=hidden -mmacosx-version-min=10.5 -gdwarf-2" 

make 

mv libavcodec/libavcodec.a i386/ 
mv libavdevice/libavdevice.a i386/ 
mv libavformat/libavformat.a i386/ 
mv libavutil/libavutil.a i386/ 
mv libswscale/libswscale.a i386/ 

rm lib/*.a 

cp i386/*.a lib/ 

skrypt do powszechnej produkcji (połączą bibliotek w jeden uniwersalny) - utwórz plik build_universal

#!/bin/tcsh -f 

source ./build_armv6 
source ./build_armv7 
source ./build_i386 

if (! -d universal) mkdir universal 
if (! -d lib) mkdir lib 

rm universal/*.a 

lipo -create -arch armv6 armv6/libavcodec.a -arch armv7 armv7/libavcodec.a -arch i386 i386/libavcodec.a -output universal/libavcodec.a 
lipo -create -arch armv6 armv6/libavdevice.a -arch armv7 armv7/libavdevice.a -arch i386 i386/libavdevice.a -output universal/libavdevice.a 
lipo -create -arch armv6 armv6/libavformat.a -arch armv7 armv7/libavformat.a -arch i386 i386/libavformat.a -output universal/libavformat.a 
lipo -create -arch armv6 armv6/libavutil.a -arch armv7 armv7/libavutil.a -arch i386 i386/libavutil.a -output universal/libavutil.a 
lipo -create -arch armv6 armv6/libswscale.a -arch armv7 armv7/libswscale.a -arch i386 i386/libswscale.a -output universal/libswscale.a 

rm lib/*.a 

cp universal/*.a lib/ 
Powiązane problemy