Windows 下編譯Android 使用的精簡(jiǎn)ffmepg so 庫

1锤窑、編譯環(huán)境

windows 7 栓霜、 ndk-r14b淤年、MinGW瘟栖、ffmpeg-3.3.7

????? 編譯的時(shí)候最好用我這個(gè)版本的ffmpeg-3.3.7和ndk-r14b 葵擎,之前編譯時(shí)有遇到各種問題,其中一種就是ffmpeg-3.3.7和ndk不匹配什么的半哟。怎么弄都弄不好酬滤,最后換他們的版本才解決的。如果大家想用最新的寓涨,也可以盯串,不過遇到問題時(shí),可以嘗試換ffmpeg或ndk來解決戒良。MinGW大家自行下載安裝即可体捏,網(wǎng)上有很多教程,這里不再贅述了。

2几缭、修改ffmpeg 配置

??? 解壓下載好的ffmpeg 河泳,找到configure文件,并打開找到

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'

SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

修改為

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'

SLIB_INSTALL_LINKS='$(SLIBNAME)'

3奏司、精簡(jiǎn)腳本編寫

配置修改完之后乔询,就要寫一個(gè)編譯腳本了,在ffmpeg-3.3.7目錄下韵洋,新建一個(gè)ffmpeg_android_build.sh文件。


編譯腳本決定了最終編譯出來的so的大小黄锤,可以將你們需要的功能disable掉搪缨,我這個(gè)腳本最終編譯出來的so 有5.4M。編譯出來的ffmpeg 文件夾中會(huì)有一個(gè)config.log 文件鸵熟,里面也記錄了編譯后支持的功能副编。可以把不需要的再寫入腳本流强,進(jìn)一步精簡(jiǎn)痹届。config.log 文件截圖如下:


4、使用MinGW編譯so庫

??? 安裝好MinGW 后打月,進(jìn)入MinGW 文件夾队腐,找到msys.bat ,運(yùn)行。進(jìn)入ffmpeg-3.3.7目錄


在編譯腳本所在的目錄下奏篙,也就是ffmpeg-3.3.7目錄柴淘,執(zhí)行如下命令:

一般6、7分鐘就能編譯完成秘通。在fmpeg-3.3.7目錄會(huì)生成一個(gè)Android文件夾为严。里面就包含我們需要的so,這個(gè)腳本編譯出來的差不多5.4M,還算比較精簡(jiǎn)的了肺稀。如何應(yīng)用在android 下呢第股。下面我會(huì)講到 cmake編譯FFmpeg。


5.創(chuàng)建NDK項(xiàng)目并引入ffmpeg動(dòng)態(tài)庫

新建這兩個(gè)文件夾话原,把剛編譯出來的so 庫復(fù)制到j(luò)niLibs下夕吻。include 可以不復(fù)制。

配置build.gradle


創(chuàng)建java 類FFmpegCmd




編寫CMakeLists.txt文件

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC

# or SHARED, and provides the relative paths to its source code.

# You can define multiple libraries, and CMake builds them for you.

# Gradle automatically packages shared libraries with your APK.

add_library(# Sets the name of the library.

? ? ? ? ? ? ffmpegrun

? ? ? ? ? ? # Sets the library as a shared library.

? ? ? ? ? ? SHARED

? ? ? ? ? ? # Provides a relative path to your source file(s).

? ? ? ? ? ? ? src/main/cpp/cmdutils.c

src/main/cpp/ffmpeg.c

src/main/cpp/ffmpeg_filter.c

src/main/cpp/ffmpeg_opt.c

src/main/cpp/ffmpeg_cmd_run.c

? ? ? ? ? ? )

add_library(

avcodec

SHARED

IMPORTED

? ? ? ? ? ? )

add_library(

avdevice

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

? ? ? ? ? ? )

if(${ANDROID_ABI} STREQUAL "armeabi-v7a")

set_target_properties(

avcodec

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libavcodec.so

? ? )

set_target_properties(

avdevice

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libavdevice.so

? ? )

set_target_properties(

avfilter

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libavfilter.so

? ? ? ? )

set_target_properties(

avformat

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libavformat.so

? ? ? ? ? ? )

set_target_properties(

avutil

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libavutil.so

? ? ? ? ? ? )

set_target_properties(

swresample

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libswresample.so

? ? ? ? ? ? )

