FFmpeg—專案匯入FFmpeg動態庫(二)

weixin_34293059發表於2018-08-29

AndroidStudio匯入FFmpeg動態庫和一般的NDK開發匯入動態庫一樣。首先我們準備好動態庫。
那麼FFmpeg的動態庫哪裡來呢?

可以看看我寫的部落格:NDK開發——Linux編譯FFmpeg這篇部落格會告訴你怎麼編譯動態庫。
當然也有編譯好的現成的so庫,百度網盤:連結:https://pan.baidu.com/s/1AjOJYbh6dfWgOOFzIxM9Kw 密碼:ikr8

1、新建NDK專案

新建NDK專案和建一般的專案差不多,有兩個點需要注意:

  • 新建專案的時候將 include C++ support勾選上。

    1930161-e8b1b755791b3dff.png
    include C++

  • 新增c++的異常處理支援(可選)

    1930161-014c0e200d3b62fb.png
    TIM截圖20180829105535.png

一路點到finish,然後就會構建NDK專案了,第一次構建NDK專案時間有點長,這個時候你可以掏出手機打一把王者農藥。

2、匯入動態庫

匯入動態庫的方式有兩種哦,我這裡只介紹一種。

  • 第一種將動態庫放到jniLibs資料夾中。(不介紹)
  • 將動態庫匯入到libs中
    1930161-6fe69392314da9a5.png
    專案結構

    記住這個資料夾名稱:armeabi-v7a 這個是必須這樣命名的,因為我編譯的就是arm cpu架構的動態庫,用armeabi命名也不行哦,會報如下錯誤:
ABIs [armeabi] are not supported for platform. Supported ABIs are [armeabi-v7a, arm64-v8a, x86, x86_64].

然後需要在app下的build.gradle下新增如下配置:

externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                abiFilters 'armeabi-v7a'
            }
        }

        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }

3、配置CMakeList.txt

將動態庫匯入之後,還需要配置好CMakeList.txt將動態庫連結進去。

cmake_minimum_required(VERSION 3.4.1)

add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp )


find_library( log-lib
              log )

# 宣告一個DIR的變數獲取libs的路徑
set(DIR ../../../../libs)

# 引入標頭檔案
include_directories(libs/include)

# 引入所有的so動態庫
add_library(avcodec-56
            SHARED
            IMPORTED)
set_target_properties(avcodec-56
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi-v7a/libavcodec-56.so)

add_library(avdevice-56
            SHARED
            IMPORTED)
set_target_properties(avdevice-56
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi-v7a/libavdevice-56.so)

add_library(avformat-56
            SHARED
            IMPORTED)
set_target_properties(avformat-56
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi-v7a/libavformat-56.so)

add_library(avutil-54
            SHARED
            IMPORTED)
set_target_properties(avutil-54
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi-v7a/libavutil-54.so)

add_library(postproc-53
            SHARED
            IMPORTED)
set_target_properties(postproc-53
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi-v7a/libpostproc-53.so)


add_library(swresample-1
             SHARED
             IMPORTED)
set_target_properties(swresample-1
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi-v7a/libswresample-1.so)

add_library(swscale-3
              SHARED
              IMPORTED)
set_target_properties(swscale-3
                        PROPERTIES IMPORTED_LOCATION
                        ${DIR}/armeabi-v7a/libswscale-3.so)


add_library(avfilter-5
              SHARED
              IMPORTED)
set_target_properties(avfilter-5
                        PROPERTIES IMPORTED_LOCATION
                        ${DIR}/armeabi-v7a/libavfilter-5.so)


# 連結動態庫

target_link_libraries( native-lib
                      avcodec-56
                      avdevice-56
                      avformat-56
                      avutil-54
                      postproc-53
                      swresample-1
                      swscale-3
                      avfilter-5
                      ${log-lib} )

4、測試編譯是否能通過

在自動生成的MainActivity中載入這些動態庫,然後執行下,看看能不能跑起來吧。不過估計還沒到這一步,上面的幾步點一下Sync Now同步程式碼編譯不通過也是常有的事。

    static {
        System.loadLibrary("avcodec-56");
        System.loadLibrary("avdevice-56");
        System.loadLibrary("avfilter-5");
        System.loadLibrary("avformat-56");
        System.loadLibrary("avutil-54");
        System.loadLibrary("postproc-53");
        System.loadLibrary("swresample-1");
        System.loadLibrary("swscale-3");
        System.loadLibrary("native-lib");
    }

如果編譯執行成功,就可以開始使用FFmpeg提供的api做一些事情啦。

5、需要了解的一些東西

如果要熟練的匯入動態庫到專案中,CMakeList.txt的語法需要了解,還有就是兩種不同的匯入平臺的so庫(比如這裡只匯入了arm下的so庫),匯入平臺庫的不同配置方式。

程式碼在這裡:https://github.com/AxeChen/FFmpegStudy

相關文章