(二)Android FFmpeg集成加使用命令

今天給大家說說如果把編譯好的ffmpeg集成在項目中,編譯是對于Android開發是一大難題。但現在我們迎刃而解了,現在我就開始第二小難題了,咱們先看一個最簡單的案例,把視頻轉為gif

a.gif

下來我就就開始操作,先把你打包好的文件部署到Android stuido項目中,下面是我們需要的文件,如果不知道怎么來的文件,請看上一篇文章就知道了
image.png

下來需要創建一個支持c++的項目
下面我們看看目錄結構下面是操作,記得刪除externalNativeBuild里面make的version版本哪一行,要不然后面操作會有問題,他會控制你的cmake版本
out.gif

下來在app/src/main目錄下面創建jniLibs文件來放置編譯好的so文件(如圖下),下面我們只需要把現在的文件考入進去看下面的操作圖即可


input.gif

這么我們第一步才算完成,下面我們就要把一些ffmpeg文件根目錄下里面的源碼文件拷貝出來放在項目里面,我們需要的文件有

cmdutils.c 、 cmdutils.h 、cmdutils_common_opts.h 、config.h 、ffmpeg.c 、 ffmpeg.h 、ffmpeg_filter.c 、ffmpeg_opt.c

下面是拷貝后的結構圖


image.png

此外我需要創建ffmpeg_cmd.c文件來進行c層和java層的通信放在ffmpeg目錄中(刪除native-lib.cpp文件看個人需求如果習慣寫c++的可以用cpp文件)(如下圖)


image.png

在看CMakeLists文件前我們應該提前配置好build.gradle的文件(如下圖)


image.png

下面我們來一起看看CMakeLists.txt文件,先把CMakeLists里面的注釋刪除

cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
        ffmpeg-cmd

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        ffmpeg_cmd.c
        ffmpeg/cmdutils.c
        ffmpeg/ffmpeg_filter.c
        ffmpeg/ffmpeg_opt.c
        ffmpeg/ffmpeg.c)

find_library(log-lib
        log)

#獲取上級目錄
get_filename_component(PARENT_DIR ${CMAKE_SOURCE_DIR} PATH)

add_library(ffmpeg-single
        SHARED
        IMPORTED)

set_target_properties(ffmpeg-single PROPERTIES IMPORTED_LOCATION ${PARENT_DIR}/jniLibs/${ANDROID_ABI}/libffmpeg.so)

#頭文件
include_directories(include .)

target_link_libraries(ffmpeg-cmd ffmpeg-single ${log-lib})

大概簡述一下意思
cmake_minimum_required是cmake版本號設定
add_library設置庫的名稱里面把填入的點c文件編譯生成動態so名為ffmpeg-cmd
find_library()這個的作用是用來讓我們加一些編譯本地NDK庫的時候所用的到一些依賴庫
set_target_properties()導入第三方so庫
target_link_libraries() 這個的目的是用來關聯我們本地的庫跟第三方的庫.這里就是把ffmpeg-cmd庫、log-lib庫和ffmpeg-single庫關聯起來
下面給大家看一下編譯好的apk分析圖一下就明白了


image.png

既然CmakeLists已經整理好了,下來我們只需要Make Project一下,然后ide會提示一些錯誤,然后會提示你有些引入文件沒有找到然后去對應的文件夾去找相應的文件并拷貝進項目中即可(如圖下)


input.gif

注:有些引入頭文件沒有找到可以直接刪除,不會影響后面的操作

下面我來處理一些代碼上面的細節,我們先把ffmpeg.c文件打開,滑動最下面到最后一個方法前,把方法名改為cmd_exec(如下圖)


image.png

然后再ffmpeg.h文件末尾添加函數申明: int run(int argc, char **argv);(如下圖)


image.png

下來我們需要修改cmdutils.c 和 cmdutils.h這兩個文件,下面我們來看看需要修改什么,先從cmdutils.c 文件開始修改方法exit_program,把void改為int,然后方法里面只返回return ret即可(如下圖)
image.png

下來修改cmdutils.h文件中exit_program方法,返回值修改為int,然后把后面的av_noreturn刪掉(如下圖)


image.png

下來我們看看ffmpeg_cmd.c文件怎么處理,我們需要先創建方法來調用cmd_exec方法,來執行ffmpeg命令,獲取傳入字符串數組的長度,進行遍歷組合然后再執行cmd_exec方法
image.png

下面我們來看看如果調用寫的好的c/c++層代碼,,我們需要創建一個類名為FFmpegCmd的類
image.png

下面我們只需要在MainActivity調用即可,但在這個之前我們需要在AndroidManifest文件中配置相應的讀寫文件權限
image.png

下來我們直接可以看MainActivity代碼,然后執行即可成功(要把對應的文件放入手機中)
image.png

項目地址

后續會寫關于
1、執行過程中進度如何實現
2、如何多次調用命令
3、如何取消正在執行過程中的任務
上面三個功能的文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容