Build FFMPEG trong android.
Bài đăng này đã không được cập nhật trong 9 năm
I. FFMPEG dùng để làm gì
FFmpeg là một nền tảng mã nguồn mở để ghi âm, chuyển đổi, chơi và streaming video và âm thanh. Nó bao gồm libavcodec, một video / audio codec phổ biến.Một vài ứng dụng Android phổ biến đều được xây dựng dựa trên FFmpeg, bao gồm cả RockPlayer, MoboPlayer, acrMedia, vitalPlayer, V-Cut Express vv Nếu bạn đang phát triển các ứng dụng đa phương tiện mà cần một video / audio codec, ffmpeg là một lựa chọn tốt.
II.Làm thế nào để build FFMPEG
**1. Các tool cần thiết: **
_Android NDK: https://developer.android.com/tools/sdk/ndk/index.htm
_Android SDK: https://developer.android.com/sdk/index.html
_FFMPEG source: https://www.ffmpeg.org/download.html
Sao chép và dán các tập lệnh bash dưới đây vào một trình soạn thảo văn bản, và lưu nó tạo thành file build_android.sh dưới ffmpeg thư mục.
2. Confix file build
!/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/android-ndk-r5b
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
function build_one
{
./configure --target-os=linux \
--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-shared \
--enable-static \
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
--disable-everything \
--enable-demuxer=mov \
--enable-demuxer=h264 \
--disable-ffplay \
--enable-protocol=file \
--enable-avformat \
--enable-avcodec \
--enable-decoder=rawvideo \
--enable-decoder=mjpeg \
--enable-decoder=h263 \
--enable-decoder=mpeg4 \
--enable-decoder=h264 \
--enable-parser=h264 \
--disable-network \
--enable-zlib \
--disable-avfilter \
--disable-avdevice \
$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
Note: chỉnh sửa các đường dẫn sau:
NDK=<path trên máy>
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/<platform system>-x86_64
Một khi các tập tin được lưu, hãy chắc chắn rằng file script được thực thi theo lệnh dưới đây:
**sudo chmod + x build_android.sh**_
Sau đó thực hiện lệnh:
** ./build_android.sh**_
3. Xây dựng Output
Việc xây dựng có thể mất một thời gian để hoàn thành tùy thuộc vào tốc độ máy tính của bạn. Một khi nó được thực hiện, bạn sẽ có thể tìm thấy một thư mục $ NDK/source/ffmpeg/android, trong đó có arm/lib và arm/ include:
_Arm/lib chứa các thư viện chia sẻ, trong khi thư mục arm/include chứa các tập tin tiêu đề cho libavcodec, libavformat, libavfilter, libavutil, libswscale vv
_Lưu ý rằng thư mục arm / lib chứa cả các tập tin thư viện (ví dụ: libavcodec-55.so) và các liên kết tượng trưng (ví dụ: libavcodec.so) cho họ. Chúng ta có thể loại bỏ các liên kết tượng trưng để tránh nhầm lẫn.
4. Làm cho thư viện ffmpeg có sẵn cho các dự án của bạn
Bây giờ chúng tôi đã biên soạn các thư viện ffmpeg và sẵn sàng để sử dụng chúng. Android NDK cho phép chúng ta tái sử dụng một mô-đun được biên dịch thông qua việc include-module xây dựng lệnh.
_Lý do tôi xây dựng mã nguồn ffmpeg của chúng tôi trong thư mục $ NDK / source vì ndk_build hệ thống sẽ tìm kiếm các thư mục dưới con đường này cho các mô-đun bên ngoài tự động. Để khai báo các thư viện ffmpeg là module tái sử dụng, chúng ta sẽ cần phải thêm một tập tin có tên là $ NDK /source/ ffmpeg-version/android/armv/ Android.mk với các nội dung sau đây,
LOCAL_PATH: = $ (calll-my-dir)
include $ (CLEAR_VARS)
LOCAL_MODULE: = libavcodec
LOCAL_SRC_FILES: = lib / libavcodec-55.so
LOCAL_EXPORT_C_INCLUDES: = $ (LOCAL_PATH) / include
include $ (PREBUILT_SHARED_LIBRARY)
include $ (CLEAR_VARS)
LOCAL_MODULE: = libavformat
LOCAL_SRC_FILES: = lib / libavformat-55.so
LOCAL_EXPORT_C_INCLUDES: = $ (LOCAL_PATH) / include
include $ (PREBUILT_SHARED_LIBRARY)
include $ (CLEAR_VARS)
LOCAL_MODULE: = libswscale
LOCAL_SRC_FILES: = lib / libswscale-2.so
LOCAL_EXPORT_C_INCLUDES: = $ (LOCAL_PATH) / include
include $ (PREBUILT_SHARED_LIBRARY)
include $ (CLEAR_VARS)
LOCAL_MODULE: = libavutil
LOCAL_SRC_FILES: = lib / libavutil-52.so
LOCAL_EXPORT_C_INCLUDES: = $ (LOCAL_PATH) / include
include $ (PREBUILT_SHARED_LIBRARY)
include $ (CLEAR_VARS)
LOCAL_MODULE: = libavfilter
LOCAL_SRC_FILES: = lib / libavfilter-3.so
LOCAL_EXPORT_C_INCLUDES: = $ (LOCAL_PATH) / include
include $ (PREBUILT_SHARED_LIBRARY)
include $ (CLEAR_VARS)
LOCAL_MODULE: = libwsresample
LOCAL_SRC_FILES: = lib / libswresample-0.so
LOCAL_EXPORT_C_INCLUDES: = $ (LOCAL_PATH) / include
include $ (PREBUILT_SHARED_LIBRARY)
Dưới đây là một ví dụ về cách chúng ta có thể sử dụng các thư viện trong JNI file / Android.mk của một dự án Android native: LOCAL_PATH: = $ (call-my-dir)
include $ (CLEAR_VARS)
LOCAL_MODULE: = tutorial03
LOCAL_SRC_FILES: = tutorial03.c
LOCAL_LDLIBS: = -llog -ljnigraphics -lz -landroid
LOCAL_SHARED_LIBRARIES: = libavformat libavcodec libswscale libavutil
include $ (BUILD_SHARED_LIBRARY)
$ (call-module, ffmpeg/android/arm)
_Lưu ý rằng chúng tôi gọi là call mô-đun với đường dẫn tương đối so với $NDK/source cho việc xây dựng hệ thống để xác định vị trí các thư viện ffmpeg thể tái sử dụng.
All rights reserved