FFmpeg(四):CMake移植FFmpeg的静态库到AndroidStudio中

前言

本文将介绍如何把FFmpeg(二):Windows下编译全平台架构的FFmpeg中编译出的支持全平台的FFmpeg静态so库,采用CMake方式移植到AndroidStudio中,并打印出FFmpeg的信息。

正文

  • 1 相关文件拷贝

    • 1.1 添加FFmpeg编译出的静态库

      FFmpeg(二):Windows下编译全平台架构的FFmpeg中我们将FFmpeg编译生成了各个平台适用的静态库,我们将每个CPU下的lib路径下的所有so包提取出来,在Android工程中的libs下建立各个平台对应的文件名称,并拷贝进去,如图所示:

    • 1.2 拷贝头文件

      FFmpeg(二):Windows下编译全平台架构的FFmpeg中android_more下任意平台下的include文件夹全部拷贝至项目工程中src/main/cpp中,如图所示:

    • 1.3 拷贝H264头文件

      在项目工程src/main/cpp/include下新建文件夹libx264,并把FFmpeg-3.2.5/libx264/android/任意CPU/include下编译出的x264.h和x264_config.h拷贝进去

  • 2 编写CMakeList.txt链接添加共享包

    看不懂第2步骤的请回头FFmpeg(三):初识CMakeList和native-lib

    • 2.1 以CMakeList.txt为基准设置相对路径
      set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../libs)
      
    • 2.2 加载头文件和设置源码路径
      include_directories(
              # 加载头文件
               src/main/cpp/include
              #源码路径为绝对路径,下载后请记得修改你的源码路径
               E:/Workspace/OtherDemo/FFmpeg4Android-master/ffmpeg-3.2.5  ) 
      
    • 2.3 add_library添加共享库

      我们把libavcodec.so、libavfilter.so、libavformat.so、libavutil.so、libfdk-aac.so、libswresample.so、libswscale.so这七个库导入添加到共享库(这里不关注CPU架构),IMPORTED指2.4中根据CPU架构导入指定的so库。

      add_library(
         avcodec
         SHARED
         IMPORTED   )
      add_library(
         avfilter
         SHARED
         IMPORTED  )
      add_library(
         avformat
         SHARED
         IMPORTED  )
      add_library(
         avutil
         SHARED
         IMPORTED  )
      add_library(
         swresample
         SHARED
         IMPORTED  )
      add_library(
         swscale
         SHARED
         IMPORTED  )
      add_library(
         fdk-aac
         SHARED
         IMPORTED  )
      
      • 2.4 设置目标版本库

      判断当前机型是哪个CPU架构,就加载libs下对应的so包:

       #判断目标版本并设置
       if(${ANDROID_ABI} STREQUAL "armeabi")
       set_target_properties(
         avcodec
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi/libavcodec.so
       )
       set_target_properties(
         avfilter
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi/libavfilter.so
       )
       set_target_properties(
         avformat
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi/libavformat.so
         )
      
       set_target_properties(
         avutil
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi/libavutil.so
         )
       set_target_properties(
         swresample
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi/libswresample.so
          )
       set_target_properties(
         swscale
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi/libswscale.so
          )
       set_target_properties(
         fdk-aac
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi/libfdk-aac.so
          )
       endif(${ANDROID_ABI} STREQUAL "armeabi")
      
       if(${ANDROID_ABI} STREQUAL "armeabi-v7a")
      
       set_target_properties(
         avcodec
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi-v7a/libavcodec.so
       )
      
       set_target_properties(
        avfilter
        PROPERTIES IMPORTED_LOCATION
        ../../../../libs/armeabi-v7a/libavfilter.so
        )
      
       set_target_properties(
         avformat
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi-v7a/libavformat.so
         )
      
       set_target_properties(
         avutil
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi-v7a/libavutil.so
         )
      
       set_target_properties(
         swresample
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi-v7a/libswresample.so
          )
      
       set_target_properties(
         swscale
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi-v7a/libswscale.so
          )
      
       set_target_properties(
         fdk-aac
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/armeabi-v7a/libfdk-aac.so
          )
       endif(${ANDROID_ABI} STREQUAL "armeabi-v7a")
      
       if(${ANDROID_ABI} STREQUAL "arm64-v8a")
       set_target_properties(
       avcodec
       PROPERTIES IMPORTED_LOCATION
       ../../../../libs/arm64-v8a/libavcodec.so
        )
      
       set_target_properties(
       avfilter
       PROPERTIES IMPORTED_LOCATION
       ../../../../libs/arm64-v8a/libavfilter.so
        )
      
       set_target_properties(
         avformat
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/arm64-v8a/libavformat.so
         )
      
       set_target_properties(
         avutil
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/arm64-v8a/libavutil.so
         )
      
       set_target_properties(
         swresample
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/arm64-v8a/libswresample.so
          )
      
       set_target_properties(
         swscale
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/arm64-v8a/libswscale.so
          )
      
      
       set_target_properties(
         fdk-aac
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/arm64-v8a/libfdk-aac.so
          )
       endif(${ANDROID_ABI} STREQUAL "arm64-v8a")
      
       if(${ANDROID_ABI} STREQUAL "x86")
       set_target_properties(
        avcodec
        PROPERTIES IMPORTED_LOCATION
        ../../../../libs/x86/libavcodec.so
       )
      
       set_target_properties(
         avfilter
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86/libavfilter.so
       )
      
       set_target_properties(
         avformat
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86/libavformat.so
         )
      
       set_target_properties(
         avutil
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86/libavutil.so
         )
      
       set_target_properties(
         swresample
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86/libswresample.so
          )
      
       set_target_properties(
         swscale
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86/libswscale.so
          )
      
       set_target_properties(
         fdk-aac
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86/libfdk-aac.so
          )
       endif(${ANDROID_ABI} STREQUAL "x86")
      
       if(${ANDROID_ABI} STREQUAL "x86_64")
       set_target_properties(
         avcodec
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86_64/libavcodec.so
       )
      
       set_target_properties(
        avfilter
        PROPERTIES IMPORTED_LOCATION
        ../../../../libs/x86_64/libavfilter.so
       )
      
       set_target_properties(
         avformat
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86_64/libavformat.so
         )
      
       set_target_properties(
         avutil
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86_64/libavutil.so
         )
      
       set_target_properties(
         swresample
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86_64/libswresample.so
          )
      
       set_target_properties(
         swscale
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86_64/libswscale.so
          )
      
       set_target_properties(
         fdk-aac
         PROPERTIES IMPORTED_LOCATION
         ../../../../libs/x86_64/libfdk-aac.so
          )
       endif(${ANDROID_ABI} STREQUAL "x86_64")
      
      • 2.5连接共享库

      将所有添加进来的共享库和NDK中查到到已有的库链接起来:

       target_link_libraries(
                    native-lib
                    fdk-aac
                    avcodec
                    avfilter
                    avformat
                    avutil
                    swresample
                    swscale
                    ${log-lib}  )      
      
  • 3 相关代码编写

    • 3.1新建java文件FFmpegKit,内容如下:
    /**
     * Created by MouShao on 2018/2/28.
     */
    public class FFmpegKit {
    static {
      //加载CMakeList中连接的共享库
      System.loadLibrary("native-lib");
      System.loadLibrary("avutil");
      System.loadLibrary("fdk-aac");
      System.loadLibrary("avcodec");
      System.loadLibrary("avformat");
      System.loadLibrary("swscale");
      System.loadLibrary("swresample");
      System.loadLibrary("avfilter");
      }
      public static native String stringFromFFmpeg();
    }
    
  • 3.2 native-lib.cpp编写
    #include <jni.h>
    #include <string>
    #include <android/log.h>
    
    extern "C" {
    #include "libavcodec/avcodec.h"
    #include "libavfilter/avfilter.h"
    #include "libavformat/avformat.h"
    #include "libavutil/imgutils.h"
    #include "libswresample/swresample.h"
    #include "libswscale/swscale.h"
    #include "libx264/x264.h"
    
    #define  LOG_TAG    "videoplayer"
    #define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
    
    JNIEXPORT jstring JNICALL Java_com_pvirtech_ffmpeg4android_FFmpegKit_stringFromFFmpeg(
      JNIEnv *env,
      jobject /* this */ obj) {
          char info[10000] = {0};
          sprintf(info, "%s\n", avcodec_configuration());
          return env->NewStringUTF(info);
       }
    };
    
  • 3.3 app下build.gradle的配置
      android {
      ···
      defaultConfig {
      ···
      externalNativeBuild {
          cmake {
              //配置C++11标准
              cppFlags "-std=c++11"
          }
          ndk{
              //abi兼容设置
              abiFilters "armeabi-v7a","armeabi","arm64-v8a","x86","x86_64"
          }
      }
    }
        //导入app/libs下库
        sourceSets.main {
        jniLibs.srcDirs = ['libs']
        jni.srcDirs = []
      }
    }
    
  • 3.4 MainActivity调用
  • 4 运行如图所示:

结语

到此,FFmpeg的首秀就完成了,下一篇我们将如何用JNI动态注册的方式调用FFmpeg播放视频。

下一节讲:
FFmpeg(五):JNI动态注册方法调用FFmpeg播放视频

github源码

简书半停更说明

碎碎念:如果诸君喜欢,请点个赞
更多问题,欢迎加群:584275290
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容