今天給大家說說如果把編譯好的ffmpeg集成在項目中靡狞,編譯是對于Android開發(fā)是一大難題。但現(xiàn)在我們迎刃而解了隔嫡,現(xiàn)在我就開始第二小難題了,咱們先看一個最簡單的案例甸怕,把視頻轉(zhuǎn)為gif
下來我就就開始操作,先把你打包好的文件部署到Android stuido項目中腮恩,下面是我們需要的文件梢杭,如果不知道怎么來的文件,請看上一篇文章就知道了
下來需要創(chuàng)建一個支持c++的項目
下面我們看看目錄結(jié)構(gòu)下面是操作秸滴,記得刪除externalNativeBuild里面make的version版本哪一行武契,要不然后面操作會有問題,他會控制你的cmake版本
下來在app/src/main目錄下面創(chuàng)建jniLibs文件來放置編譯好的so文件(如圖下)荡含,下面我們只需要把現(xiàn)在的文件考入進去看下面的操作圖即可
這么我們第一步才算完成咒唆,下面我們就要把一些ffmpeg文件根目錄下里面的源碼文件拷貝出來放在項目里面,我們需要的文件有
cmdutils.c 释液、 cmdutils.h 全释、cmdutils_common_opts.h 、config.h 误债、ffmpeg.c 浸船、 ffmpeg.h 妄迁、ffmpeg_filter.c 、ffmpeg_opt.c
下面是拷貝后的結(jié)構(gòu)圖
此外我需要創(chuàng)建ffmpeg_cmd.c文件來進行c層和java層的通信放在ffmpeg目錄中(刪除native-lib.cpp文件看個人需求如果習(xí)慣寫c++的可以用cpp文件)(如下圖)
在看CMakeLists文件前我們應(yīng)該提前配置好build.gradle的文件(如下圖)
下面我們來一起看看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版本號設(shè)定
add_library設(shè)置庫的名稱里面把填入的點c文件編譯生成動態(tài)so名為ffmpeg-cmd
find_library()這個的作用是用來讓我們加一些編譯本地NDK庫的時候所用的到一些依賴庫
set_target_properties()導(dǎo)入第三方so庫
target_link_libraries() 這個的目的是用來關(guān)聯(lián)我們本地的庫跟第三方的庫.這里就是把ffmpeg-cmd庫李命、log-lib庫和ffmpeg-single庫關(guān)聯(lián)起來
下面給大家看一下編譯好的apk分析圖一下就明白了
既然CmakeLists已經(jīng)整理好了登淘,下來我們只需要Make Project一下,然后ide會提示一些錯誤项戴,然后會提示你有些引入文件沒有找到然后去對應(yīng)的文件夾去找相應(yīng)的文件并拷貝進項目中即可(如圖下)
注:有些引入頭文件沒有找到可以直接刪除形帮,不會影響后面的操作
下面我來處理一些代碼上面的細節(jié),我們先把ffmpeg.c文件打開周叮,滑動最下面到最后一個方法前辩撑,把方法名改為cmd_exec(如下圖)
然后再ffmpeg.h文件末尾添加函數(shù)申明: int run(int argc, char **argv);(如下圖)
下來我們需要修改cmdutils.c 和 cmdutils.h這兩個文件,下面我們來看看需要修改什么仿耽,先從cmdutils.c 文件開始修改方法exit_program合冀,把void改為int,然后方法里面只返回return ret即可(如下圖)
下來修改cmdutils.h文件中exit_program方法项贺,返回值修改為int君躺,然后把后面的av_noreturn刪掉(如下圖)
下來我們看看ffmpeg_cmd.c文件怎么處理,我們需要先創(chuàng)建方法來調(diào)用cmd_exec方法开缎,來執(zhí)行ffmpeg命令棕叫,獲取傳入字符串?dāng)?shù)組的長度,進行遍歷組合然后再執(zhí)行cmd_exec方法
下面我們來看看如果調(diào)用寫的好的c/c++層代碼奕删,俺泣,我們需要創(chuàng)建一個類名為FFmpegCmd的類
下面我們只需要在MainActivity調(diào)用即可,但在這個之前我們需要在AndroidManifest文件中配置相應(yīng)的讀寫文件權(quán)限
下來我們直接可以看MainActivity代碼完残,然后執(zhí)行即可成功(要把對應(yīng)的文件放入手機中)
后續(xù)會寫關(guān)于
1伏钠、執(zhí)行過程中進度如何實現(xiàn)
2、如何多次調(diào)用命令
3谨设、如何取消正在執(zhí)行過程中的任務(wù)
上面三個功能的文章