2012-06-05 49 views
7

Tôi đang cố gắng xây dựng thư viện FFMPEG cho ứng dụng Android của mình bằng NDK. Tôi đã tải về mã nguồn từ trang web của nó và tôi nghĩ rằng tôi xây dựng nó (đó là thử đầu tiên của tôi làm việc với NDK và ffmpeg). Tôi đã tạo một tệp build.sh mà tôi đang sử dụng để thực thi nó từ dòng lệnh trên Mac OS X. Nhưng tôi có một vài câu hỏi ...Android NDK & FFMPEG xây dựng

Điều đầu tiên là tôi biết mình cần tệp Android.mk để tôi có thể sử dụng thư viện được xây dựng trong ứng dụng của tôi, nhưng tôi không biết làm thế nào để làm điều đó vì những lý do mà tôi đã nói với bạn ở trên. Sau khi tôi chạy build.sh tôi nhận được android thư mục với một vài thư mục và một số thư viện. Vì vậy, câu hỏi đầu tiên của tôi là, làm thế nào tôi có thể xây dựng các tập tin Android.mk mà tôi cần ... và có lẽ nếu ai đó có thể giải thích cho tôi lý do tại sao tôi cần nó.

enter image description here

câu hỏi thứ hai của tôi là tôi cần một số thư viện từ ffmpeg để có thể sử dụng chúng từ ứng dụng của tôi, nhưng sau khi xây dựng tôi không thể nhìn thấy chúng trong cây nguồn của tôi. Tôi biết rằng tôi phải kích hoạt chúng trong số build.sh và tôi nghĩ rằng tôi đã làm, nhưng tôi không thể nhìn thấy chúng. Vì vậy, bất kỳ loại thông tin nào về tệp xây dựng của tôi sẽ hữu ích cho tôi để hiểu cách định cấu hình tệp. Sau đây là cách nó trông giống như:

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

Thanks cho bất kỳ loại thông tin/ý kiến ​​/ ví dụ hữu ích và vv

Trả lời

5

Trước hết, bạn nên đọc tài liệu dành cho Android NDK và kiểm tra một số mẫu ứng dụng. Bạn sẽ tìm thấy các chi tiết này trong android_NDK_home/docs và android_NDK_home/samples (trong đó android_NDK_home là tên thư mục cho NDK android của bạn).

Ngoài ra, kiểm tra liên kết này trên stackoverflow: Using FFmpeg with Android-NDK

Đối với một stept bước hướng dẫn, đây là một khá tốt một: http://www.roman10.net/how-to-build-ffmpeg-for-android/

Ngoài ra, bạn sẽ phải cài đặt/cấu hình một số yếu tố trên Eclipse của bạn để cho phép hỗ trợ phát triển các ứng dụng được xây dựng với NDK: http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/ http://wiki.eclipse.org/Sequoyah/ndk_checklist

Và một phần mềm khá tốt ct đó sử dụng thư viện ffmpeg: https://github.com/havlenapetr/FFMpeg

+0

sẽ này cũng làm việc nếu tôi biên dịch nó trong Ubuntu 12.10 máy 64-bit? Và với NDK mới nhất? – agony

+0

Tôi rất tiếc, tôi không biết, chỉ sử dụng Mac. Nhưng tôi không thấy lý do nào tại sao nó không hoạt động trên Ubuntu – bogdan

+0

@bogdan cách sử dụng để nén video https://github.com/havlenapetr/FFMpeg –

11

tôi đã thực hiện một hướng dẫn về cách xây dựng ffmpegx264 cho android: zip with build of ffmpeg with x264

Bạn cũng có thể tải file zip có chứa các tập tin bạn cần phải thực hiện một ứng dụng trên android.

+0

Url tải xuống của bạn đã bị chặn, vui lòng cung cấp bất kỳ hỗ trợ nào khác trên cùng một số. –

+0

Vẫn đang hoạt động url. – Estevex

+1

@Estevex Url không hoạt động Tôi đã thử – Nisarg

9

Nếu bạn muốn hướng dẫn chi tiết hơn về cách xây dựng ffmpeg và làm thế nào để sử dụng nó để xây dựng ứng dụng Android, vui lòng tham khảo các cuốn sách Android NDK sách dạy nấu ăn: http://www.packtpub.com/android-native-development-kit-cookbook/book

Các Bonus Chương 1 được dành để phát triển ứng dụng đa phương tiện với Android NDK và ffmpeg và có sẵn miễn phí tại http://www.packtpub.com/sites/default/files/downloads/Developing_Multimedia_Applications_with_NDK.pdf

1

ffmpeg sử dụng autoconf làm hệ thống xây dựng. Tính đến thời điểm viết bài này, chưa có ai đưa ra một gói xây dựng Gradle cho ffmpeg trên Android.Theo như tôi có thể nói, Gradle vẫn chưa hỗ trợ autoconf, điều này làm cho nó khá khó khăn để làm như vậy

Điều đó nói rằng, sau khi thử một số hướng dẫn đã xuất hiện ở đó, cũng như một số hướng dẫn trước các gói, chúng tôi đã quyết định cuộn trình bao bọc tập lệnh Android build của riêng mình cho ffmpeg bao gồm hỗ trợ cho OpenSSLlibrtmp.

Bạn có thể tìm thấy nó ở đây: https://github.com/cine-io/android-ffmpeg-with-rtmp

Điều kiện tiên quyết: Các Android NDK phải được cài đặt

Hướng dẫn:

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

Khi kịch bản được hoàn tất, các thư viện chia sẻ cần thiết và ffmpeg thực thi sẽ được đưa vào thư mục build/dist. Bạn có thể đưa chúng vào dự án của bạn giống như bất kỳ nhị phân gốc nào khác.

+0

Tôi rất vui khi thấy rằng điều này có thể thực sự công việc, nhưng sau đó tôi nhận được một lỗi.Điều này có nghĩa vụ phải làm việc khi xây dựng trên một mac? Console có điểm mà nó nói "Không thể cấu hình ffmpeg!" Và build.log nói, "LRI: librtmp không tìm thấy". Ý tưởng nào? – bracken

0

Xây dựng thực thi ffmpeg, tôi sử dụng sau 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) 
Các vấn đề liên quan