DEMO:https://github.com/zhaopingfu/FFmpegDemo
ffmpeg下载地址:https://ffmpeg.org/releases/
创建ffmpeg文件夹
mkdir ffmpeg
cd ffmpeg
下载ffmpeg
wget http://ffmpeg.org/releases/ffmpeg-2.6.9.tar.gz
解压
tar -xzf ffmpeg-2.6.9.tar.gz
给权限
chmod 777 -R ffmpeg-2.6.9
进入ffmpeg-2.6.9里面,创建build_android.sh,在里面写入配置
#!/bin/bash
#注意下面这几个,把路径修改为自己的
export NDK=/usr/ndk/android-ndk-r15b
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
执行build_android.sh
./build_android.sh
发现问题
编译后会在当前路径下生成/android/arm/lib和/android/arm/include
但是在lib中生成的so库文件的名字有点不太对,是libavdevice.so.56
我们想要的是libavdevice-56.so
所以
cd ../../../
解决问题
在ffmpeg里找到configure文件,编辑configure文件
在2779行修改
#把原来的命名规则注掉
#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)'
#zhaopf 修改生成的so库的命名规则
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
这样在当前目录下会生成一个android文件加,里面的lib下有想要的.so库
在AndroidStudio中配置
app下的build.gradle中
defaultConfig {
applicationId "com.pf.ffmpegdemo"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'armeabi'
}
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
#寻找SDK中自带的库
#路径:\SDK\ndk-bundle\platforms\android-23\arch-arm\usr\lib
find_library( log-lib
log )
#设置变量
set(DIR ../../../../libs)
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(avfilter-5
SHARED
IMPORTED)
set_target_properties( avfilter-5
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavfilter-5.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)
#引入include下的头文件
include_directories(libs/include)
#include_directories(src/main/cpp/include)
#引入自己的库
add_library( native-lib
SHARED
src/main/cpp/native-lib.cpp )
#链接的目标库
target_link_libraries( native-lib
avcodec-56
avdevice-56
avfilter-5
avformat-56
avutil-54
postproc-53
swresample-1
swscale-3
${log-lib} )
这样就可以了,编译可以通过