NDK R13:怎样编译FFMPEG?

NDK R13:怎样编译FFMPEG?

这篇文章主要描述怎样使用NDK R9编译ffmpeg(ffmpeg 2.0.1)

1、下载Android NDK
最新版的Android NDK可以在http://www.androiddevtools.cn下载。现在最新版的NDK为:R13b。

2、下载ffmpeg源码
FFMPEG源码的下载地址http://ffmpeg.org。目前最新稳定版为:ffmpeg-3.2.4。下载源码后解压到指定文件夹,稍后会使用到。

3、更新configure文件
使用文本编辑器打开ffmpeg-3.2.4/configure文件,找到下面内容所在行:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'

SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

修改为:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'

SLIB_INSTALL_LINKS='$(SLIBNAME)'

需要这样修改的原因是通过ffmpeg生成的共享库文件名格式是: libavcodec.so. (e.g. libavcodec.so.55) ,而在android系统中无法识别这样的共享库文件名,因此我们需要替换相应的配置生成类似libavcodec.so (e.g. libavcodec.so)的格式。

4、编译ffmpeg
复制下面的内容到文本编译器,然后保存为build_android.sh。
#!/bin/bash

NDK=$HOME/Desktop/adt/android-ndk-r13

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

function build_one
{
./configure 
--prefix=$PREFIX 

--enable-shared

--disable-static

--disable-doc

--disable-ffmpeg 
--disable-ffplay 

--disable-ffprobe

--disable-ffserver 
--disable-avdevice 
--disable-doc 
--disable-symver 
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- 
--target-os=linux 
--arch=arm 
--enable-cross-compile 
--sysroot=$SYSROOT 
--extra-cflags="-Os -fpic $ADDI_CFLAGS" 
--extra-ldflags="$ADDI_LDFLAGS" 
$ADDITIONAL_CONFIGURE_FLAG
make clean
make

make install

}
CPU=arm
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm"
build_one
注:这里生成的是动态库不是静态库,也没有针对特定的CPU进行优化。文件保存后,要保证 build_android.sh具有可执行权限:
sudo chmod +x build_android.sh
执行命令为:
./build_android.sh

5、编译输出
编译需要花费的时间依赖于计算机的运行速度,编译完成后,找到$NDK/sources/ffmpeg-3.2.4/android所在文件夹,将会看到arm/lib 和 arm/include 文件夹。
arm/lib文件夹包含库文件(e.g.: libavcodec-55.so) 和符号链接文件(e.g.: libavcodec.so) 两种文件,为了避免混淆,最好移除符号链接文件。

6、ffmpeg库在工程中的应用
编译成功ffmpeg库后,我们就要开始使用了。在Android NDK环境下,创建文件$NDK/sources/ffmpeg-3.2.4/android/arm/Android.mk,然后输入如下内容:
LOCAL_PATH:= $(call 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)

以上只是为了说明共享库在Android工程文件 jni/Android.mk 的使用,下面是关于输入模块路径的设置:
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 import-module,ffmpeg3.2.4/android/arm)

7、若还是不甚了了,请移步到https://github.com/roman10/android-ffmpeg-tutorial。

你可能感兴趣的:(视频)