概述
FFmpeg动态库编译
下载NDK和FFmpeg
Android Studio默认下载对NDK版本会出现一些兼容问题,因此我们这里使用ndk-r15c(win64|linux64|mac64)版本。 FFmpeg官网下载源码,我用的是3.2.12
解压文件
首先解压NDK和ffmpeg
tar -zxf ffmpeg-3.2.12.tar.gz
unzip android-ndk-r15c-darwin-x86_64.zip -d android-ndk-r15c
修改FFmpeg配置,适配Android
进入ffmpeg目录,修改configure文件
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)'
编写FFmpeg脚本,生成动态so库
新建build_android.sh脚本
#!/bin/sh
NDK=/Users/xxx/Desktop/soft/android-ndk-r15c
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure
--prefix=$PREFIX
--enable-shared
--disable-static
--disable-doc
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
--disable-ffserver
--disable-avdevice
--disable-doc
--disable-symver
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
--target-os=linux
--arch=arm
--enable-cross-compile
--sysroot=$SYSROOT
--extra-cflags="-Os -fpic $ADDI_CFLAGS"
--extra-ldflags="$ADDI_LDFLAGS"
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
添加执行权限,执行sh脚本
chmod +x build_android.sh
./build_android.sh
整个编译花了10分钟左右(mbp i5配置),编译完成后,可以在android目录看到相关so文件和头文件
将FFmpeg加入到Android项目中
新建Android项目,添加C++支持
打开Android Studio,新建项目FFmpegAudioPlayer,添加C++支持
配置FFmpeg动态库
在src下的main文件中创建jniLibs文件夹,在jniLibs创建armeabi文件夹,将ffmpeg下android/arm/lib/目录下的so文件(libavcodec-57.so/libavfilter-6.so/libavformat-57.so/libavutil-55.so/libswresample-2.so/libswscale-4.so)拷贝至此目录。将android/arm/include 整个目录拷贝至jniLibs下,最终目录如下
修改app/build.gradle文件,添加abiFilters
android {
...
defaultConfig {
...
externalNativeBuild {
ndk{
abiFilters "armeabi"
}
}
}
...
}
打开app目录下的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 )
find_library( android-lib
android )
set(distribution_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
add_library( avutil-55
SHARED
IMPORTED )
set_target_properties( avutil-55
PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/libavutil-55.so)
...
# 同上还要通过add_library,set_target_properties
# 设置swresample-2,avcodec-57,avfilter-6,swscale-4avformat-57
...
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
include_directories(src/main/cpp)
include_directories(src/main/jniLibs/include)
target_link_libraries(native-lib
avutil-55 #工具库
swresample-2 #音频采样数据格式转换
avcodec-57 #编解码
avfilter-6 #滤镜特效处理
swscale-4 #视频像素数据格式转换
avformat-57 #封装格式处理
OpenSLES
${log-lib}
${android-lib})
配置完成后,我们先编译运行一次,如果能顺利成功安装到手机上,正常运行,则说明配置正确。
学习交流群:960994558整理了一些个人觉得比较好的学习书籍、技术教学视频资料共享在里面,有需要的可以自行添加哦!~
最后
以上就是悦耳人生为你收集整理的FFmpeg编程入门|FFmpeg动态库编译与将FFmpeg加入到Android项目中FFmpeg动态库编译将FFmpeg加入到Android项目中的全部内容,希望文章能够帮你解决FFmpeg编程入门|FFmpeg动态库编译与将FFmpeg加入到Android项目中FFmpeg动态库编译将FFmpeg加入到Android项目中所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复