FFmpeg(四):CMake移植FFmpeg的靜態(tài)庫(kù)到AndroidStudio中

前言

本文將介紹如何把FFmpeg(二):Windows下編譯全平臺(tái)架構(gòu)的FFmpeg中編譯出的支持全平臺(tái)的FFmpeg靜態(tài)so庫(kù),采用CMake方式移植到AndroidStudio中者娱,并打印出FFmpeg的信息请敦。

正文

  • 1 相關(guān)文件拷貝

    • 1.1 添加FFmpeg編譯出的靜態(tài)庫(kù)

      FFmpeg(二):Windows下編譯全平臺(tái)架構(gòu)的FFmpeg中我們將FFmpeg編譯生成了各個(gè)平臺(tái)適用的靜態(tài)庫(kù)空执,我們將每個(gè)CPU下的lib路徑下的所有so包提取出來(lái),在Android工程中的libs下建立各個(gè)平臺(tái)對(duì)應(yīng)的文件名稱,并拷貝進(jìn)去嘀韧,如圖所示:

    • 1.2 拷貝頭文件

      FFmpeg(二):Windows下編譯全平臺(tái)架構(gòu)的FFmpeg中android_more下任意平臺(tái)下的include文件夾全部拷貝至項(xiàng)目工程中src/main/cpp中,如圖所示:

    • 1.3 拷貝H264頭文件

      在項(xiàng)目工程src/main/cpp/include下新建文件夾libx264棍矛,并把FFmpeg-3.2.5/libx264/android/任意CPU/include下編譯出的x264.h和x264_config.h拷貝進(jìn)去

  • 2 編寫(xiě)CMakeList.txt鏈接添加共享包

    看不懂第2步驟的請(qǐng)回頭FFmpeg(三):初識(shí)CMakeList和native-lib

    • 2.1 以CMakeList.txt為基準(zhǔn)設(shè)置相對(duì)路徑
      set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../libs)
      
    • 2.2 加載頭文件和設(shè)置源碼路徑
      include_directories(
              # 加載頭文件
               src/main/cpp/include
              #源碼路徑為絕對(duì)路徑安疗,下載后請(qǐng)記得修改你的源碼路徑
               E:/Workspace/OtherDemo/FFmpeg4Android-master/ffmpeg-3.2.5  ) 
      
    • 2.3 add_library添加共享庫(kù)

      我們把libavcodec.so、libavfilter.so够委、libavformat.so荐类、libavutil.so、libfdk-aac.so茁帽、libswresample.so玉罐、libswscale.so這七個(gè)庫(kù)導(dǎo)入添加到共享庫(kù)(這里不關(guān)注CPU架構(gòu)),IMPORTED指2.4中根據(jù)CPU架構(gòu)導(dǎo)入指定的so庫(kù)潘拨。

      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 設(shè)置目標(biāo)版本庫(kù)

      判斷當(dāng)前機(jī)型是哪個(gè)CPU架構(gòu)吊输,就加載libs下對(duì)應(yīng)的so包:

       #判斷目標(biāo)版本并設(shè)置
       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連接共享庫(kù)

      將所有添加進(jìn)來(lái)的共享庫(kù)和NDK中查到到已有的庫(kù)鏈接起來(lái):

       target_link_libraries(
                    native-lib
                    fdk-aac
                    avcodec
                    avfilter
                    avformat
                    avutil
                    swresample
                    swscale
                    ${log-lib}  )      
      
  • 3 相關(guān)代碼編寫(xiě)

    • 3.1新建java文件FFmpegKit,內(nèi)容如下:
    /**
     * Created by MouShao on 2018/2/28.
     */
    public class FFmpegKit {
    static {
      //加載CMakeList中連接的共享庫(kù)
      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編寫(xiě)
    #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標(biāo)準(zhǔn)
              cppFlags "-std=c++11"
          }
          ndk{
              //abi兼容設(shè)置
              abiFilters "armeabi-v7a","armeabi","arm64-v8a","x86","x86_64"
          }
      }
    }
        //導(dǎo)入app/libs下庫(kù)
        sourceSets.main {
        jniLibs.srcDirs = ['libs']
        jni.srcDirs = []
      }
    }
    
  • 3.4 MainActivity調(diào)用
  • 4 運(yùn)行如圖所示:

結(jié)語(yǔ)

到此铁追,F(xiàn)Fmpeg的首秀就完成了季蚂,下一篇我們將如何用JNI動(dòng)態(tài)注冊(cè)的方式調(diào)用FFmpeg播放視頻。

下一節(jié)講:
FFmpeg(五):JNI動(dòng)態(tài)注冊(cè)方法調(diào)用FFmpeg播放視頻

github源碼

簡(jiǎn)書(shū)半停更說(shuō)明

碎碎念:如果諸君喜歡琅束,請(qǐng)點(diǎn)個(gè)贊
更多問(wèn)題扭屁,歡迎加群:584275290
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涩禀,隨后出現(xiàn)的幾起案子料滥,更是在濱河造成了極大的恐慌,老刑警劉巖艾船,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葵腹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屿岂,警方通過(guò)查閱死者的電腦和手機(jī)践宴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爷怀,“玉大人浴井,你說(shuō)我怎么就攤上這事∶鼓欤” “怎么了磺浙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)徒坡。 經(jīng)常有香客問(wèn)我撕氧,道長(zhǎng),這世上最難降的妖魔是什么喇完? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任伦泥,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘不脯。我一直安慰自己府怯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布防楷。 她就那樣靜靜地躺著牺丙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪复局。 梳的紋絲不亂的頭發(fā)上冲簿,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音亿昏,去河邊找鬼峦剔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛角钩,可吹牛的內(nèi)容都是我干的吝沫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼递礼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惨险!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宰衙,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睹欲,沒(méi)想到半個(gè)月后供炼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窘疮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年袋哼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闸衫。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涛贯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔚出,到底是詐尸還是另有隱情弟翘,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布骄酗,位于F島的核電站稀余,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趋翻。R本人自食惡果不足惜睛琳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师骗,春花似錦历等、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至愿待,卻和暖如春浩螺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仍侥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工要出, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人农渊。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓患蹂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砸紊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子传于,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容