Android实战音视频

Android 中使用FFMPEG

2020-11-06  本文已影响0人  五号先生丶

Android开发中引入FFMPEG需要先打包FFMPEG动态链接库(即.so文件),不清楚怎么编译获取的同学参看:
Android FFMPEG Mac编译教程

接下来说说Android Studio引入FFMPEG动态链接库的详细过程;

1、在Android Studio中新建Android工程

File -> New -> NewProject...

Create New Project.png
选择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,如图:

切换目录结构.png
打开工程目录结构,我们会看到:
截屏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文件夹下,如图:
动态链接库和头文件拷贝之后的文件结构.png
2.修改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具体功能的使用教程。

祝各位同僚一切顺利!

上一篇下一篇

猜你喜欢

热点阅读