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.