set_target_properties(

swscale

PROPERTIES IMPORTED_LOCATION

${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libswscale.so

? ? ? ? ? ? )

endif(${ANDROID_ABI} STREQUAL "armeabi-v7a")

include_directories(

D:/ffmpeg/ffmpeg-3.3.7/

)

add_definitions("-D__ARM_NEON__=1")

set_property(SOURCE ${SRC_FILE}? APPEND_STRING PROPERTY COMPILE_FLAGS " -mfpu=neon")

# Searches for a specified prebuilt library and stores the path as a

# variable. Because CMake includes system libraries in the search path by

# default, you only need to specify the name of the public NDK library

# you want to add. CMake verifies that the library exists before

# completing its build.

find_library(# Sets the name of the path variable.

? ? ? ? ? ? ? log-lib

? ? ? ? ? ? ? # Specifies the name of the NDK library that

# you want CMake to locate.

? ? ? ? ? ? ? log )

# Specifies libraries CMake should link to your target library. You

# can link multiple libraries, such as libraries you define in this

# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries(# Specifies the target library.

? ? ? ? ? ? ? ? ? ? ? ffmpegrun

avcodec

avdevice

avfilter

avformat

avutil

swresample

swscale

? ? ? ? ? ? ? ? ? ? ? # Links the target library to the log library

# included in the NDK.

? ? ? ? ? ? ? ? ? ? ? ${log-lib} )

注意CMakeLists.txt文件中有這樣一行稿静,要換成你的ffmpeg 的路徑梭冠。


然后我們需要將ffmpeg-3.3.7目錄下的一下幾個(gè)文件復(fù)制到cpp下,ffmpeg_cmd_run 這個(gè)c文件是后面需要我們寫的改备,這里暫時(shí)不管他控漠。


找到cmdutils.c中的exit_program函數(shù),把exit_program函數(shù)修改成:


cmdutils.h中找到exit_program修改為:


在ffmpeg.c末尾加上如下代碼:


創(chuàng)建ffmpeg_cmd_run.c文件


這里是之前創(chuàng)建的java類的包名加方法名

#include "ffmpeg.h"

#include "include/libavcodec/avcodec.h"

#include

JNIEXPORT jint JNICALL

Java_com_multimedia_processing_ffmpeg_ffmpeg_FFmpegCmd_ffmpegRun(JNIEnv *env, jclass clazz,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? jobjectArray commands){

int argc = (*env)->GetArrayLength(env,commands);

? ? char *argv[argc];

? ? int i;

? ? for (i =0; i < argc; i++) {

jstring js = (jstring) (*env)->GetObjectArrayElement(env,commands, i);

? ? ? ? argv[i] = (char *) (*env)->GetStringUTFChars(env,js, 0);

? ? }

return jxRun(argc,argv);

}

至此,所有步驟都已完成? 盐捷,接下來就是使用



cmd? 傳ffmepg de 命令行就行了偶翅。

demo 就不出傳了,需要的可以聯(lián)系我:QQ 603306391

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碉渡,一起剝皮案震驚了整個(gè)濱河市聚谁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滞诺,老刑警劉巖形导,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異习霹,居然都是意外死亡朵耕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門淋叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阎曹,“玉大人,你說我怎么就攤上這事煞檩〈ο樱” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵斟湃,是天一觀的道長(zhǎng)熏迹。 經(jīng)常有香客問我,道長(zhǎng)桐早,這世上最難降的妖魔是什么癣缅? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮哄酝,結(jié)果婚禮上友存,老公的妹妹穿的比我還像新娘。我一直安慰自己陶衅,他們只是感情好屡立,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搀军,像睡著了一般膨俐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罩句,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天焚刺,我揣著相機(jī)與錄音,去河邊找鬼门烂。 笑死乳愉,一個(gè)胖子當(dāng)著我的面吹牛兄淫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔓姚,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼捕虽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了坡脐?” 一聲冷哼從身側(cè)響起泄私,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎备闲,沒想到半個(gè)月后晌端,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浅役,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年斩松,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觉既。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乳幸,靈堂內(nèi)的尸體忽然破棺而出瞪讼,到底是詐尸還是另有隱情,我是刑警寧澤粹断,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布符欠,位于F島的核電站,受9級(jí)特大地震影響瓶埋,放射性物質(zhì)發(fā)生泄漏希柿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一养筒、第九天 我趴在偏房一處隱蔽的房頂上張望曾撤。 院中可真熱鬧,春花似錦晕粪、人聲如沸挤悉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽装悲。三九已至,卻和暖如春尚氛,著一層夾襖步出監(jiān)牢的瞬間诀诊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工阅嘶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留属瓣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奠涌,于是被迫代替她去往敵國(guó)和親宪巨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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