Creación de Android NDK y FFMPEG

Estoy intentando construir la biblioteca de FFMPEG para mi androide que usa el NDK. He descargado el código fuente de su sitio web y creo que construirlo (es mi primer intento de trabajar con NDK y ffmpeg). He creado un archivo build.sh que estoy usando para ejecutarlo desde la línea de comandos en Mac OS X. Pero tengo algunas preguntas …

Lo primero es que sé que necesito el archivo Android.mk para poder usar la biblioteca construida en mi aplicación, pero no sé cómo hacerlo por razones que ya te he dicho. Después de ejecutar mi build.sh consigo la carpeta android con algunas carpetas y algunas bibliotecas. Así que mi primera pregunta es, ¿cómo puedo construir el archivo Android.mk que necesito … y tal vez si alguien me puede explicar por qué lo necesito.

Introduzca aquí la descripción de la imagen

Mi segunda pregunta es que necesito algunas bibliotecas de ffmpeg para poder usarlas desde mi aplicación, pero después de la compilación no las puedo ver en mi árbol de origen. Sé que tengo que habilitarlos en mi build.sh y creo que lo hice, pero no puedo verlos. Así que cualquier tipo de información sobre mi archivo de compilación será útil para que yo entienda cómo configurarlo. Así es como se ve:

  #!/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 

Gracias por cualquier tipo de información útil / sugerencias / ejemplos y etc.

Hice un tutorial sobre cómo construir ffmpeg y x264 para android : zip con la compilación de ffmpeg con x264

También puede descargar el archivo zip que contiene los archivos que necesita para realizar una aplicación en android .

Si desea una instrucción más detallada de cómo construir ffmpeg y cómo utilizarlo para crear aplicaciones de Android, consulte el libro libro de cocina de Android NDK: http://www.packtpub.com/android-native-development-kit-cookbook/ libro

El capítulo 1 de Bonus está dedicado al desarrollo de aplicaciones multimedia con Android NDK y ffmpeg, y está disponible gratuitamente en http://www.packtpub.com/sites/default/files/downloads/Developing_Multimedia_Applications_with_NDK.pdf

En primer lugar, debe leer la documentación de Android NDK y echa un vistazo a algunas aplicaciones de ejemplo. Encontrarás estos detalles en android_NDK_home / docs and android_NDK_home / samples (donde android_NDK_home es el nombre de la carpeta para tu androide NDK).

Además, compruebe este enlace en stackoverflow: Uso de FFmpeg con Android-NDK

Para un paso a paso tutorial, esta es una muy buena: http://www.roman10.net/how-to-build-ffmpeg-for-android/

Además, tendrá que instalar / configurar algunos elementos en su Eclipse para habilitar el soporte para desarrollar aplicaciones que se crean con el NDK: http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for- Android-cc-development / http://wiki.eclipse.org/Sequoyah/ndk_checklist

Y un proyecto bastante bueno que utiliza la biblioteca ffmpeg: https://github.com/havlenapetr/FFMpeg

Ffmpeg utiliza autoconf como su sistema de compilación. Hasta el momento de escribir esto, nadie ha reunido un paquete de compilación de Gradle para ffmpeg en Android. Por lo que puedo decir, Gradle aún no es compatible con autoconf, lo que hace que sea bastante difícil hacerlo

Dicho esto, después de probar varios de los tutoriales que estaban allí, así como algunos de los paquetes pre-construidos, decidimos rodar nuestro propio envoltorio de script de compilación de Android para ffmpeg que incluye soporte para OpenSSL y librtmp .

Puede encontrarlo aquí: https://github.com/cine-io/android-ffmpeg-with-rtmp

Prerrequisito: El Android NDK debe instalarse

Instrucciones:

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

Una vez finalizado el script, las bibliotecas compartidas necesarias y el ejecutable ffmpeg se colocarán en el directorio build/dist . Puede incluirlos en su proyecto como cualquier otro binario nativo.

Para construir el ejecutable de ffmpeg, utilizo el siguiente 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,$<,$@) 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) 
  • Ffmpeg 10.04 no pudo encontrar parámetros de codec
  • Ffmpeg para un android (usando el tutorial: "ffmpeg y Android.mk")
  • Adición de un recurso de imagen sobre archivo de vídeo desde la tarjeta sd mediante ffmpeg o MediaMuxer para android
  • ¿Cuál es el equivalente de Android de / dev / video0 para la cámara de la tableta?
  • Grabación de una superficie con MediaCodec
  • FFMpeg en Android, referencias indefinidas a las funciones de libavcodec, aunque aparece en la línea de comandos
  • Ffmpeg Build ¿La salida no está demostrando?
  • Bambuser ffmpeg - "arm-linux-androideabi-gcc no puede crear un archivo ejecutable."
  • FFMPEG sws_scale Crash en Android
  • FFMpeg Android Stagefright SIGSEGV error (decodificación h264)
  • Construyendo FFmpeg para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.