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.
- Compilar ffmpeg con android ndk r5b
- ffmpeg para un android (usando el tutorial: "ffmpeg y Android.mk")
- El comando FFMPEG para recortar y transponer vídeo sale ampliado en mala calidad
- GC y onTouch causan un error de señal fatal 11 (SIGSEGV) en la aplicación que utiliza ffmpeg a través de ndk
- FFmpeg - no puede encontrar ExecuteBinaryResponseHandler - Android / Java
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.
- Problemas con android-ffmpeg en Android Lollipop
- El comando de cambio de velocidad falla cuando el flujo de audio no está presente en el video - ffmpeg
- FFMPEG Fade in y Fade out para superposición
- Moov átomo en android MeidaRecorder datos registrados
- Combinar dos archivos .m4a o convertir archivos .wav a m4a
- Cómo combinar múltiples archivos .mp4 en .mp4 simple ffmpeg android
- ¿Hay alguna manera de hacer compresión de imágenes y ahorrar más rápido en Android?
- ¿Qué carga de formato h.264 en android y IOS?
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)
- ¿Cómo obtener un volcado de pila más largo (lápida) desde android?
- Actualización de mi sección "Novedades" de google play