Android 环境下编译FFmpeg

开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e

一 、X264 编译

1、    X264源码下载

git clone git://git.videolan.org/x264.git

2、    环境配置

在X264根目录下创建文件config.sh 内容如下

#!/bin/sh

ANDROID_NDK_ROOT=$NDK_HOME

PREBUILT=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86

PLATFORM=$ANDROID_NDK_ROOT/platforms/android-9/arch-arm

ARM_INC=$PLATFORM/usr/include

ARM_LIB=$PLATFORM/usr/lib

ARM_LIBO=$PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3

./configure --disable-gpac --enable-pic --enable-strip \

--extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__  -Wno-psabi -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID  -Wa,--noexecstack -MMD -MP " \

--extra-ldflags="-nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc" \

--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \

--host=arm-linux \

--enable-static \

--prefix='dist'

运行config.sh文件

配置关键点1:指定使用的交叉编译的编译器、链接的头文件及类库所在

配置关键点2:-march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ ,此处,针对armv7-a的CPU打开了NEON的优化运行指令。

配置关键点3:去掉--disable-asm选项。该选项的意思就是禁止neon的指令。

配置关键点4:添加--enable-static选项,生成静态链接的库供程序开发使用

3、    编译

直接:make

然后:make install

说明:ffmpeg不支持H264编码,这里要添加X264库,来支持H264编码

 

         参考:http://www.2cto.com/kf/201303/194658.html

二 、fdk-aac 编译

1、  fdk-aac下载

a)         http://sourceforge.net/projects/opencore-amr/files/fdk-aac/

b)         fdk-aac-0.1.2.tar.gz

2、  fdk-aac 编译环境配置

a)         解压,在fdk-aac跟目录下创建config.sh文件内容如下

#!/bin/sh

ANDROID_API=android-9

SYSROOT=$NDK_HOME/platforms/$ANDROID_API/arch-arm

ANDROID_BIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/

CROSS_COMPILE=${ANDROID_BIN}/arm-linux-androideabi-

#export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

ARM_INC=$SYSROOT/usr/include

ARM_LIB=$SYSROOT/usr/lib

LDFLAGS=" -nostdlib -Bdynamic -Wl,--whole-archive -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$NDK_HOME/sources/cxx-stl/gnu-libstdc++/libs/armeabi -L$NDK_HOME/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/lib -L$ARM_LIB  -lc -lgcc -lm -ldl  "

FLAGS="--host=arm-androideabi-linux --enable-static --disable-shared"

export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"

export LDFLAGS="$LDFLAGS"

export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"

./configure $FLAGS \

--prefix='/home/zhangcb/works/mediaeffectplayer/android/fdk-aac-0.1.2/dist'

运行config.sh文件

3、  编译

直接:make

然后:make install

说明:

FFmpeg从2.0开始自带的AAC编码

需要的格式是sample_fmts = AV_SAMPLE_FMT_FLTP,不符合android音频的格式

(AV_SAMPLE_FMT_S8, AV_SAMPLE_FMT_S16),所有我们用ffmpeg录制的时候需要用

外部扩展的第三方库文件来编码,这里综合考虑用fdk-aac来编码

 

参考:https://trac.ffmpeg.org/wiki/AACEncodingGuide

 

三 、ffmpeg 编码

1.       Ffmpeg 下载

a)         http://www.ffmpeg.org/download.html 下载地址

b)         下载最新的ffmpeg-2.0.1.tar.gz

2.       在ffmpeg中添加Android编译文件

1)       在ffmpeg目录下添加文件av.mk 内容如下:

# LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale

#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak

include $(LOCAL_PATH)/../config.mak

OBJS :=

OBJS-yes :=

MMX-OBJS-yes :=

include $(LOCAL_PATH)/Makefile

# collect objects

OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)

OBJS += $(OBJS-yes)

FFNAME := lib$(NAME)

FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))

FFCFLAGS  = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign

FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"

ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)

ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))

