Android 中使用FFMPEG
Android开发中引入FFMPEG需要先打包FFMPEG动态链接库(即.so文件),不清楚怎么编译获取的同学参看:
Android FFMPEG Mac编译教程
接下来说说Android Studio引入FFMPEG动态链接库的详细过程;
1、在Android Studio中新建Android工程
File -> New -> NewProject...
选择Native C++
Choose Native C++.png
选择Android版本,根据自己的开发需求选择即可,这里我选择的默认API26,也就是Android 8.0(Oreo)奥利奥。
Next
命名FFMPEGTest.png
Next
Choose C++ Standard.png
选择C++的版本,可供选择的版本有C++ 11/14/17。这里不清楚各个版本特性的同学直接选择Toolchain Default即可。
点击Finish
到此,我们支持C++的Android Project已经创建成功。第一次创建C++依赖工程的同学会下载一段时间的依赖库,下载时间视网络情况,一般3~10分钟左右。
工程如图:
截屏2020-11-06 下午6.41.48.png
2、Android Project Support C++(Android C++工程)
我们把左上角的目录结构切换到Project,如图:
打开工程目录结构,我们会看到:
截屏2020-11-06 下午6.47.07.png
相比于传统的Android Project而言,Android C++多出了两个文件:
1、.cxx文件夹
2、cpp文件夹
.cxx文件夹中存放的就是我们c编译过程中的临时问价
cpp文件夹中CMakeLists.txt文件中需要我们写入工程中依赖的所有C++库文件。native-lib.cpp中为C++和JAVA互相调用的中继方法。比如创建工程时系统自动生成的example方法:
example.png在java或者kotlin中调用:
image.png
3、FFMPEG库引入Android Project
1.首先,将我们在Android FFMPEG Mac编译教程中编译出来的部分文件移入libs文件夹下。include文件夹全部拷入。在libs文件夹下新家armeabi文件夹,把libavcodec-57.so、libavdevice-57.so、libavfilter-6.so、libavformat-57.so、libavutil-55.so、libpostproc-54.so、libswresample-2、solibswscale-4.so拷贝到armeabi文件夹下,如图:
动态链接库和头文件拷贝之后的文件结构.png2.修改CMakeLists.txt文件
在CMakeLists.txt文件的
cmake_minimum_required(VERSION 3.10.2)
语句后面加入:
include_directories(libs/include)
set(DIR ../../../../libs)
project("ffmpegtest")
add_library(avcodec-57
SHARED
IMPORTED)
set_target_properties(avcodec-57
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavcodec-57.so)
add_library(avdevice-57
SHARED
IMPORTED)
set_target_properties(avdevice-57
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavdevice-57.so)
add_library(avformat-57
SHARED
IMPORTED)
set_target_properties(avformat-57
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavformat-57.so)
add_library(avutil-55
SHARED
IMPORTED)
set_target_properties(avutil-55
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavutil-55.so)
add_library(postproc-54
SHARED
IMPORTED)
set_target_properties(postproc-54
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libpostproc-54.so)
add_library(swresample-2
SHARED
IMPORTED)
set_target_properties(swresample-2
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libswresample-2.so)
add_library(swscale-4
SHARED
IMPORTED)
set_target_properties(swscale-4
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libswscale-4.so)
add_library(avfilter-6
SHARED
IMPORTED)
set_target_properties(avfilter-6
PROPERTIES IMPORTED_LOCATION
${DIR}/armeabi/libavfilter-6.so)
注意:add_library()和set_target_properties()中所引入动态链接库版本号要和/lisb/armeabi文件夹下对应文件的版本一致.例如:libavcodec-57.so如果你的版本号是xx,就改为libavcodec-xx.so即可。
然后把文件结尾的:
target_link_libraries()
语句修改为:
target_link_libraries( # Specifies the target library.
native-lib
avfilter-6
avcodec-57
avdevice-57
avformat-57
avutil-55
postproc-54
swresample-2
swscale-4
# Links the target library to the log library
# included in the NDK.
${log-lib})
保存关闭。
3、修改app build.gradle文件
在defaultConfig中加入:
defaultConfig{
/...
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
ndk {
//选择要添加的对应cpu类型的.so库。
abiFilters 'armeabi-v7a'
// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
}
4、编译
步骤3中所有的文件修改完成之后,一次执行如下操作:
1.Build -> Clean Project
2.Build -> Refresh Linked C++ Projects
3.Build -> Rebuild Project
如图:
截屏2020-11-06 下午7.12.20.png
最后连上Android手机,跑一跑,搞定。
备注
如果在整个过程中出现异常情况,排查错误的顺序为:
1、检查CMakeLists.txt文件代码是否正确添加;
2、检查CMakeLists.txt中的代码对应的.so库版本是否一致;
3、检查CMakeLists.txt中target_link_libraries()是否没有遗漏;
4、检查build.gradle文件中配置是否正确;
5、尝试在Project Structure中更换NDK版本。总之,集体错误具体分析把。实在搞不清楚了留个言,虽然我也不一定啥时候肯得到,哈哈哈。
后续会陆续更新FFMPEG具体功能的使用教程。
祝各位同僚一切顺利!