Android 环境下编译FFmpeg
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的更多相关文章
- 在高通平台Android环境下编译内核模块【转】
本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei ...
- 在Windows下编译ffmpeg完全手册
本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...
- 在Windows下编译FFmpeg详细说明
MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...
- [转]在Windows下编译ffmpeg完全手册
本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...
- Linux下编译ffmpeg并用GDB调试
1.在Ubuntu界面上调处命令行界面,最方便的方式是使用快捷键Ctrl+Alt+T. 2.安装SDL SDL是一个开源的多媒体开发库,可以设置图像和视频的绘制等操作.如果不安装SDL,FFMPEG将 ...
- ffmpeg windows下编译ffmpeg
windows下编译ffmpeg 今天由于工作需求需重新编译ffmpeg,百度,goole了一大堆,看眼花缭乱的,但几乎都是三种方案,大部分都是直接转发,一字不漏,错误的缺文件的还是照转,可是问题都大 ...
- linux下编译ffmpeg 引入外部库x264
Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure ...
- VoIP应用在Ubuntu 14.04下编译FFmpeg libX264及PJSIP
PJSIP是一个开源的SIP协议栈.它支持多种SIP的扩展功能,可说算是最目前流行的SIP协议栈之一了. 它实现了SIP.SDP.RTP.STUN.TURN和ICE.PJSIP作为基于SIP的一个多 ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
随机推荐
- 转:100个高质量Java开发者博客
原文来自于:http://www.importnew.com/7469.html ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博客,然后不段补充到这个列表.欢 ...
- BZOJ 1025 游戏
Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...
- zz将 VSTO 插件部署给所有用户
原文:zz将 VSTO 插件部署给所有用户 注:本文原作者 Misha Shneerson 是 VSTO 团队的工程师.原文可以在下列地址找到:http://blogs.msdn.com/mshnee ...
- MySql的卸载问题
windows下mysql的卸载: 彻底卸载Mysql的方法: (1),先在服务(开始——>控制面板——>管理工具——>服务)里停掉MySQL的服务.打开控制面板-添加删除程序, ...
- COJ 0288 路径(2015升级版)
路径(2015升级版) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ在生日当天决定在他的领地举行一场马拉松比赛,他的 ...
- ZOJ 3469 Food Delivery
题目大意: 有n个人,住在一条直线上.第i个人的坐标是Xi,街上有个外卖餐馆的位置是X,现在餐厅工作人员要给街上的每个人送饭,送完之后再回到餐厅,送饭人的速度是V,每个人有个不满意值,当这个人送餐时间 ...
- gif动画问题
iOS没有自带支持显示gif动画的功能, 用UIImageView的animationImage虽然可以实现图片动画, 当毕竟不方便. http://blog.stijnspijker.nl/200 ...
- 【转】Android的onCreateOptionsMenu()创建菜单Menu详解
原文网址:http://www.linuxidc.com/Linux/2012-02/55500.htm Android一共有三种形式的菜单: 1.选项菜单(optinosMen ...
- Jump Game —— LeetCode
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 解决android启动程序时,会出现一个短暂的白色空白界面的问题
在启动的activity定义style为透明就可以了(android:theme="@android:style/Theme.Translucent")