ifneq ($(ALL_S_FILES),)

ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))

C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))

S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))

else

C_OBJS := $(OBJS)

S_OBJS :=

endif

C_FILES := $(patsubst %.o,%.c,$(C_OBJS))

S_FILES := $(patsubst %.o,%.S,$(S_OBJS))

FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))

2)       分别修改

libavdevice libpostproc libavfilter libavformat libswresample libavresample libswscale libavcodec libavutil 下的Makefile 文件

把下面一句删除

include $(SUBDIR)../config.mak

3)    在ffmpeg目录下,创建Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#begin package so file

LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libswscale libavfilter libpostproc libswresample libavdevice

LOCAL_MODULE := ffmpeg

LOCAL_LDLIBS := -lz

LOCAL_LDFLAGS += $(X264_HOME)/dist/lib/libx264.a -O2 #引用外部静态库

LOCAL_LDFLAGS += $(AAC_HOME)/dist/lib/libfdk-aac.a -O2

include $(BUILD_SHARED_LIBRARY)

#end package

include $(call all-makefiles-under,$(LOCAL_PATH))

创建libavformat/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES := $(FFFILES)

LOCAL_C_INCLUDES :=             \

$(LOCAL_PATH)           \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

创建libavcodec/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES := $(FFFILES)

LOCAL_C_INCLUDES :=             \

$(LOCAL_PATH)           \

$(LOCAL_PATH)/arm       \

$(LOCAL_PATH)/..    \

$(X264_HOME)/dist/include \

$(AAC_HOME)/dist/include

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_LDFLAGS += $(X264_HOME)/dist/lib/libx264.a -O2

LOCAL_LDFLAGS += $(AAC_HOME)/dist/lib/libfdk-aac.a -O2

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

分别创建libpostproc libavfilter libswresample libavresample libswscale libavutil

下的Android.mk内容如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES := $(FFFILES)

LOCAL_C_INCLUDES :=             \

$(LOCAL_PATH)           \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

回到 jni 目录 添加文件Android.mk

PROJECT_PATH = $(shell pwd)

X264_HOME = $(PROJECT_PATH)/../x264

AAC_HOME = $(PROJECT_PATH)/../fdk-aac-0.1.2

include $(all-subdir-makefiles)

4)

3.       编码环境配置

在ffmpeg目录下创建config.sh文件内容如下

#!/bin/bash

PROJECT_PATH=/home/zhangcb/works/mediaeffectplayer/android/CmmobiVideo

ANDROID_NDK_ROOT=$NDK_HOME

PREBUILT=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86

PLATFORM=$ANDROID_NDK_ROOT/platforms/android-9/arch-arm

ARM_LIBO=$PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3

X264_HOME=$PROJECT_PATH/../x264

AAC_HOME=$PROJECT_PATH/../fdk-aac-0.1.2

./configure --target-os=linux \

--arch=arm \

--enable-version3 \

--enable-gpl \

--enable-nonfree \

--disable-shared \

--disable-stripping \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffserver \

--disable-ffprobe \

--disable-protocols \

--enable-protocol=file \

--enable-protocol=udp \

--enable-protocol=tcp \

--enable-protocol=http \

--enable-network \

--enable-encoders \

--enable-decoders \

--enable-muxers \

--disable-avdevice \

--disable-indevs \

--disable-filters \

--disable-devices \

--disable-parsers \

--disable-postproc \

--disable-debug \

--enable-cross-compile \

--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \

--extra-cflags=" -fPIC -DANDROID -I$PLATFORM/usr/include -I$X264_HOME/dist/include -I$AAC_HOME/dist/include" \

--disable-asm \

--disable-yasm \

--enable-libx264 \

--enable-libfdk-aac \

--enable-neon \

--enable-armv5te \

--sysinclude=$PLATFORM/usr/include \

--extra-ldflags="-Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -L$ARM_LIBO -lc -lm -ldl -lgcc -L$X264_HOME/dist/lib -L$AAC_HOME/dist/lib" \

