下载准备
(以linux
ubuntu
系统为例)
1.下载并解压NDK
#下载NDK for Linux
wget https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip
#解压
unzip android-ndk-r17b
2.下载并解压 ffmpeg:
#下载ffmpeg for Linux
wget https://ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2
#解压
tar xvf ffmpeg-4.0.2.tar.bz2
配置和编写编译脚本
1. 移动并修改文件和目录名(这一步不是必须的,根据自己习惯修改,后面配置要设置路径的时候会用到下载的这些目录)
/root下
ndk路径: /root/ndk-17
ffmpeg路径: /root/ffmpeg/ffmpeg
2. 配置一些环境变量:
vi /etc/profile
打开profile文件 加入 export NDK_ROOT=/root/ndk-17
注意,这里等于号左右一定不要加空格,不然你会很吐血的
3.编写编译脚本(我的编译脚本是/root/ffmpeg/ffmpeg.sh):
cd /root/ffmpeg
vim ffmpeg.sh
#!/bin/bash
#需要先进入到ffmpeg的安装目录下
cd ./ffmpeg
#设置一些环境变量
CPU=arm-linux-androideabi
TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/linux-x86_64#从as的 externalNativeBuild/xxx/build.ninja
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"
#此变量用于编译完成之后的库与头文件存放在哪个目录
PREFIX=../android/armeabi-v7a-xx
#执行configure脚本,用于生成makefile
#--prefix : 安装目录
#--enable-small : 优化大小
#--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。
#--disable-avdevice : 关闭avdevice模块,此模块在android中无用
#--disable-encoders : 关闭所有编码器 (播放不需要编码)
#--disable-muxers : 关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭
#--disable-filters :关闭视频滤镜
#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )
#--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-#disable-shared enable-static 不写也可以,默认就是这样的。
#--sysroot:
#--extra-cflags: 会传给gcc的参数
#--arch --target-os : 不给不行,为什么给这些值,见视频
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot" \
--arch=arm \
--target-os=android
# 清理一下
make clean
#执行
makefilemake install
4.编译成功后,在 /root/ffmpeg/android/armeabi-v7a-xx目录下,将 include 和lib 两个文件夹拿出来就可以在android项目使用啦。
chmod +x ffmpeg.sh
sh ffmpeg.sh
Android项目中的使用说明:
我的库文件和头文件的摆放目录,供大家参考对应 CMakeLists.txt中的配置
include下的文件拷入 app/src/main/cpp/include 下
lib下的文件拷入 app/src/main/cpp/lib/armeabi-v7a我自己的cpp文件目录:src/main/cpp/native-lib.cpp
CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
file(GLOB soure_file src/main/cpp/*.cpp)
add_library(
native-lib
SHARED
${soure_file} )
include_directories(src/main/cpp/include)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/cpp/lib/${ANDROID_ABI}")
#avfilter avformat avcodec avutil swresample swscale
target_link_libraries( native-lib
avformat avcodec avfilter avutil swresample swscale
log z android)