2012-06-05 4 views
7

J'essaye de construire la bibliothèque FFMPEG pour mon application androïde utilisant le NDK. J'ai téléchargé le code source de son site web et je pense que je le construis (c'est mon premier essai avec NDK et ffmpeg). J'ai créé un fichier build.sh que j'utilise pour l'exécuter à partir de la ligne de commande sur Mac OS X. Mais j'ai quelques questions ...Android NDK et FFMPEG build

D'abord c'est comme je sais que j'ai besoin de fichier Android.mk afin que je puisse utiliser la bibliothèque construite dans mon application, mais je ne sais pas comment faire pour des raisons que je vous ai dit ci-dessus. Après avoir exécuté mon build.sh, j'obtiens le dossier android avec quelques dossiers et quelques bibliothèques. Donc, ma première question est, comment puis-je construire le fichier Android.mk dont j'ai besoin ... et peut-être si quelqu'un peut m'expliquer pourquoi j'en ai besoin.

enter image description here

Ma deuxième question est que j'ai besoin des bibliothèques de ffmpeg pour pouvoir les utiliser à partir de mon application, mais après la construction je ne peux pas les voir dans mon arbre source. Je sais que je dois les activer dans mon build.sh et je pense que je l'ai fait, mais je ne peux pas les voir. Donc, tout type d'information sur mon fichier de construction me sera utile pour comprendre comment le configurer. Voici comment il ressemble:

#!/bin/bash 
###################################################### 
# Usage: 
# put this script in top of FFmpeg source tree 
# ./build_android 
# It generates binary for following architectures: 
# ARMv6 
# ARMv6+VFP 
# ARMv7+VFPv3-d16 (Tegra2) 
# ARMv7+Neon (Cortex-A8) 
# Customizing: 
# 1. Feel free to change ./configure parameters for more features 
# 2. To adapt other ARM variants 
# set $CPU and $OPTIMIZE_CFLAGS 
# call build_one 
###################################################### 
NDK=~/Desktop/android-ndk-r5b 
PLATFORM=$NDK/platforms/android-8/arch-arm/ 
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86 
function build_one 
{ 
./configure \ 
    --target-os=darwin \ 
    --prefix=$PREFIX \ 
    --enable-cross-compile \ 
    --extra-libs="-lgcc" \ 
    --arch=arm \ 
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \ 
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \ 
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \ 
    --sysroot=$PLATFORM \ 
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \ 
    --disable-doc \ 
    --disable-ffmpeg \ 
    --disable-ffplay \ 
    --disable-ffserver \ 
    --disable-ffprobe \ 
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \ 
    --enable-zlib \ 
    --enable-version3 \ 
    --enable-nonfree \ 
    --enable-libmp3lame \ 
    --enable-libspeex \ 
    --enable-libtheora \ 
    --enable-libfaac \ 
    --enable-libvorbis \ 
    --enable-libaacplus \ 
    --prefix=$DIST_DIR \ 
    $ADDITIONAL_CONFIGURE_FLAG 

make clean 
make -j4 install 
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o 
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a 
} 

#arm v6 
#CPU=armv6 
#OPTIMIZE_CFLAGS="-marm -march=$CPU" 
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG= 
#build_one 

#arm v7vfpv3 
CPU=armv7-a 
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU " 
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG= 
build_one 

#arm v7vfp 
#CPU=armv7-a 
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU " 
#PREFIX=./android/$CPU-vfp 
#ADDITIONAL_CONFIGURE_FLAG= 
#build_one 

#arm v7n 
#CPU=armv7-a 
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8" 
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon 
#build_one 

#arm v6+vfp 
#CPU=armv6 
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU" 
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG= 
#build_one 

Merci pour tout type d'informations utiles/suggestions/exemples et etc.

Répondre

5

Tout d'abord, vous devriez lire la documentation pour Android NDK et vérifier certains échantillons applications. Vous trouverez ces détails dans android_NDK_home/docs et android_NDK_home/samples (où android_NDK_home est le nom du dossier pour votre NDK android).

Aussi, vérifiez ce lien sur stackoverflow: Using FFmpeg with Android-NDK

Pour un Stept par étape tutoriel, ceci est une assez bonne: http://www.roman10.net/how-to-build-ffmpeg-for-android/

En outre, vous devrez installer/configurer certains éléments sur votre Eclipse pour activer le support pour développer des applications qui sont construites avec le NDK: http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/ http://wiki.eclipse.org/Sequoyah/ndk_checklist

Et une assez bonne Proje ct qui utilise la bibliothèque ffmpeg: https://github.com/havlenapetr/FFMpeg

+0

cela fonctionnera même si je compile dans Ubuntu 12.10 machine 64 bits? Et avec le dernier NDK? – agony

+0

Je suis désolé agonie, je n'ai aucune idée, seulement utilisé Mac. Mais je ne vois aucune raison pour laquelle il ne devrait pas fonctionner sur Ubuntu – bogdan

+0

@bogdan comment l'utiliser pour compresser les vidéos https://github.com/havlenapetr/FFMpeg –

11

J'ai fait un tutoriel sur la façon de construire ffmpeg et x264 pour android: zip with build of ffmpeg with x264

Vous pouvez également télécharger le fichier zip contenant les fichiers dont vous avez besoin pour faire une application sur android.

+0

Votre URL de téléchargement a été bloquée, veuillez fournir toute autre aide sur la même chose –

+0

Toujours travailler l'url – Estevex

+1

@Estevex Url ne fonctionnait pas J'ai essayé – Nisarg

9

Si vous voulez des instructions plus détaillées sur la façon de construire ffmpeg et comment l'utiliser pour créer des applications Android, s'il vous plaît se référer au livre livre de cuisine Android NDK: http://www.packtpub.com/android-native-development-kit-cookbook/book

Le bonus Chapitre 1 est dédié au développement d'applications multimédia avec Android NDK et ffmpeg, et il est disponible gratuitement au http://www.packtpub.com/sites/default/files/downloads/Developing_Multimedia_Applications_with_NDK.pdf

1

ffmpeg utilise autoconf comme système de compilation. Au moment de la rédaction de ce document, personne n'a encore mis en place un paquet de construction Gradle pour ffmpeg sur Android.Pour autant que je sache, Gradle ne supporte pas encore autoconf, ce qui le rend assez difficile à faire

Cela dit, après avoir essayé plusieurs des tutoriels qui étaient là-bas, ainsi que certains des pré-construits paquets, nous avons décidé de rouler notre propre wrapper de script de construction Android pour ffmpeg qui comprend le support pour OpenSSL et librtmp.

Vous pouvez le trouver ici: https://github.com/cine-io/android-ffmpeg-with-rtmp

Condition préalable: Le Android NDK doit être installé

Instructions:

$ git clone [email protected]:cine-io/android-ffmpeg-with-rtmp.git 
$ cd android-ffmpeg-with-rtmp 
$ ./build.sh 

Lorsque le script est terminé, les bibliothèques partagées nécessaires et ffmpeg exécutable sera placé dans le répertoire build/dist. Vous pouvez les inclure dans votre projet comme n'importe quel autre binaire natif.

+0

J'étais ravi de voir que cela pourrait effectivement fonctionne, mais j'ai une erreur: est-ce que ça fonctionne quand on construit sur un mac? Console a le point où il est dit "Impossible de configurer ffmpeg!" Et le build.log dit "ERROR: librtmp not found". Des idées? – bracken

0

Pour construire exécutable ffmpeg, j'utilise les éléments suivants Android.mk:

SYSROOT-armeabi-v7a  := $(NDK_ROOT)/platforms/android-9/arch-arm/ 
SYSROOT-arm64-v8a := $(NDK_ROOT)/platforms/android-21/arch-arm64/ 
SYSROOT-x86  := $(NDK_ROOT)/platforms/android-9/arch-x86/ 
SYSROOT := $(SYSROOT-$(TARGET_ARCH_ABI)) 

TOOLCHAIN_TARGET_ARCH-armeabi-v7a := arm 
TOOLCHAIN_TARGET_ARCH-arm64-v8a := aarch64 
TOOLCHAIN_TARGET_ARCH-x86 := i686 
TOOLCHAIN_TARGET_ARCH := $(TOOLCHAIN_TARGET_ARCH-$(TARGET_ARCH_ABI)) 

TOOLCHAIN_TARGET_ABI-armeabi-v7a := androideabi 
TOOLCHAIN_TARGET_ABI-arm64-v8a := android 
TOOLCHAIN_TARGET_ABI-x86 := android 
TOOLCHAIN_TARGET_ABI := $(TOOLCHAIN_TARGET_ABI-$(TARGET_ARCH_ABI)) 

TOOLCHAIN_TRIPLET := $(TOOLCHAIN_TARGET_ARCH)-linux-$(TOOLCHAIN_TARGET_ABI)- 

TOOLCHAIN_NAME-$(TARGET_ARCH_ABI) := $(TOOLCHAIN_TRIPLET)$(TOOLCHAIN_VERSION) 
TOOLCHAIN_NAME-x86 := x86-$(TOOLCHAIN_VERSION) 
TOOLCHAIN_NAME := $(TOOLCHAIN_NAME-$(TARGET_ARCH_ABI)) 

TOOLCHAIN_VERSION_PREFIX := $(TOOLCHAIN_TRIPLET)$(TOOLCHAIN_VERSION) 

ARCH_ARM_MODE-armeabi := arm 
ARCH_ARM_MODE-armeabi-v7a := thumb 
ARCH_ARM_MODE-arm64-v8a := thumb 
ARCH_ARM_MODE := $(ARCH_ARM_MODE-$(TARGET_ARCH_ABI)) 

include $(CLEAR_VARS) 
LOCAL_ARM_MODE := $(ARCH_ARM_MODE) 

FFMPEG_PATH  := $(BUILD_DIRECTORY)/ffmpeg 

LOCAL_CFLAGS-armeabi-v7a := -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp 
LOCAL_CFLAGS-x86 := -m32 
LOCAL_CFLAGS-arm64-v8a := -march=armv8-a+simd+fp 

LOCAL_CFLAGS := $(LOCAL_CFLAGS-$(TARGET_ARCH_ABI)) 

LOCAL_LDFLAGS-x86 := -m32 -Wl,-eh-frame-hdr -Wl,-m,elf_i386 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now 

LOCAL_LDFLAGS := $(LOCAL_LDFLAGS-$(TARGET_ARCH_ABI)) 

LOCAL_CFLAGS += -fPIE 
LOCAL_LDFLAGS += -fPIE -pie 

FFMPEG_CONFIG_OPTS := 

FFMPEG_CONFIG_OPTS += --target-os=linux 
FFMPEG_CONFIG_OPTS-$(TARGET_ARCH_ABI) := --cross-prefix=$(TOOLCHAIN_PREFIX) 
FFMPEG_CONFIG_OPTS-$(TARGET_ARCH_ABI) += --enable-cross-compile 
FFMPEG_CONFIG_OPTS-$(TARGET_ARCH_ABI) += --sysroot=$(SYSROOT) 
FFMPEG_CONFIG_OPTS += $(FFMPEG_CONFIG_OPTS-$(TARGET_ARCH_ABI)) 

## disable 
FFMPEG_CONFIG_OPTS += --disable-doc 
FFMPEG_CONFIG_OPTS += --disable-shared 
FFMPEG_CONFIG_OPTS += --disable-avdevice 
FFMPEG_CONFIG_OPTS += --disable-postproc 
FFMPEG_CONFIG_OPTS += --disable-network 
FFMPEG_CONFIG_OPTS += --disable-iconv 
FFMPEG_CONFIG_OPTS += --disable-zlib 
FFMPEG_CONFIG_OPTS += --disable-ffplay 
FFMPEG_CONFIG_OPTS += --disable-ffprobe 
FFMPEG_CONFIG_OPTS += --disable-ffserver 
FFMPEG_CONFIG_OPTS += --disable-swscale-alpha 
## enable 
FFMPEG_CONFIG_OPTS += --enable-pthreads 
FFMPEG_CONFIG_OPTS += --enable-small 

FFMPEG_CONFIG_OPTS += --extra-cflags="$(LOCAL_CFLAGS)" 
FFMPEG_CONFIG_OPTS += --extra-cxxflags="$(LOCAL_CXXFLAGS)" 
FFMPEG_CONFIG_OPTS += --extra-ldflags="$(LOCAL_LDFLAGS)" 

FFMPEG_CONFIG_OPTS += --enable-runtime-cpudetect 

ARMBITS-$(TARGET_ARCH_ABI) := 
ARMBITS-arm64-v8a := 64 
ARMBITS := $(ARMBITS-$(TARGET_ARCH_ABI)) 

FFMPEG_CONFIG_OPTS-$(TARGET_ARCH_ABI) := 

FFMPEG_CONFIG_OPTS-armeabi := --enable-armv5te 
FFMPEG_CONFIG_OPTS-armeabi += --enable-inline-asm 
FFMPEG_CONFIG_OPTS-armeabi += --arch=arm$(ARMBITS) 

FFMPEG_CONFIG_OPTS-armeabi-v7a := $(FFMPEG_CONFIG_OPTS-armeabi) 
FFMPEG_CONFIG_OPTS-armeabi-v7a += --enable-armv6 
FFMPEG_CONFIG_OPTS-armeabi-v7a += --enable-armv6t2 
FFMPEG_CONFIG_OPTS-armeabi-v7a += --enable-vfp 
FFMPEG_CONFIG_OPTS-armeabi-v7a += --enable-neon 
FFMPEG_CONFIG_OPTS-armeabi-v7a += --enable-thumb 
FFMPEG_CONFIG_OPTS-armeabi-v7a += --enable-fast-unaligned 

FFMPEG_CONFIG_OPTS-arm64-v8a := $(FFMPEG_CONFIG_OPTS-armeabi-v7a) 

FFMPEG_CONFIG_OPTS-x86 := --enable-yasm 
FFMPEG_CONFIG_OPTS-x86 += --arch=x86 

FFMPEG_CONFIG_OPTS += $(FFMPEG_CONFIG_OPTS-$(TARGET_ARCH_ABI)) 

LOCAL_MODULE := ffmpeg 
LOCAL_SRC_FILES := $(abspath $(TARGET_OBJS))/ffmpeg/lib...ffmpeg...so # see http://stackoverflow.com/a/17384650/192373 

clean: $(TARGET_OBJS)/ffmpeg/clean 

$(TARGET_OBJS)/ffmpeg/clean: PRIVATE_ABI := $(FFMPEG_TARGET_ABI) 
$(TARGET_OBJS)/ffmpeg/clean: 
    $(call host-echo-build-step,$(PRIVATE_ABI),Clean) "ffmpeg [$(PRIVATE_ABI)]" 
    $(hide) $(call host-rmdir,$(@D)) 

$(shell $(call host-mkdir,$(dir $(LOCAL_SRC_FILES)))) 
$(shell $(HOST_ECHO) >$(LOCAL_SRC_FILES)) 
.PHONY: $(LOCAL_SRC_FILES) 
$(LOCAL_SRC_FILES): $(TARGET_OBJS)/ffmpeg/ffmpeg 
    $(hide) $(call host-mv,$<,[email protected]) 

include $(PREBUILT_SHARED_LIBRARY) 

$(TARGET_OBJS)/ffmpeg/Makefile: FFMPEG_CONFIG_OPTS := $(FFMPEG_CONFIG_OPTS) 
$(TARGET_OBJS)/ffmpeg/Makefile: 
    $(hide) $(call host-mkdir,$(@D)) 
    $(hide) cd $(@D) && $(abspath $(FFMPEG_PATH))/configure $(FFMPEG_CONFIG_OPTS) 

$(TARGET_OBJS)/ffmpeg/ffmpeg: FFMPEG_CONFIG_OPTS := using toolchain:$(NDK_ROOT)/toolchains/$(TOOLCHAIN_NAME) compiler:$(TOOLCHAIN_COMPILER) triplet:$(TOOLCHAIN_TRIPLET) 
$(TARGET_OBJS)/ffmpeg/ffmpeg: $(TARGET_OBJS)/ffmpeg/Makefile 
    @echo $(FFMPEG_CONFIG_OPTS) 
    $(hide) $(MAKE) --no-print-directory -C $(@D)