--extra-libs="-lgcc" \

sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h

sed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h

sed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h

sed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h

sed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h

sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h

sed -i 's/restrict restrict/restrict/g' config.h

sed -i 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h

sed -i 's/HAVE_CBRTF 0/HAVE_CBRTF 1/g' config.h

sed -i 's/HAVE_ISINF 0/HAVE_ISINF 1/g' config.h

sed -i 's/HAVE_ISNAN 0/HAVE_ISNAN 1/g' config.h

sed -i 's/HAVE_SINF 0/HAVE_SINF 1/g' config.h

sed -i 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h

运行config.sh生产文件

打开 libavutil/parseutils.h,把 #include <time.h> 替换为 #include <sys/../time.h> 不然会报错

4.       Ffmpeg编码

运行:ndk-build 生成文件

libavcodec.a   libavfilter.a  libavutil.a  libpostproc.a  libswresample.a

libavdevice.a  libavformat.a   libswscale.a

参考:http://blog.csdn.net/dyllove98/article/details/9043493

http://www.360doc.com/content/10/1213/15/4914074_77710982.shtml#

Android 环境下编译FFmpeg的更多相关文章

  1. 在高通平台Android环境下编译内核模块【转】

    本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei ...

  2. 在Windows下编译ffmpeg完全手册

    本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...

  3. 在Windows下编译FFmpeg详细说明

    MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...

  4. [转]在Windows下编译ffmpeg完全手册

    本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...

  5. Linux下编译ffmpeg并用GDB调试

    1.在Ubuntu界面上调处命令行界面,最方便的方式是使用快捷键Ctrl+Alt+T. 2.安装SDL SDL是一个开源的多媒体开发库,可以设置图像和视频的绘制等操作.如果不安装SDL,FFMPEG将 ...

  6. ffmpeg windows下编译ffmpeg

    windows下编译ffmpeg 今天由于工作需求需重新编译ffmpeg,百度,goole了一大堆,看眼花缭乱的,但几乎都是三种方案,大部分都是直接转发,一字不漏,错误的缺文件的还是照转,可是问题都大 ...

  7. linux下编译ffmpeg 引入外部库x264

    Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure ...

  8. VoIP应用在Ubuntu 14.04下编译FFmpeg libX264及PJSIP

    PJSIP是一个开源的SIP协议栈.它支持多种SIP的扩展功能,可说算是最目前流行的SIP协议栈之一了.  它实现了SIP.SDP.RTP.STUN.TURN和ICE.PJSIP作为基于SIP的一个多 ...

  9. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

随机推荐

  1. ural1057Amount of Degrees

    Description Create a code to determine the amount of integers, lying in the set [ X; Y] and being a ...

  2. JavaScript Client-Side

    JavaScript Client-Side GET, POST Events, Elements Template, Event, Data(MVC) XMLHttpRequest Logic (f ...

  3. GIT,VAGRANT及COREOS

    搞了COREOS才高大上啊. 测试DOCKER安装. 就是WIN下面GIT显得土豪..

  4. 【HDOJ】3345 War Chess

    简单BFS.注意最后一组数据,每个初始点不考虑周围是否有敌人. /* 3345 */ #include <iostream> #include <cstdio> #includ ...

  5. The Embarrassed Cryptographer(高精度取模+同余模定理)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11435   Accepted: 3040 Description The ...

  6. 「Poetize5」水叮当的舞步

    Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 地毯上 ...

  7. 字符串(后缀自动机):Codeforces Round #129 (Div. 1) E.Little Elephant and Strings

    E. Little Elephant and Strings time limit per test 3 seconds memory limit per test 256 megabytes inp ...

  8. Divide Two Integers —— LeetCode

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  9. Unity Dx9 Occlusion Query plugin

    //Occlusion Unity plugin #include "UnityPluginInterface.h" #include <math.h>#include ...

  10. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...