第一步 下载FFmpeg源文件 2.6.9的版本
调用命令 wget http://ffmpeg.org/releases/ffmpeg-2.6.9.tar.gz
第二步 解压ffmpeg压缩包
tar -xzf ffmpeg-2.6.9.tar.gz
第三步 赋予权限ffmpeg-2.6.9文件夹可执行权限
chmod 777 -R ffmpeg-2.6.9
第四步 调用配置build_android.sh脚本文件来运行ffmpeg文件夹下的configure。
在configure文件 2775行
将该文件中的如下四行:
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)'
首先编写build_android.sh脚本文件
创建脚本文件
vim build_android.sh
在build_android.sh文件中编写如下代码
#!/bin/bash
make clean
export NDK=/NDK/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
代码中NDK变量是ndk的路径。
PREFIX变量代表的是编译生成的动态库存放的位置,即 当前目录/android/arm。
第五步 执行build_android.sh编译ffmpeg生成so库
shell命令
编译时间有点久可能会需要20分钟左右。
编译完成之后,我们会在android/arm目录下看到include文件夹和libs文件夹,他们分别存放的是so库对应的头文件和so动态库
第六步 将生成的android\arm\lib 下的八个so复制到 android工程的 libs\armeabi
libavcodec-56.so //编解码
libavdevice-56.so //硬件采集、加速、显示
libavformat-56.so //文件格式
libavutil-54.so //通用库
libpostproc-53.so //同步、时间计算的简单算法
libswresample-1.so //原始音频格式转码
libswscale-3.so //原始视频格式转换
libavfilter-5.so
然后将生成的android\arm\include里面的头文件也复制到android工程的 libs\include
在 android studio 的 moudle 下的defaultConfig节点加入下面代码
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'armeabi'
}
}
第七步 配置androidstudio工程的CMakeLists.txt文件
代码如下
cmake_minimum_required(VERSION 3.4.1)
add_library( native-lib
SHARED
src/main/cpp/native-lib.cpp
)
find_library( log-lib
log )
include_directories(libs/include)
set(DIR ../../../../libs)
MESSAGE("打印")
MESSAGE("路径 " ${DIR})
add_library(avcodec-56
SHARED
IMPORTED)
set_target_properties(avcodec-56
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavcodec-56.so)
add_library(avdevice-56
SHARED
IMPORTED)
set_target_properties(avdevice-56
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavdevice-56.so)
add_library(avformat-56
SHARED
IMPORTED)
set_target_properties(avformat-56
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavformat-56.so)
add_library(avutil-54
SHARED
IMPORTED)
set_target_properties(avutil-54
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavutil-54.so)
add_library(postproc-53
SHARED
IMPORTED)
set_target_properties(postproc-53
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libpostproc-53.so)
add_library(swresample-1
SHARED
IMPORTED)
set_target_properties(swresample-1
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libswresample-1.so)
add_library(swscale-3
SHARED
IMPORTED)
set_target_properties(swscale-3
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libswscale-3.so)
add_library(avfilter-5
SHARED
IMPORTED)
set_target_properties(avfilter-5
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavfilter-5.so)
target_link_libraries( native-lib
avcodec-56
avdevice-56
avformat-56
avutil-54
postproc-53
swresample-1
swscale-3
${log-lib} )
第八步 在java代码中加载.so库
static{
System.loadLibrary("avcodec-56");
System.loadLibrary("avdevice-56");
System.loadLibrary("avfilter-5");
System.loadLibrary("avformat-56");
System.loadLibrary("avutil-54");
System.loadLibrary("postproc-53");
System.loadLibrary("swresample-1");
System.loadLibrary("swscale-3");
System.loadLibrary("native-lib");
}
以上步骤完成就能在android工程里面使用ffmpeg相关的动态库了。