我使用以下从Telegram改编的构建脚本编译了最新的ffmpeg源代码:
#!/bin/bash
#apply fix http://permalink.gmane.org/gmane.comp.video.ffmpeg.devel/203198
function build_one {
echo "Cleaning..."
make clean
echo "Configuring..."
./configure \
--cc=$CC \
--nm=$NM \
--enable-stripping \
--arch=$ARCH \
--cpu=$CPU \
--target-os=linux \
--enable-cross-compile \
--yasmexe=$NDK/prebuilt/darwin-x86_64/bin/yasm \
--prefix=$PREFIX \
--enable-pic \
--disable-shared \
--enable-static \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$PLATFORM \
--extra-cflags="-Os -DANDROID $OPTIMIZE_CFLAGS -fPIE -pie --static" \
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl" \
--extra-libs="-lgcc" \
\
--enable-version3 \
--enable-gpl \
\
--disable-doc \
--disable-avx \
\
--disable-everything \
--disable-network \
--disable-zlib \
--disable-debug \
--disable-programs \
--disable-network \
\
--enable-pthreads \
--enable-protocol=file \
--enable-decoder=h264 \
--enable-decoder=gif \
--enable-demuxer=mov \
--enable-demuxer=gif \
--enable-hwaccels \
--enable-runtime-cpudetect \
--enable-asm \
$ADDITIONAL_CONFIGURE_FLAG
#echo "continue?"
#read
make -j8 install
}
NDK=~/Downloads/android-ndk-r12b/
#arm platform
PLATFORM=$NDK/platforms/android-9/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
LD=$PREBUILT/bin/arm-linux-androideabi-ld
AR=$PREBUILT/bin/arm-linux-androideabi-ar
NM=$PREBUILT/bin/arm-linux-androideabi-nm
GCCLIB=$PREBUILT/lib/gcc/arm-linux-androideabi/4.9/libgcc.a
ARCH=arm
CC=$PREBUILT/bin/arm-linux-androideabi-gcc
CROSS_PREFIX=$PREBUILT/bin/arm-linux-androideabi-
#arm v5
CPU=armv5te
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG="--disable-armv6 --disable-armv6t2 --disable-vfp --disable-neon"
build_one
#arm v7n
CPU=armv7-a
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=--enable-neon
build_one
#x86 platform
PLATFORM=$NDK/platforms/android-9/arch-x86
PREBUILT=$NDK/toolchains/x86-4.9/prebuilt/darwin-x86_64
LD=$PREBUILT/bin/i686-linux-android-ld
AR=$PREBUILT/bin/i686-linux-android-ar
NM=$PREBUILT/bin/i686-linux-android-nm
GCCLIB=$PREBUILT/lib/gcc/i686-linux-android/4.9/libgcc.a
ARCH=x86
CC=$PREBUILT/bin/i686-linux-android-gcc
CROSS_PREFIX=$PREBUILT/bin/i686-linux-android-
CPU=i686
OPTIMIZE_CFLAGS="-march=$CPU"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG="--disable-mmx --disable-yasm"
build_one
我将生成的android /文件夹的内容复制到jni / ffmpeg /。 然后我尝试做一个ndk-build,它因错误而失败。
Android.mk文件如下:
LOCAL_PATH := $(call my-dir)
LOCAL_MODULE := avutil
LOCAL_MODULE_FILENAME := libavutil
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_MODULE_FILENAME := libavformat
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_MODULE_FILENAME := libavcodec
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avdevice
LOCAL_MODULE_FILENAME := libavdevice
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavdevice.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avfilter
LOCAL_MODULE_FILENAME := libavfilter
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := postproc
LOCAL_MODULE_FILENAME := libpostproc
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libpostproc.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swresample
LOCAL_MODULE_FILENAME := libswresample
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libswresample.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_MODULE_FILENAME := libswscale
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/lib/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := ffmpeg
LOCAL_CFLAGS := -w -std=c11 -Os -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno
LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math -D__STDC_CONSTANT_MACROS
LOCAL_CPPFLAGS := -DBSD=1 -ffast-math -Os -funroll-loops -std=c++11
LOCAL_LDLIBS := -ljnigraphics -llog -lz -latomic
LOCAL_STATIC_LIBRARIES := avformat avcodec avutil avfilter avdevice postproc swresample swscale
LOCAL_SRC_FILES := ffmpeg.c
include $(BUILD_SHARED_LIBRARY)
抛出的错误是:
[armeabi-v7a]编译拇指:ffmpeg< = ffmpeg.c /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s: 汇编程序消息: /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4421: 错误:错误指令
cmovg r3,r8' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4422: Error: bad instruction
cmovg r2,r3' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4424: 错误:错误指令cmovl r1,r3' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4426: Error: bad instruction
cmovg r3,r8'制作:*** [路径/到/应用程序/ OBJ /本地/ armeabi-V7A / OBJ文件/ FFMPEG / ffmpeg.o] 错误1
我猜我在某处弄错了编译器。我正在尝试在Mac上构建。有什么我想念的吗?我正在尝试仅为armeabi-v7a构建。
答案 0 :(得分:1)
您需要包含本地c文件和Config.h文件
像这样。LOCAL_PATH := $(call my-dir)
LOCAL_MODULE := libavcodec
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavfilter
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavformat
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavutil
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libswscale
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_C_INCLUDES := ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp
LOCAL_SRC_FILES := ../obj/local/$(TARGET_ARCH_ABI)/lib/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true
LOCAL_LDLIBS := -llog -landroid -lz -lm
LOCAL_CFLAGS := -Os -ffunction-sections -fdata-sections -fvisibility=hidden -flto
LOCAL_LDFLAGS := -Wl,--gc-sections,--icf=safe
LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp
LOCAL_STATIC_LIBRARIES := libavfilter libavformat libavcodec libswscale libavutil
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg
LOCAL_C_INCLUDES += ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)-config
LOCAL_SRC_FILES := ffmpeg/ffmpeg.c ffmpeg/cmdutils.c ffmpeg/ffmpeg_filter.c ffmpeg/ffmpeg_opt.c
LOCAL_MODULE := videokit
include $(BUILD_SHARED_LIBRARY)