2012-06-05 95 views
7

我想为我的android应用程序使用NDK构建FFMPEG库。我已经从它的网站上下载了源代码,我认为我建立了它(这是我第一次尝试使用NDK和ffmpeg)。我创建了一个build.sh文件,我正在使用它从Mac OS X上的命令行执行它。但我有几个问题...Android NDK和FFMPEG构建

第一件事是因为我知道我需要Android.mk文件,所以我可以在我的应用程序中使用建成的图书馆,但由于我上面告诉你的原因,我不知道该怎么做。运行我的build.sh后,我得到android文件夹,其中包含几个文件夹和一些库。所以我的第一个问题是,我如何构建我需要的Android.mk文件......也许如果有人能解释我为什么需要它。

enter image description here

我的第二个问题是我需要的ffmpeg一些库能够从我的应用程序使用它们,但在构建后,我无法看到他们在我的源代码树。我知道我必须在我的build.sh中启用它们,我想我已经这样做了,但我看不到它们。因此,任何有关我的构建文件的信息都将有助于我理解如何配置它。 这里是如何看起来像:

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

感谢任何有用的信息/建议/实例等

回答

5

首先,你应该读为Android NDK的文档,并检查了一些样本应用。您将在android_NDK_home/docs和android_NDK_home/samples(其中android_NDK_home是您的android NDK的文件夹名称)中找到这些详细信息。

同时,检查计算器此链接: Using FFmpeg with Android-NDK

对于教程一步一个扑进,这是一个相当不错的: http://www.roman10.net/how-to-build-ffmpeg-for-android/

而且,你必须安装/配置一些元素在您的Eclipse启用开发与NDK构建的应用程序支持: http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/ http://wiki.eclipse.org/Sequoyah/ndk_checklist

而且一个相当不错的幻灯一个使用的ffmpeg库克拉: https://github.com/havlenapetr/FFMpeg

+0

会,如果我编译它在Ubuntu 12.10 64位的机器,这也工作?和最新的NDK? – agony

+0

我很抱歉的痛苦,我不知道,只使用Mac。但我看不出有任何理由不应该在Ubuntu – bogdan

+0

工作@bogdan如何使用这个压缩视频https://github.com/havlenapetr/FFMpeg –

11

我就如何建立ffmpegx264android教程: zip with build of ffmpeg with x264

您也可以下载一个包含你需要在提出申请的文件的zip文件android

+0

您的下载网址已被封锁,请提供同任何其他援助。 –

+0

仍在工作的URL。 – Estevex

+1

@Estevex网址不工作我试图 – Nisarg

1

ffmpeg的使用autoconf作为其构建系统。截至撰写本文时,还没有人为Android上的ffmpeg编写一个Gradle构建包。据我所知,Gradle还不支持autoconf,这使得它很难这样做

这就是说,在尝试了几个教程后,以及一些预建包,我们决定推出自己的Android编译脚本包装ffmpeg的,其中包括对OpenSSLlibrtmp支持。

你可以在这里找到:https://github.com/cine-io/android-ffmpeg-with-rtmp

先决条件:Android NDK必须安装

说明:

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

当脚本完成后,所需的共享库和ffmpeg可执行文件将被放入build/dist目录。您可以像其他任何本地二进制文件一样将它们包含在项目中。

+0

我很兴奋地看到,这实际上可能?工作,但后来我得到一个错误难道这在Mac上进行构建工作控制台得到它说:“无法配置的ffmpeg!”点和build.log说,“ERROR:librtmp未找到”。有任何想法吗? – bracken

0

要建立ffmpeg的可执行文件,我用下面的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)